@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,227 @@
1
+ import { useToast as e } from "../hooks/useToast.js";
2
+ import { formatFileDate as t, formatFileSize as n } from "../utils/index.js";
3
+ import { tWithFallback as r } from "../utils/i18n.js";
4
+ import { ConfirmDialog as i } from "./ConfirmDialog.js";
5
+ import { useDeleteFileVersion as a, useFileVersions as o, useRestoreFileVersion as s, useVersionDownloadUrl as c } from "../hooks/useFileVersions.js";
6
+ import { useState as l } from "react";
7
+ import { AlertCircle as u, CheckCircle2 as d, Clock as f, Download as p, Loader2 as m, RotateCcw as h, Tag as g, Trash2 as _, X as v } from "lucide-react";
8
+ import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
9
+ import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ //#region src/files/components/FileVersionPanel.tsx
11
+ var C = ({ file: C, onClose: w }) => {
12
+ let { t: T } = S(), [E, D] = l(null), [O, k] = l(null), A = e(), { data: j, isLoading: M, error: N } = o(C.id), P = j?.versions || [], F = s(), I = a(), L = c(), R = async (e, t) => {
13
+ k({
14
+ title: `${r(T, "files.version.restoreVersion", "Restore version")} ${t}`,
15
+ description: r(T, "files.version.restoreDescription", "This will create a new version with the restored content."),
16
+ confirmLabel: r(T, "files.version.restore", "Restore"),
17
+ onConfirm: async () => {
18
+ try {
19
+ await F.mutateAsync({
20
+ versionId: e,
21
+ createNewVersion: !0,
22
+ changeMessage: `${r(T, "files.version.restoredFrom", "Restored from version")} ${t}`
23
+ }), A.success(`${r(T, "files.version.versionRestored", "Version {{number}} restored successfully", { number: t })}`);
24
+ } catch {
25
+ A.error(r(T, "files.version.restoreFailed", "Failed to restore version"));
26
+ }
27
+ }
28
+ });
29
+ }, z = async (e, t) => {
30
+ k({
31
+ title: `${r(T, "files.version.deleteVersion", "Delete version")} ${t}`,
32
+ description: r(T, "files.version.deleteDescription", "This action cannot be undone."),
33
+ confirmLabel: r(T, "files.version.deleteVersionBtn", "Delete version"),
34
+ variant: "danger",
35
+ onConfirm: async () => {
36
+ try {
37
+ await I.mutateAsync(e), A.success(`${r(T, "files.version.versionDeleted", "Version {{number}} deleted", { number: t })}`);
38
+ } catch {
39
+ A.error(r(T, "files.version.deleteFailed", "Failed to delete version"));
40
+ }
41
+ }
42
+ });
43
+ }, B = async () => {
44
+ if (!O || O.loading) return;
45
+ let e = O.onConfirm;
46
+ k({
47
+ ...O,
48
+ loading: !0
49
+ }), await e(), k(null);
50
+ }, V = async (e) => {
51
+ try {
52
+ let t = await L.getDownloadUrl(e);
53
+ if (!t) throw Error(r(T, "files.version.downloadUnavailable", "Version download URL is unavailable"));
54
+ window.open(t, "_blank", "noopener,noreferrer");
55
+ } catch (e) {
56
+ A.error(e instanceof Error ? e.message : r(T, "files.version.downloadFailed", "Failed to download version"));
57
+ }
58
+ };
59
+ return /* @__PURE__ */ x("div", {
60
+ className: "fixed inset-0 z-[110] bg-bg-overlay flex items-center justify-center p-4 animate-in fade-in duration-200",
61
+ role: "dialog",
62
+ "aria-modal": "true",
63
+ "aria-label": r(T, "files.version.historyFor", "Version history for {{name}}", { name: C.name }),
64
+ children: [/* @__PURE__ */ x("div", {
65
+ className: "bg-bg-surface rounded-lg shadow-xl max-w-3xl w-full max-h-[90vh] overflow-hidden flex flex-col animate-in zoom-in-95 duration-200",
66
+ children: [
67
+ /* @__PURE__ */ x("div", {
68
+ className: "flex items-center justify-between p-6 border-b border-border-default",
69
+ children: [/* @__PURE__ */ x("div", {
70
+ className: "flex items-center gap-3",
71
+ children: [/* @__PURE__ */ b(f, { className: "size-6 text-text-link" }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("h2", {
72
+ className: "text-lg font-semibold text-text-primary",
73
+ children: r(T, "files.version.versionHistory", "Version History")
74
+ }), /* @__PURE__ */ b("p", {
75
+ className: "text-sm text-text-secondary",
76
+ children: C.name
77
+ })] })]
78
+ }), /* @__PURE__ */ b("button", {
79
+ onClick: w,
80
+ className: "p-2 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
81
+ "aria-label": r(T, "files.version.closeHistory", "Close version history"),
82
+ children: /* @__PURE__ */ b(v, { className: "size-5" })
83
+ })]
84
+ }),
85
+ /* @__PURE__ */ x("div", {
86
+ className: "flex-1 overflow-y-auto p-6",
87
+ children: [
88
+ M && /* @__PURE__ */ b("div", {
89
+ className: "flex items-center justify-center py-12",
90
+ children: /* @__PURE__ */ b(m, { className: "size-8 text-text-link animate-spin" })
91
+ }),
92
+ N && /* @__PURE__ */ b("div", {
93
+ className: "flex items-center justify-center py-12",
94
+ children: /* @__PURE__ */ x("div", {
95
+ className: "text-center",
96
+ children: [/* @__PURE__ */ b(u, { className: "size-12 text-status-error-text mx-auto mb-4" }), /* @__PURE__ */ b("p", {
97
+ className: "text-sm text-text-secondary",
98
+ children: r(T, "files.version.loadFailed", "Failed to load version history")
99
+ })]
100
+ })
101
+ }),
102
+ !M && !N && P.length === 0 && /* @__PURE__ */ b("div", {
103
+ className: "flex items-center justify-center py-12",
104
+ children: /* @__PURE__ */ x("div", {
105
+ className: "text-center",
106
+ children: [/* @__PURE__ */ b(f, { className: "size-12 text-text-tertiary mx-auto mb-4" }), /* @__PURE__ */ b("p", {
107
+ className: "text-sm text-text-secondary",
108
+ children: r(T, "files.version.noHistory", "No version history available")
109
+ })]
110
+ })
111
+ }),
112
+ !M && !N && P.length > 0 && /* @__PURE__ */ b("div", {
113
+ className: "space-y-3",
114
+ children: P.map((e) => /* @__PURE__ */ b("div", {
115
+ className: `p-4 border rounded-lg transition-all duration-200 hover:scale-[1.01] ${e.isCurrentVersion ? "border-action-primary-border bg-bg-accent" : E === e.id ? "border-border-default bg-bg-muted" : "border-border-default hover:border-border-default hover:bg-action-ghost-bg-hover"}`,
116
+ onClick: () => D(e.id),
117
+ children: /* @__PURE__ */ x("div", {
118
+ className: "flex items-start justify-between gap-4",
119
+ children: [/* @__PURE__ */ x("div", {
120
+ className: "flex-1 min-w-0",
121
+ children: [
122
+ /* @__PURE__ */ x("div", {
123
+ className: "flex items-center gap-2 mb-2",
124
+ children: [
125
+ /* @__PURE__ */ x("span", {
126
+ className: "text-sm font-semibold text-text-primary",
127
+ children: [
128
+ r(T, "files.version.version", "Version"),
129
+ " ",
130
+ e.versionNumber
131
+ ]
132
+ }),
133
+ e.isCurrentVersion && /* @__PURE__ */ x("span", {
134
+ className: "inline-flex items-center gap-1 px-2 py-0.5 bg-action-primary-bg text-text-inverse text-xs font-medium rounded",
135
+ children: [/* @__PURE__ */ b(d, { className: "size-3" }), r(T, "files.version.current", "Current")]
136
+ }),
137
+ e.isMajorVersion && /* @__PURE__ */ x("span", {
138
+ className: "inline-flex items-center gap-1 px-2 py-0.5 bg-status-info-bg-subtle text-status-info-text text-xs font-medium rounded",
139
+ children: [/* @__PURE__ */ b(g, { className: "size-3" }), r(T, "files.version.major", "Major")]
140
+ }),
141
+ e.versionLabel && /* @__PURE__ */ b("span", {
142
+ className: "inline-flex items-center px-2 py-0.5 bg-status-success-bg-subtle text-status-success-text text-xs font-medium rounded",
143
+ children: e.versionLabel
144
+ })
145
+ ]
146
+ }),
147
+ e.changeMessage && /* @__PURE__ */ b("p", {
148
+ className: "text-sm text-text-primary mb-2",
149
+ children: e.changeMessage
150
+ }),
151
+ /* @__PURE__ */ x("div", {
152
+ className: "flex items-center gap-4 text-xs text-text-secondary",
153
+ children: [
154
+ /* @__PURE__ */ b("span", { children: n(e.size) }),
155
+ /* @__PURE__ */ b("span", { children: "•" }),
156
+ /* @__PURE__ */ b("span", { children: t(e.createdAt) })
157
+ ]
158
+ })
159
+ ]
160
+ }), /* @__PURE__ */ x("div", {
161
+ className: "flex items-center gap-2",
162
+ children: [/* @__PURE__ */ b("button", {
163
+ onClick: (t) => {
164
+ t.stopPropagation(), V(e.id);
165
+ },
166
+ className: "p-2 text-text-secondary hover:text-text-link hover:bg-bg-accent rounded-lg transition-colors duration-200",
167
+ title: r(T, "files.version.downloadThisVersion", "Download this version"),
168
+ children: /* @__PURE__ */ b(p, { className: "size-4" })
169
+ }), !e.isCurrentVersion && /* @__PURE__ */ x(y, { children: [/* @__PURE__ */ b("button", {
170
+ onClick: (t) => {
171
+ t.stopPropagation(), R(e.id, e.versionNumber);
172
+ },
173
+ disabled: F.isPending,
174
+ className: "p-2 text-text-secondary hover:text-status-success-text hover:bg-status-success-bg-subtle rounded-lg transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed",
175
+ title: r(T, "files.version.restoreThisVersion", "Restore this version"),
176
+ children: F.isPending ? /* @__PURE__ */ b(m, { className: "size-4 animate-spin" }) : /* @__PURE__ */ b(h, { className: "size-4" })
177
+ }), /* @__PURE__ */ b("button", {
178
+ onClick: (t) => {
179
+ t.stopPropagation(), z(e.id, e.versionNumber);
180
+ },
181
+ disabled: I.isPending,
182
+ className: "p-2 text-text-secondary hover:text-status-error-text hover:bg-status-error-bg-subtle rounded-lg transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed",
183
+ title: r(T, "files.version.deleteThisVersion", "Delete this version"),
184
+ children: I.isPending ? /* @__PURE__ */ b(m, { className: "size-4 animate-spin" }) : /* @__PURE__ */ b(_, { className: "size-4" })
185
+ })] })]
186
+ })]
187
+ })
188
+ }, e.id))
189
+ })
190
+ ]
191
+ }),
192
+ /* @__PURE__ */ b("div", {
193
+ className: "p-6 border-t border-border-default bg-bg-muted",
194
+ children: /* @__PURE__ */ x("div", {
195
+ className: "flex items-center justify-between text-sm text-text-secondary",
196
+ children: [/* @__PURE__ */ x("span", { children: [
197
+ j?.total || 0,
198
+ " ",
199
+ j?.total === 1 ? r(T, "files.version.versionSingular", "version") : r(T, "files.version.versions", "versions"),
200
+ " ",
201
+ r(T, "files.version.total", "total")
202
+ ] }), /* @__PURE__ */ b("button", {
203
+ onClick: w,
204
+ className: "px-4 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
205
+ children: r(T, "files.common.actions.close", "Close")
206
+ })]
207
+ })
208
+ })
209
+ ]
210
+ }), O && /* @__PURE__ */ b(i, {
211
+ title: O.title,
212
+ description: O.description,
213
+ confirmLabel: O.confirmLabel,
214
+ cancelLabel: r(T, "files.common.actions.cancel", "Cancel"),
215
+ variant: O.variant,
216
+ loading: O.loading,
217
+ onConfirm: B,
218
+ onCancel: () => {
219
+ O.loading || k(null);
220
+ }
221
+ })]
222
+ });
223
+ };
224
+ //#endregion
225
+ export { C as FileVersionPanel };
226
+
227
+ //# sourceMappingURL=FileVersionPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileVersionPanel.js","names":[],"sources":["../../../src/files/components/FileVersionPanel.tsx"],"sourcesContent":["import { type FC, useState } from \"react\";\nimport {\n Clock,\n Download,\n RotateCcw,\n Trash2,\n X,\n CheckCircle2,\n AlertCircle,\n Loader2,\n Tag,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem } from \"../types\";\nimport { formatFileSize, formatFileDate } from \"../utils\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n useFileVersions,\n useRestoreFileVersion,\n useDeleteFileVersion,\n useVersionDownloadUrl,\n} from \"../hooks/useFileVersions\";\nimport { useToast } from \"../hooks/useToast\";\nimport { ConfirmDialog } from \"./ConfirmDialog\";\n\ninterface FileVersionPanelProps {\n file: FileItem;\n onClose: () => void;\n}\n\nexport const FileVersionPanel: FC<FileVersionPanelProps> = ({\n file,\n onClose,\n}) => {\n const { t } = useI18n();\n const [selectedVersionId, setSelectedVersionId] = useState<string | null>(\n null,\n );\n const [confirmAction, setConfirmAction] = useState<{\n title: string;\n description: string;\n confirmLabel: string;\n variant?: \"danger\" | \"default\";\n onConfirm: () => Promise<void>;\n loading?: boolean;\n } | null>(null);\n const toast = useToast();\n\n // Fetch versions\n const { data: versionsData, isLoading, error } = useFileVersions(file.id);\n const versions = versionsData?.versions || [];\n\n // Mutations\n const restoreMutation = useRestoreFileVersion();\n const deleteMutation = useDeleteFileVersion();\n const versionDownload = useVersionDownloadUrl();\n\n const handleRestore = async (versionId: string, versionNumber: number) => {\n setConfirmAction({\n title: `${tWithFallback(t, \"files.version.restoreVersion\", \"Restore version\")} ${versionNumber}`,\n description: tWithFallback(\n t,\n \"files.version.restoreDescription\",\n \"This will create a new version with the restored content.\",\n ),\n confirmLabel: tWithFallback(t, \"files.version.restore\", \"Restore\"),\n onConfirm: async () => {\n try {\n await restoreMutation.mutateAsync({\n versionId,\n createNewVersion: true,\n changeMessage: `${tWithFallback(t, \"files.version.restoredFrom\", \"Restored from version\")} ${versionNumber}`,\n });\n toast.success(\n `${tWithFallback(t, \"files.version.versionRestored\", \"Version {{number}} restored successfully\", { number: versionNumber })}`,\n );\n } catch {\n toast.error(\n tWithFallback(\n t,\n \"files.version.restoreFailed\",\n \"Failed to restore version\",\n ),\n );\n }\n },\n });\n };\n\n const handleDelete = async (versionId: string, versionNumber: number) => {\n setConfirmAction({\n title: `${tWithFallback(t, \"files.version.deleteVersion\", \"Delete version\")} ${versionNumber}`,\n description: tWithFallback(\n t,\n \"files.version.deleteDescription\",\n \"This action cannot be undone.\",\n ),\n confirmLabel: tWithFallback(\n t,\n \"files.version.deleteVersionBtn\",\n \"Delete version\",\n ),\n variant: \"danger\",\n onConfirm: async () => {\n try {\n await deleteMutation.mutateAsync(versionId);\n toast.success(\n `${tWithFallback(t, \"files.version.versionDeleted\", \"Version {{number}} deleted\", { number: versionNumber })}`,\n );\n } catch {\n toast.error(\n tWithFallback(\n t,\n \"files.version.deleteFailed\",\n \"Failed to delete version\",\n ),\n );\n }\n },\n });\n };\n\n const runConfirmAction = async () => {\n if (!confirmAction || confirmAction.loading) return;\n\n const action = confirmAction.onConfirm;\n setConfirmAction({ ...confirmAction, loading: true });\n await action();\n setConfirmAction(null);\n };\n\n const handleDownload = async (versionId: string) => {\n try {\n const downloadUrl = await versionDownload.getDownloadUrl(versionId);\n\n if (!downloadUrl) {\n throw new Error(\n tWithFallback(\n t,\n \"files.version.downloadUnavailable\",\n \"Version download URL is unavailable\",\n ),\n );\n }\n\n window.open(downloadUrl, \"_blank\", \"noopener,noreferrer\");\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : tWithFallback(\n t,\n \"files.version.downloadFailed\",\n \"Failed to download version\",\n ),\n );\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 z-[110] bg-bg-overlay flex items-center justify-center p-4 animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={tWithFallback(\n t,\n \"files.version.historyFor\",\n \"Version history for {{name}}\",\n { name: file.name },\n )}\n >\n <div className=\"bg-bg-surface rounded-lg shadow-xl max-w-3xl w-full max-h-[90vh] overflow-hidden flex flex-col animate-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-6 border-b border-border-default\">\n <div className=\"flex items-center gap-3\">\n <Clock className=\"size-6 text-text-link\" />\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tWithFallback(\n t,\n \"files.version.versionHistory\",\n \"Version History\",\n )}\n </h2>\n <p className=\"text-sm text-text-secondary\">{file.name}</p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 text-text-tertiary hover:text-text-secondary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n aria-label={tWithFallback(\n t,\n \"files.version.closeHistory\",\n \"Close version history\",\n )}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n {isLoading && (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"size-8 text-text-link animate-spin\" />\n </div>\n )}\n\n {error && (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-center\">\n <AlertCircle className=\"size-12 text-status-error-text mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.version.loadFailed\",\n \"Failed to load version history\",\n )}\n </p>\n </div>\n </div>\n )}\n\n {!isLoading && !error && versions.length === 0 && (\n <div className=\"flex items-center justify-center py-12\">\n <div className=\"text-center\">\n <Clock className=\"size-12 text-text-tertiary mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n \"files.version.noHistory\",\n \"No version history available\",\n )}\n </p>\n </div>\n </div>\n )}\n\n {!isLoading && !error && versions.length > 0 && (\n <div className=\"space-y-3\">\n {versions.map((version: (typeof versions)[number]) => (\n <div\n key={version.id}\n className={`p-4 border rounded-lg transition-all duration-200 hover:scale-[1.01] ${\n version.isCurrentVersion\n ? \"border-action-primary-border bg-bg-accent\"\n : selectedVersionId === version.id\n ? \"border-border-default bg-bg-muted\"\n : \"border-border-default hover:border-border-default hover:bg-action-ghost-bg-hover\"\n }`}\n onClick={() => setSelectedVersionId(version.id)}\n >\n <div className=\"flex items-start justify-between gap-4\">\n {/* Version info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-sm font-semibold text-text-primary\">\n {tWithFallback(t, \"files.version.version\", \"Version\")}{\" \"}\n {version.versionNumber}\n </span>\n\n {version.isCurrentVersion && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-action-primary-bg text-text-inverse text-xs font-medium rounded\">\n <CheckCircle2 className=\"size-3\" />\n {tWithFallback(\n t,\n \"files.version.current\",\n \"Current\",\n )}\n </span>\n )}\n\n {version.isMajorVersion && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 bg-status-info-bg-subtle text-status-info-text text-xs font-medium rounded\">\n <Tag className=\"size-3\" />\n {tWithFallback(t, \"files.version.major\", \"Major\")}\n </span>\n )}\n\n {version.versionLabel && (\n <span className=\"inline-flex items-center px-2 py-0.5 bg-status-success-bg-subtle text-status-success-text text-xs font-medium rounded\">\n {version.versionLabel}\n </span>\n )}\n </div>\n\n {version.changeMessage && (\n <p className=\"text-sm text-text-primary mb-2\">\n {version.changeMessage}\n </p>\n )}\n\n <div className=\"flex items-center gap-4 text-xs text-text-secondary\">\n <span>{formatFileSize(version.size)}</span>\n <span>•</span>\n <span>{formatFileDate(version.createdAt)}</span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDownload(version.id);\n }}\n className=\"p-2 text-text-secondary hover:text-text-link hover:bg-bg-accent rounded-lg transition-colors duration-200\"\n title={tWithFallback(\n t,\n \"files.version.downloadThisVersion\",\n \"Download this version\",\n )}\n >\n <Download className=\"size-4\" />\n </button>\n\n {!version.isCurrentVersion && (\n <>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleRestore(version.id, version.versionNumber);\n }}\n disabled={restoreMutation.isPending}\n className=\"p-2 text-text-secondary hover:text-status-success-text hover:bg-status-success-bg-subtle rounded-lg transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n title={tWithFallback(\n t,\n \"files.version.restoreThisVersion\",\n \"Restore this version\",\n )}\n >\n {restoreMutation.isPending ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <RotateCcw className=\"size-4\" />\n )}\n </button>\n\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleDelete(version.id, version.versionNumber);\n }}\n disabled={deleteMutation.isPending}\n className=\"p-2 text-text-secondary hover:text-status-error-text hover:bg-status-error-bg-subtle rounded-lg transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed\"\n title={tWithFallback(\n t,\n \"files.version.deleteThisVersion\",\n \"Delete this version\",\n )}\n >\n {deleteMutation.isPending ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Trash2 className=\"size-4\" />\n )}\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"p-6 border-t border-border-default bg-bg-muted\">\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>\n {versionsData?.total || 0}{\" \"}\n {versionsData?.total !== 1\n ? tWithFallback(t, \"files.version.versions\", \"versions\")\n : tWithFallback(\n t,\n \"files.version.versionSingular\",\n \"version\",\n )}{\" \"}\n {tWithFallback(t, \"files.version.total\", \"total\")}\n </span>\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.close\", \"Close\")}\n </button>\n </div>\n </div>\n </div>\n\n {confirmAction && (\n <ConfirmDialog\n title={confirmAction.title}\n description={confirmAction.description}\n confirmLabel={confirmAction.confirmLabel}\n cancelLabel={tWithFallback(\n t,\n \"files.common.actions.cancel\",\n \"Cancel\",\n )}\n variant={confirmAction.variant}\n loading={confirmAction.loading}\n onConfirm={runConfirmAction}\n onCancel={() => {\n if (!confirmAction.loading) {\n setConfirmAction(null);\n }\n }}\n />\n )}\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { FC } from 'react';
2
+ import { FolderItem } from '../types';
3
+ import { DragData } from '../hooks/useDragDrop';
4
+ interface FolderCardProps {
5
+ folder: FolderItem;
6
+ isSelected?: boolean;
7
+ isDragging?: boolean;
8
+ isDropTarget?: boolean;
9
+ draggedItem?: DragData | null;
10
+ onSelect?: (folderId: string) => void;
11
+ onOpen?: (folder: FolderItem) => void;
12
+ onShare?: (folder: FolderItem) => void;
13
+ onDelete?: (folder: FolderItem) => void;
14
+ onRestore?: (folder: FolderItem) => void;
15
+ onRename?: (folder: FolderItem) => void;
16
+ onFavorite?: (folder: FolderItem) => void;
17
+ onCopy?: (folder: FolderItem) => void;
18
+ onMove?: (folder: FolderItem) => void;
19
+ onInfo?: (folder: FolderItem) => void;
20
+ onActivity?: (folder: FolderItem) => void;
21
+ onDragStart?: (folder: FolderItem, operation: "move" | "copy") => void;
22
+ onDragEnd?: () => void;
23
+ onDrop?: (folder: FolderItem) => void;
24
+ onContextMenu?: (folder: FolderItem, x: number, y: number) => void;
25
+ }
26
+ interface DraggableFolderCardProps extends Omit<FolderCardProps, "onDragStart" | "onDragEnd" | "onDrop"> {
27
+ onDragStart?: (folder: FolderItem, operation: "move" | "copy") => void;
28
+ onDragEnd?: () => void;
29
+ onDrop?: (folder: FolderItem) => void;
30
+ onContextMenu?: (folder: FolderItem, x: number, y: number) => void;
31
+ }
32
+ export declare const FolderCard: FC<DraggableFolderCardProps>;
33
+ export {};
34
+ //# sourceMappingURL=FolderCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderCard.d.ts","sourceRoot":"","sources":["../../../src/files/components/FolderCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAqB,MAAM,OAAO,CAAC;AAgBnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,UAAU,eAAe;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACvE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAED,UAAU,wBAAyB,SAAQ,IAAI,CAC7C,eAAe,EACf,aAAa,GAAG,WAAW,GAAG,QAAQ,CACvC;IACC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACvE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACpE;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,wBAAwB,CA2WnD,CAAC"}
@@ -0,0 +1,225 @@
1
+ import { useFilesStore as e } from "../store/filesStore.js";
2
+ import { formatFileDate as t } from "../utils/index.js";
3
+ import { tWithFallback as n } from "../utils/i18n.js";
4
+ import { ActionMenu as r } from "./ActionMenu.js";
5
+ import { canDropOnFolder as i, getDragOperation as a } from "../hooks/useDragDrop.js";
6
+ import { useMemo as o, useState as s } from "react";
7
+ import { Activity as ee, ChevronRight as c, Copy as l, Edit as u, Folder as d, FolderInput as f, FolderOpen as te, Info as p, RotateCcw as m, Share2 as h, Star as g, Trash2 as _ } from "lucide-react";
8
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
9
+ import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ //#region src/files/components/FolderCard.tsx
11
+ var x = ({ folder: x, isSelected: S = !1, isDragging: C = !1, isDropTarget: w = !1, draggedItem: T = null, onSelect: E, onOpen: D, onShare: O, onDelete: k, onRestore: A, onRename: j, onFavorite: M, onCopy: N, onMove: P, onInfo: F, onActivity: I, onDragStart: L, onDragEnd: R, onDrop: z, onContextMenu: B }) => {
12
+ let { t: V } = b(), [H, U] = s(!1), [W, G] = s(!1), [ne, K] = s(!1), { toggleFolderSelection: q } = e(), J = i(T, x), Y = w && J, X = () => {
13
+ D && D(x);
14
+ }, Z = (e) => {
15
+ e.stopPropagation(), E ? E(x.id) : q(x.id);
16
+ }, Q = (e, t) => {
17
+ e.stopPropagation(), t(), U(!1);
18
+ }, $ = (e) => {
19
+ e.dataTransfer.effectAllowed = "copyMove", e.dataTransfer.setData("application/x-file-id", x.id), e.dataTransfer.setData("application/x-file-type", "folder");
20
+ let t = a(e);
21
+ e.dataTransfer.setData("application/x-drag-operation", t), L?.(x, t);
22
+ }, re = () => {
23
+ R?.();
24
+ }, ie = (e) => {
25
+ Y && (e.preventDefault(), e.dataTransfer.dropEffect = T?.operation === "copy" ? "copy" : "move");
26
+ }, ae = (e) => {
27
+ Y && e.preventDefault();
28
+ }, oe = () => {}, se = (e) => {
29
+ e.preventDefault(), Y && z?.(x);
30
+ }, ce = (e) => {
31
+ e.preventDefault(), e.stopPropagation(), B?.(x, e.clientX, e.clientY);
32
+ }, le = W ? te : d, ue = o(() => [
33
+ ...O ? [{
34
+ label: n(V, "files.card.share", "Share"),
35
+ icon: /* @__PURE__ */ v(h, { className: "size-4" }),
36
+ onClick: () => O(x)
37
+ }] : [],
38
+ ...N ? [{
39
+ label: n(V, "files.card.makeCopy", "Make a copy"),
40
+ icon: /* @__PURE__ */ v(l, { className: "size-4" }),
41
+ onClick: () => N(x)
42
+ }] : [],
43
+ ...P ? [{
44
+ label: n(V, "files.card.moveTo", "Move to"),
45
+ icon: /* @__PURE__ */ v(f, { className: "size-4" }),
46
+ onClick: () => P(x)
47
+ }] : [],
48
+ ...j ? [{
49
+ label: n(V, "files.card.rename", "Rename"),
50
+ icon: /* @__PURE__ */ v(u, { className: "size-4" }),
51
+ onClick: () => j(x),
52
+ divider: !0
53
+ }] : [],
54
+ ...M ? [{
55
+ label: x.starred ? n(V, "files.card.removeFromStarred", "Remove from starred") : n(V, "files.card.addToStarred", "Add to starred"),
56
+ icon: /* @__PURE__ */ v(g, { className: "size-4" }),
57
+ onClick: () => M(x)
58
+ }] : [],
59
+ ...F ? [{
60
+ label: n(V, "files.card.details", "Details"),
61
+ icon: /* @__PURE__ */ v(p, { className: "size-4" }),
62
+ onClick: () => F(x)
63
+ }] : [],
64
+ ...I ? [{
65
+ label: n(V, "files.card.activity", "Activity"),
66
+ icon: /* @__PURE__ */ v(ee, { className: "size-4" }),
67
+ onClick: () => I(x)
68
+ }] : [],
69
+ ...k ? [{
70
+ label: n(V, "files.card.delete", "Delete"),
71
+ icon: /* @__PURE__ */ v(_, { className: "size-4" }),
72
+ onClick: () => k(x),
73
+ variant: "danger",
74
+ divider: !0
75
+ }] : [],
76
+ ...A ? [{
77
+ label: n(V, "files.card.restore", "Restore"),
78
+ icon: /* @__PURE__ */ v(m, { className: "size-4" }),
79
+ onClick: () => A(x)
80
+ }] : []
81
+ ], [
82
+ x,
83
+ O,
84
+ N,
85
+ P,
86
+ j,
87
+ M,
88
+ F,
89
+ I,
90
+ k,
91
+ A,
92
+ V
93
+ ]);
94
+ return /* @__PURE__ */ y("div", {
95
+ className: `@container group relative cursor-pointer overflow-hidden rounded-card border bg-bg-surface shadow-elevation-1 transition-shadow hover:shadow-elevation-2 focus-within:shadow-elevation-2 ${C ? "opacity-50" : ""} ${Y ? "border-action-primary-bg ring-2 ring-action-primary-bg ring-offset-2" : "border-border-subtle"}`,
96
+ onClick: X,
97
+ onContextMenu: ce,
98
+ onMouseEnter: () => {
99
+ U(!0), G(!0);
100
+ },
101
+ onMouseLeave: () => {
102
+ U(!1), G(!1);
103
+ },
104
+ onFocus: () => {
105
+ U(!0), G(!0);
106
+ },
107
+ onBlur: (e) => {
108
+ e.currentTarget.contains(e.relatedTarget) || (U(!1), G(!1));
109
+ },
110
+ onKeyDown: (e) => {
111
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), X());
112
+ },
113
+ draggable: !!L,
114
+ onDragStart: $,
115
+ onDragEnd: re,
116
+ onDragOver: ie,
117
+ onDragEnter: ae,
118
+ onDragLeave: oe,
119
+ onDrop: se,
120
+ role: "button",
121
+ tabIndex: 0,
122
+ "aria-label": `${n(V, "files.browser.openFolder", "Open folder")} ${x.name}`,
123
+ children: [
124
+ /* @__PURE__ */ v("div", {
125
+ className: `absolute top-2 left-2 z-10 transition-opacity ${S ? "opacity-100" : "opacity-0 group-hover:opacity-100 group-focus-within:opacity-100"}`,
126
+ children: /* @__PURE__ */ v("input", {
127
+ type: "checkbox",
128
+ checked: S,
129
+ onChange: Z,
130
+ className: "size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2",
131
+ "aria-label": `Select ${x.name}`
132
+ })
133
+ }),
134
+ x.starred && /* @__PURE__ */ v("div", {
135
+ className: "absolute top-2 right-2 z-10",
136
+ children: /* @__PURE__ */ v(g, { className: "size-4 fill-status-warning-bg text-status-warning-bg" })
137
+ }),
138
+ /* @__PURE__ */ v("div", {
139
+ className: "aspect-[4/3] bg-bg-sunken flex items-center justify-center",
140
+ children: /* @__PURE__ */ v(le, { className: "size-10 @md:size-14 text-action-primary-bg" })
141
+ }),
142
+ /* @__PURE__ */ y("div", {
143
+ className: "p-3 @md:p-4",
144
+ children: [
145
+ /* @__PURE__ */ y("div", {
146
+ className: "flex items-center justify-between gap-2 mb-1",
147
+ children: [/* @__PURE__ */ v("h3", {
148
+ className: "font-text-md font-weight-medium text-text-primary truncate flex-1",
149
+ children: x.name
150
+ }), /* @__PURE__ */ v(c, { className: "size-4 text-text-muted flex-shrink-0" })]
151
+ }),
152
+ /* @__PURE__ */ y("div", {
153
+ className: "flex items-center gap-2 text-text-secondary font-text-sm",
154
+ children: [
155
+ /* @__PURE__ */ y("span", { children: [
156
+ x.filesCount ?? 0,
157
+ " ",
158
+ (x.filesCount ?? 0) === 1 ? n(V, "files.folder.item", "item") : n(V, "files.browser.items", "items")
159
+ ] }),
160
+ /* @__PURE__ */ v("span", {
161
+ className: "hidden @sm:inline text-border-subtle",
162
+ children: "•"
163
+ }),
164
+ /* @__PURE__ */ v("span", {
165
+ className: "hidden @sm:inline",
166
+ children: t(x.updatedAt)
167
+ })
168
+ ]
169
+ }),
170
+ x.createdBy && /* @__PURE__ */ v("div", {
171
+ className: "hidden @md:flex items-center gap-2 mt-2 text-text-muted font-text-xs",
172
+ children: /* @__PURE__ */ y("div", {
173
+ className: "flex items-center gap-1",
174
+ children: [x.createdBy.avatar && /* @__PURE__ */ v("img", {
175
+ src: x.createdBy.avatar,
176
+ alt: x.createdBy.name,
177
+ className: "size-4 rounded-full"
178
+ }), /* @__PURE__ */ v("span", { children: x.createdBy.name })]
179
+ })
180
+ })
181
+ ]
182
+ }),
183
+ H && /* @__PURE__ */ y("div", {
184
+ className: "absolute bottom-3 right-3 flex items-center gap-1 bg-bg-elevated border border-border-subtle rounded shadow-elevation-2 p-1",
185
+ children: [
186
+ O && /* @__PURE__ */ v("button", {
187
+ onClick: (e) => Q(e, () => O(x)),
188
+ className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
189
+ "aria-label": n(V, "files.card.share", "Share"),
190
+ title: n(V, "files.card.share", "Share"),
191
+ children: /* @__PURE__ */ v(h, { className: "size-4 text-text-primary" })
192
+ }),
193
+ j && /* @__PURE__ */ v("button", {
194
+ onClick: (e) => Q(e, () => j(x)),
195
+ className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
196
+ "aria-label": n(V, "files.card.rename", "Rename"),
197
+ title: n(V, "files.card.rename", "Rename"),
198
+ children: /* @__PURE__ */ v(u, { className: "size-4 text-text-primary" })
199
+ }),
200
+ A && /* @__PURE__ */ v("button", {
201
+ onClick: (e) => Q(e, () => A(x)),
202
+ className: "p-1.5 hover:bg-status-success-bg-subtle rounded transition-colors",
203
+ "aria-label": n(V, "files.card.restore", "Restore"),
204
+ title: n(V, "files.card.restore", "Restore"),
205
+ children: /* @__PURE__ */ v(m, { className: "size-4 text-status-success-text" })
206
+ }),
207
+ /* @__PURE__ */ v("div", {
208
+ onClick: (e) => e.stopPropagation(),
209
+ children: /* @__PURE__ */ v(r, {
210
+ items: ue,
211
+ align: "right",
212
+ triggerClassName: "p-1.5",
213
+ isOpen: ne,
214
+ onToggle: K
215
+ })
216
+ })
217
+ ]
218
+ })
219
+ ]
220
+ });
221
+ };
222
+ //#endregion
223
+ export { x as FolderCard };
224
+
225
+ //# sourceMappingURL=FolderCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderCard.js","names":[],"sources":["../../../src/files/components/FolderCard.tsx"],"sourcesContent":["import { type FC, useState, useMemo } from \"react\";\nimport {\n Folder,\n FolderOpen,\n Share2,\n Trash2,\n Edit,\n ChevronRight,\n Copy,\n FolderInput,\n Info,\n Activity,\n Star,\n RotateCcw,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FolderItem } from \"../types\";\nimport { formatFileDate } from \"../utils\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { getDragOperation, canDropOnFolder } from \"../hooks/useDragDrop\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport type { DragData } from \"../hooks/useDragDrop\";\n\ninterface FolderCardProps {\n folder: FolderItem;\n isSelected?: boolean;\n isDragging?: boolean;\n isDropTarget?: boolean;\n draggedItem?: DragData | null;\n onSelect?: (folderId: string) => void;\n onOpen?: (folder: FolderItem) => void;\n onShare?: (folder: FolderItem) => void;\n onDelete?: (folder: FolderItem) => void;\n onRestore?: (folder: FolderItem) => void;\n onRename?: (folder: FolderItem) => void;\n onFavorite?: (folder: FolderItem) => void;\n onCopy?: (folder: FolderItem) => void;\n onMove?: (folder: FolderItem) => void;\n onInfo?: (folder: FolderItem) => void;\n onActivity?: (folder: FolderItem) => void;\n onDragStart?: (folder: FolderItem, operation: \"move\" | \"copy\") => void;\n onDragEnd?: () => void;\n onDrop?: (folder: FolderItem) => void;\n onContextMenu?: (folder: FolderItem, x: number, y: number) => void;\n}\n\ninterface DraggableFolderCardProps extends Omit<\n FolderCardProps,\n \"onDragStart\" | \"onDragEnd\" | \"onDrop\"\n> {\n onDragStart?: (folder: FolderItem, operation: \"move\" | \"copy\") => void;\n onDragEnd?: () => void;\n onDrop?: (folder: FolderItem) => void;\n onContextMenu?: (folder: FolderItem, x: number, y: number) => void;\n}\n\nexport const FolderCard: FC<DraggableFolderCardProps> = ({\n folder,\n isSelected = false,\n isDragging = false,\n isDropTarget = false,\n draggedItem = null,\n onSelect,\n onOpen,\n onShare,\n onDelete,\n onRestore,\n onRename,\n onFavorite,\n onCopy,\n onMove,\n onInfo,\n onActivity,\n onDragStart,\n onDragEnd,\n onDrop,\n onContextMenu,\n}) => {\n const { t } = useI18n();\n const [showActions, setShowActions] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const { toggleFolderSelection } = useFilesStore();\n\n const canDrop = canDropOnFolder(draggedItem, folder);\n const isValidDropTarget = isDropTarget && canDrop;\n\n const handleClick = () => {\n if (onOpen) {\n onOpen(folder);\n }\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (onSelect) {\n onSelect(folder.id);\n } else {\n toggleFolderSelection(folder.id);\n }\n };\n\n const handleActionClick = (e: React.MouseEvent, action: () => void) => {\n e.stopPropagation();\n action();\n setShowActions(false);\n };\n\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {\n e.dataTransfer.effectAllowed = \"copyMove\";\n e.dataTransfer.setData(\"application/x-file-id\", folder.id);\n e.dataTransfer.setData(\"application/x-file-type\", \"folder\");\n const operation = getDragOperation(e);\n e.dataTransfer.setData(\"application/x-drag-operation\", operation);\n onDragStart?.(folder, operation);\n };\n\n const handleDragEnd = () => {\n onDragEnd?.();\n };\n\n const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {\n if (isValidDropTarget) {\n e.preventDefault();\n e.dataTransfer.dropEffect =\n draggedItem?.operation === \"copy\" ? \"copy\" : \"move\";\n }\n };\n\n const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {\n if (isValidDropTarget) {\n e.preventDefault();\n }\n };\n\n const handleDragLeave = () => {};\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n if (isValidDropTarget) {\n onDrop?.(folder);\n }\n };\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onContextMenu?.(folder, e.clientX, e.clientY);\n };\n\n const FolderIcon = isHovered ? FolderOpen : Folder;\n\n // Memoize menu items to prevent re-renders\n const menuItems = useMemo(\n () => [\n ...(onShare\n ? [\n {\n label: tWithFallback(t, \"files.card.share\", \"Share\"),\n icon: <Share2 className=\"size-4\" />,\n onClick: () => onShare(folder),\n },\n ]\n : []),\n ...(onCopy\n ? [\n {\n label: tWithFallback(t, \"files.card.makeCopy\", \"Make a copy\"),\n icon: <Copy className=\"size-4\" />,\n onClick: () => onCopy(folder),\n },\n ]\n : []),\n ...(onMove\n ? [\n {\n label: tWithFallback(t, \"files.card.moveTo\", \"Move to\"),\n icon: <FolderInput className=\"size-4\" />,\n onClick: () => onMove(folder),\n },\n ]\n : []),\n ...(onRename\n ? [\n {\n label: tWithFallback(t, \"files.card.rename\", \"Rename\"),\n icon: <Edit className=\"size-4\" />,\n onClick: () => onRename(folder),\n divider: true,\n },\n ]\n : []),\n ...(onFavorite\n ? [\n {\n label: folder.starred\n ? tWithFallback(\n t,\n \"files.card.removeFromStarred\",\n \"Remove from starred\",\n )\n : tWithFallback(t, \"files.card.addToStarred\", \"Add to starred\"),\n icon: <Star className=\"size-4\" />,\n onClick: () => onFavorite(folder),\n },\n ]\n : []),\n ...(onInfo\n ? [\n {\n label: tWithFallback(t, \"files.card.details\", \"Details\"),\n icon: <Info className=\"size-4\" />,\n onClick: () => onInfo(folder),\n },\n ]\n : []),\n ...(onActivity\n ? [\n {\n label: tWithFallback(t, \"files.card.activity\", \"Activity\"),\n icon: <Activity className=\"size-4\" />,\n onClick: () => onActivity(folder),\n },\n ]\n : []),\n ...(onDelete\n ? [\n {\n label: tWithFallback(t, \"files.card.delete\", \"Delete\"),\n icon: <Trash2 className=\"size-4\" />,\n onClick: () => onDelete(folder),\n variant: \"danger\" as const,\n divider: true,\n },\n ]\n : []),\n ...(onRestore\n ? [\n {\n label: tWithFallback(t, \"files.card.restore\", \"Restore\"),\n icon: <RotateCcw className=\"size-4\" />,\n onClick: () => onRestore(folder),\n },\n ]\n : []),\n ],\n [\n folder,\n onShare,\n onCopy,\n onMove,\n onRename,\n onFavorite,\n onInfo,\n onActivity,\n onDelete,\n onRestore,\n t,\n ],\n );\n\n return (\n <div\n className={`@container group relative cursor-pointer overflow-hidden rounded-card border bg-bg-surface shadow-elevation-1 transition-shadow hover:shadow-elevation-2 focus-within:shadow-elevation-2 ${isDragging ? \"opacity-50\" : \"\"} ${isValidDropTarget ? \"border-action-primary-bg ring-2 ring-action-primary-bg ring-offset-2\" : \"border-border-subtle\"}`}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n onMouseEnter={() => {\n setShowActions(true);\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setShowActions(false);\n setIsHovered(false);\n }}\n onFocus={() => {\n setShowActions(true);\n setIsHovered(true);\n }}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setShowActions(false);\n setIsHovered(false);\n }\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClick();\n }\n }}\n draggable={Boolean(onDragStart)}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={0}\n aria-label={`${tWithFallback(t, \"files.browser.openFolder\", \"Open folder\")} ${folder.name}`}\n >\n {/* Selection checkbox */}\n <div\n className={`absolute top-2 left-2 z-10 transition-opacity ${\n isSelected\n ? \"opacity-100\"\n : \"opacity-0 group-hover:opacity-100 group-focus-within:opacity-100\"\n }`}\n >\n <input\n type=\"checkbox\"\n checked={isSelected}\n onChange={handleCheckboxChange}\n className=\"size-4 rounded border-border-default bg-bg-surface text-action-primary-bg focus:ring-2 focus:ring-action-primary-bg focus:ring-offset-2\"\n aria-label={`Select ${folder.name}`}\n />\n </div>\n\n {/* Favorite indicator */}\n {folder.starred && (\n <div className=\"absolute top-2 right-2 z-10\">\n <Star className=\"size-4 fill-status-warning-bg text-status-warning-bg\" />\n </div>\n )}\n\n {/* Folder icon section */}\n <div className=\"aspect-[4/3] bg-bg-sunken flex items-center justify-center\">\n <FolderIcon className=\"size-10 @md:size-14 text-action-primary-bg\" />\n </div>\n\n {/* Folder info */}\n <div className=\"p-3 @md:p-4\">\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <h3 className=\"font-text-md font-weight-medium text-text-primary truncate flex-1\">\n {folder.name}\n </h3>\n <ChevronRight className=\"size-4 text-text-muted flex-shrink-0\" />\n </div>\n\n <div className=\"flex items-center gap-2 text-text-secondary font-text-sm\">\n <span>\n {folder.filesCount ?? 0}{\" \"}\n {(folder.filesCount ?? 0) === 1\n ? tWithFallback(t, \"files.folder.item\", \"item\")\n : tWithFallback(t, \"files.browser.items\", \"items\")}\n </span>\n <span className=\"hidden @sm:inline text-border-subtle\">•</span>\n <span className=\"hidden @sm:inline\">\n {formatFileDate(folder.updatedAt)}\n </span>\n </div>\n\n {/* Extended metadata on larger containers */}\n {folder.createdBy && (\n <div className=\"hidden @md:flex items-center gap-2 mt-2 text-text-muted font-text-xs\">\n <div className=\"flex items-center gap-1\">\n {folder.createdBy.avatar && (\n <img\n src={folder.createdBy.avatar}\n alt={folder.createdBy.name}\n className=\"size-4 rounded-full\"\n />\n )}\n <span>{folder.createdBy.name}</span>\n </div>\n </div>\n )}\n </div>\n\n {/* Action buttons (on hover) with dropdown menu */}\n {showActions && (\n <div className=\"absolute bottom-3 right-3 flex items-center gap-1 bg-bg-elevated border border-border-subtle rounded shadow-elevation-2 p-1\">\n {onShare && (\n <button\n onClick={(e) => handleActionClick(e, () => onShare(folder))}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(t, \"files.card.share\", \"Share\")}\n title={tWithFallback(t, \"files.card.share\", \"Share\")}\n >\n <Share2 className=\"size-4 text-text-primary\" />\n </button>\n )}\n\n {onRename && (\n <button\n onClick={(e) => handleActionClick(e, () => onRename(folder))}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(t, \"files.card.rename\", \"Rename\")}\n title={tWithFallback(t, \"files.card.rename\", \"Rename\")}\n >\n <Edit className=\"size-4 text-text-primary\" />\n </button>\n )}\n\n {onRestore && (\n <button\n onClick={(e) => handleActionClick(e, () => onRestore(folder))}\n className=\"p-1.5 hover:bg-status-success-bg-subtle rounded transition-colors\"\n aria-label={tWithFallback(t, \"files.card.restore\", \"Restore\")}\n title={tWithFallback(t, \"files.card.restore\", \"Restore\")}\n >\n <RotateCcw className=\"size-4 text-status-success-text\" />\n </button>\n )}\n\n {/* More options dropdown */}\n <div onClick={(e) => e.stopPropagation()}>\n <ActionMenu\n items={menuItems}\n align=\"right\"\n triggerClassName=\"p-1.5\"\n isOpen={menuOpen}\n onToggle={setMenuOpen}\n />\n </div>\n </div>\n )}\n </div>\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 MoveDialogProps {
4
+ item: FileItem | FolderItem;
5
+ type: "file" | "folder";
6
+ onClose: () => void;
7
+ onMove: (destinationFolderId: string | null) => Promise<void>;
8
+ isLoading?: boolean;
9
+ }
10
+ export declare const MoveDialog: FC<MoveDialogProps>;
11
+ export {};
12
+ //# sourceMappingURL=MoveDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoveDialog.d.ts","sourceRoot":"","sources":["../../../src/files/components/MoveDialog.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,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAiO1C,CAAC"}