@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,235 @@
1
+ import { useFilesStore as e } from "../store/filesStore.js";
2
+ import { formatFileDate as t, formatFileSize as n, getFileIcon as r } from "../utils/index.js";
3
+ import { tWithFallback as i } from "../utils/i18n.js";
4
+ import { ActionMenu as a } from "./ActionMenu.js";
5
+ import { getDragOperation as o } from "../hooks/useDragDrop.js";
6
+ import { useMemo as s, useState as c } from "react";
7
+ import { Activity as l, Copy as u, Download as d, Edit as f, FolderInput as p, Info as m, RotateCcw as h, Share2 as g, Star as _, Trash2 as v } from "lucide-react";
8
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
9
+ import { useI18n as x } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
+ //#region src/files/components/FileListItem.tsx
11
+ var S = ({ file: S, isSelected: C = !1, isDragging: w = !1, onSelect: T, onPreview: E, onShare: D, onDelete: O, onRestore: k, onFavorite: A, onRename: j, onDownload: M, onCopy: N, onMove: P, onInfo: F, onActivity: I, onDragStart: L, onDragEnd: R, onContextMenu: z }) => {
12
+ let { t: B } = x(), [V, H] = c(!1), { toggleFileSelection: U } = e(), W = () => {
13
+ E && E(S);
14
+ }, G = (e) => {
15
+ e.stopPropagation(), T ? T(S.id) : U(S.id);
16
+ }, K = (e, t) => {
17
+ e.stopPropagation(), t();
18
+ }, q = (e) => {
19
+ e.dataTransfer.effectAllowed = "copyMove", e.dataTransfer.setData("application/x-file-id", S.id), e.dataTransfer.setData("application/x-file-type", "file");
20
+ let t = o(e);
21
+ e.dataTransfer.setData("application/x-drag-operation", t), L?.(S, t);
22
+ }, J = () => {
23
+ R?.();
24
+ }, Y = (e) => {
25
+ e.preventDefault(), e.stopPropagation(), z?.(S, e.clientX, e.clientY);
26
+ }, X = r(S.mimeType), Z = s(() => [
27
+ ...D ? [{
28
+ label: i(B, "files.card.share", "Share"),
29
+ icon: /* @__PURE__ */ y(g, { className: "size-4" }),
30
+ onClick: () => D(S)
31
+ }] : [],
32
+ ...M ? [{
33
+ label: i(B, "files.card.download", "Download"),
34
+ icon: /* @__PURE__ */ y(d, { className: "size-4" }),
35
+ onClick: () => M(S)
36
+ }] : [],
37
+ ...N ? [{
38
+ label: i(B, "files.card.makeCopy", "Make a copy"),
39
+ icon: /* @__PURE__ */ y(u, { className: "size-4" }),
40
+ onClick: () => N(S)
41
+ }] : [],
42
+ ...P ? [{
43
+ label: i(B, "files.card.moveTo", "Move to"),
44
+ icon: /* @__PURE__ */ y(p, { className: "size-4" }),
45
+ onClick: () => P(S)
46
+ }] : [],
47
+ ...j ? [{
48
+ label: i(B, "files.card.rename", "Rename"),
49
+ icon: /* @__PURE__ */ y(f, { className: "size-4" }),
50
+ onClick: () => j(S),
51
+ divider: !0
52
+ }] : [],
53
+ ...A ? [{
54
+ label: S.starred ? i(B, "files.card.removeFromStarred", "Remove from starred") : i(B, "files.card.addToStarred", "Add to starred"),
55
+ icon: /* @__PURE__ */ y(_, { className: "size-4" }),
56
+ onClick: () => A(S)
57
+ }] : [],
58
+ ...F ? [{
59
+ label: i(B, "files.card.details", "Details"),
60
+ icon: /* @__PURE__ */ y(m, { className: "size-4" }),
61
+ onClick: () => F(S)
62
+ }] : [],
63
+ ...I ? [{
64
+ label: i(B, "files.card.activity", "Activity"),
65
+ icon: /* @__PURE__ */ y(l, { className: "size-4" }),
66
+ onClick: () => I(S)
67
+ }] : [],
68
+ ...O ? [{
69
+ label: i(B, "files.card.delete", "Delete"),
70
+ icon: /* @__PURE__ */ y(v, { className: "size-4" }),
71
+ onClick: () => O(S),
72
+ variant: "danger",
73
+ divider: !0
74
+ }] : [],
75
+ ...k ? [{
76
+ label: i(B, "files.card.restore", "Restore"),
77
+ icon: /* @__PURE__ */ y(h, { className: "size-4" }),
78
+ onClick: () => k(S)
79
+ }] : []
80
+ ], [
81
+ S,
82
+ D,
83
+ M,
84
+ N,
85
+ P,
86
+ j,
87
+ A,
88
+ F,
89
+ I,
90
+ O,
91
+ k,
92
+ B
93
+ ]);
94
+ return /* @__PURE__ */ b("div", {
95
+ className: `@container group flex items-center gap-3 border-b border-border-subtle bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${w ? "opacity-50" : ""}`,
96
+ onClick: W,
97
+ onContextMenu: Y,
98
+ onKeyDown: (e) => {
99
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), W());
100
+ },
101
+ draggable: !!L,
102
+ onDragStart: q,
103
+ onDragEnd: J,
104
+ role: "button",
105
+ tabIndex: 0,
106
+ "aria-label": `Preview ${S.name}`,
107
+ children: [
108
+ /* @__PURE__ */ y("div", {
109
+ className: "flex-shrink-0",
110
+ children: /* @__PURE__ */ y("input", {
111
+ type: "checkbox",
112
+ checked: C,
113
+ onChange: G,
114
+ 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",
115
+ "aria-label": `Select ${S.name}`
116
+ })
117
+ }),
118
+ /* @__PURE__ */ y("div", {
119
+ className: "flex-shrink-0",
120
+ children: S.thumbnailUrl ? /* @__PURE__ */ y("img", {
121
+ src: S.thumbnailUrl,
122
+ alt: S.name,
123
+ className: "size-8 object-cover rounded"
124
+ }) : /* @__PURE__ */ y(X, { className: "size-6 text-text-muted" })
125
+ }),
126
+ /* @__PURE__ */ b("div", {
127
+ className: "flex-1 min-w-0",
128
+ children: [/* @__PURE__ */ b("div", {
129
+ className: "flex items-center gap-2",
130
+ children: [
131
+ /* @__PURE__ */ y("span", {
132
+ className: "font-text-md font-weight-medium text-text-primary truncate",
133
+ children: S.name
134
+ }),
135
+ S.starred && /* @__PURE__ */ y(_, { className: "size-3 flex-shrink-0 fill-status-warning-bg text-status-warning-bg" }),
136
+ S.isShared && /* @__PURE__ */ y(g, { className: "size-3 flex-shrink-0 text-text-muted" })
137
+ ]
138
+ }), S.tags && S.tags.length > 0 && /* @__PURE__ */ b("div", {
139
+ className: "hidden @md:flex flex-wrap gap-1 mt-1",
140
+ children: [S.tags.slice(0, 3).map((e) => /* @__PURE__ */ y("span", {
141
+ className: "px-1.5 py-0.5 bg-bg-accent text-text-primary font-text-xs rounded-sm",
142
+ children: e
143
+ }, e)), S.tags.length > 3 && /* @__PURE__ */ b("span", {
144
+ className: "text-text-muted font-text-xs",
145
+ children: ["+", S.tags.length - 3]
146
+ })]
147
+ })]
148
+ }),
149
+ S.createdBy && /* @__PURE__ */ b("div", {
150
+ className: "hidden @lg:flex items-center gap-2 flex-shrink-0 w-40",
151
+ children: [S.createdBy.avatar && /* @__PURE__ */ y("img", {
152
+ src: S.createdBy.avatar,
153
+ alt: S.createdBy.name,
154
+ className: "size-6 rounded-full"
155
+ }), /* @__PURE__ */ y("span", {
156
+ className: "font-text-sm text-text-secondary truncate",
157
+ children: S.createdBy.name
158
+ })]
159
+ }),
160
+ /* @__PURE__ */ y("div", {
161
+ className: "hidden @md:block flex-shrink-0 w-24 text-right",
162
+ children: /* @__PURE__ */ y("span", {
163
+ className: "font-text-sm text-text-secondary",
164
+ children: n(S.size)
165
+ })
166
+ }),
167
+ /* @__PURE__ */ y("div", {
168
+ className: "hidden @lg:block flex-shrink-0 w-32 text-right",
169
+ children: /* @__PURE__ */ y("span", {
170
+ className: "font-text-sm text-text-secondary",
171
+ children: t(S.updatedAt)
172
+ })
173
+ }),
174
+ /* @__PURE__ */ b("div", {
175
+ className: "flex items-center gap-1",
176
+ children: [/* @__PURE__ */ b("div", {
177
+ className: "flex items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",
178
+ children: [
179
+ S.canRead && M && /* @__PURE__ */ y("button", {
180
+ onClick: (e) => K(e, () => M(S)),
181
+ className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
182
+ "aria-label": i(B, "files.card.download", "Download"),
183
+ title: i(B, "files.card.download", "Download"),
184
+ children: /* @__PURE__ */ y(d, { className: "size-4 text-text-primary" })
185
+ }),
186
+ D && /* @__PURE__ */ y("button", {
187
+ onClick: (e) => K(e, () => D(S)),
188
+ className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
189
+ "aria-label": i(B, "files.card.share", "Share"),
190
+ title: i(B, "files.card.share", "Share"),
191
+ children: /* @__PURE__ */ y(g, { className: "size-4 text-text-primary" })
192
+ }),
193
+ A && /* @__PURE__ */ y("button", {
194
+ onClick: (e) => K(e, () => A(S)),
195
+ className: "p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
196
+ "aria-label": S.starred ? i(B, "files.card.unfavorite", "Unfavorite") : i(B, "files.card.favorite", "Favorite"),
197
+ title: S.starred ? i(B, "files.card.unfavorite", "Unfavorite") : i(B, "files.card.favorite", "Favorite"),
198
+ children: /* @__PURE__ */ y(_, { className: `size-4 ${S.starred ? "fill-status-warning-bg text-status-warning-bg" : "text-text-primary"}` })
199
+ }),
200
+ k && /* @__PURE__ */ y("button", {
201
+ onClick: (e) => K(e, () => k(S)),
202
+ className: "p-1.5 hover:bg-status-success-bg-subtle rounded transition-colors",
203
+ "aria-label": i(B, "files.card.restore", "Restore"),
204
+ title: i(B, "files.card.restore", "Restore"),
205
+ children: /* @__PURE__ */ y(h, { className: "size-4 text-status-success-text" })
206
+ }),
207
+ S.canWrite && j && /* @__PURE__ */ y("button", {
208
+ onClick: (e) => K(e, () => j(S)),
209
+ className: "hidden @md:block p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors",
210
+ "aria-label": i(B, "files.card.rename", "Rename"),
211
+ title: i(B, "files.card.rename", "Rename"),
212
+ children: /* @__PURE__ */ y(f, { className: "size-4 text-text-primary" })
213
+ }),
214
+ S.canDelete && O && /* @__PURE__ */ y("button", {
215
+ onClick: (e) => K(e, () => O(S)),
216
+ className: "p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors",
217
+ "aria-label": i(B, "files.card.delete", "Delete"),
218
+ title: i(B, "files.card.delete", "Delete"),
219
+ children: /* @__PURE__ */ y(v, { className: "size-4 text-status-error-text" })
220
+ })
221
+ ]
222
+ }), /* @__PURE__ */ y(a, {
223
+ items: Z,
224
+ align: "right",
225
+ isOpen: V,
226
+ onToggle: H
227
+ })]
228
+ })
229
+ ]
230
+ });
231
+ };
232
+ //#endregion
233
+ export { S as FileListItem };
234
+
235
+ //# sourceMappingURL=FileListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileListItem.js","names":[],"sources":["../../../src/files/components/FileListItem.tsx"],"sourcesContent":["import { type FC, useMemo, useState } from \"react\";\nimport {\n Download,\n Share2,\n Trash2,\n Star,\n RotateCcw,\n Edit,\n Copy,\n FolderInput,\n Info,\n Activity,\n} from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem } from \"../types\";\nimport { formatFileSize, formatFileDate, getFileIcon } from \"../utils\";\nimport { useFilesStore } from \"../store/filesStore\";\nimport { ActionMenu } from \"./ActionMenu\";\nimport { getDragOperation } from \"../hooks/useDragDrop\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface FileListItemProps {\n file: FileItem;\n isSelected?: boolean;\n isDragging?: boolean;\n onSelect?: (fileId: string) => void;\n onPreview?: (file: FileItem) => void;\n onShare?: (file: FileItem) => void;\n onDelete?: (file: FileItem) => void;\n onRestore?: (file: FileItem) => void;\n onFavorite?: (file: FileItem) => void;\n onRename?: (file: FileItem) => void;\n onDownload?: (file: FileItem) => void;\n onCopy?: (file: FileItem) => void;\n onMove?: (file: FileItem) => void;\n onInfo?: (file: FileItem) => void;\n onActivity?: (file: FileItem) => void;\n onDragStart?: (file: FileItem, operation: \"move\" | \"copy\") => void;\n onDragEnd?: () => void;\n onContextMenu?: (file: FileItem, x: number, y: number) => void;\n}\n\ninterface DraggableFileListItemProps extends Omit<\n FileListItemProps,\n \"onDragStart\" | \"onDragEnd\"\n> {\n onDragStart?: (file: FileItem, operation: \"move\" | \"copy\") => void;\n onDragEnd?: () => void;\n}\n\ninterface FileListItemProps {\n file: FileItem;\n isSelected?: boolean;\n onSelect?: (fileId: string) => void;\n onPreview?: (file: FileItem) => void;\n onShare?: (file: FileItem) => void;\n onDelete?: (file: FileItem) => void;\n onRestore?: (file: FileItem) => void;\n onFavorite?: (file: FileItem) => void;\n onRename?: (file: FileItem) => void;\n onDownload?: (file: FileItem) => void;\n onCopy?: (file: FileItem) => void;\n onMove?: (file: FileItem) => void;\n onInfo?: (file: FileItem) => void;\n onActivity?: (file: FileItem) => void;\n onContextMenu?: (file: FileItem, x: number, y: number) => void;\n}\n\nexport const FileListItem: FC<DraggableFileListItemProps> = ({\n file,\n isSelected = false,\n isDragging = false,\n onSelect,\n onPreview,\n onShare,\n onDelete,\n onRestore,\n onFavorite,\n onRename,\n onDownload,\n onCopy,\n onMove,\n onInfo,\n onActivity,\n onDragStart,\n onDragEnd,\n onContextMenu,\n}) => {\n const { t } = useI18n();\n const [menuOpen, setMenuOpen] = useState(false);\n const { toggleFileSelection } = useFilesStore();\n\n const handleClick = () => {\n if (onPreview) {\n onPreview(file);\n }\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (onSelect) {\n onSelect(file.id);\n } else {\n toggleFileSelection(file.id);\n }\n };\n\n const handleActionClick = (e: React.MouseEvent, action: () => void) => {\n e.stopPropagation();\n action();\n };\n\n const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {\n e.dataTransfer.effectAllowed = \"copyMove\";\n e.dataTransfer.setData(\"application/x-file-id\", file.id);\n e.dataTransfer.setData(\"application/x-file-type\", \"file\");\n const operation = getDragOperation(e);\n e.dataTransfer.setData(\"application/x-drag-operation\", operation);\n onDragStart?.(file, operation);\n };\n\n const handleDragEnd = () => {\n onDragEnd?.();\n };\n\n const handleContextMenu = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onContextMenu?.(file, e.clientX, e.clientY);\n };\n\n const FileIconComponent = getFileIcon(file.mimeType);\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(file),\n },\n ]\n : []),\n ...(onDownload\n ? [\n {\n label: tWithFallback(t, \"files.card.download\", \"Download\"),\n icon: <Download className=\"size-4\" />,\n onClick: () => onDownload(file),\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(file),\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(file),\n },\n ]\n : []),\n ...(onRename\n ? [\n {\n label: tWithFallback(t, \"files.card.rename\", \"Rename\"),\n icon: <Edit className=\"size-4\" />,\n onClick: () => onRename(file),\n divider: true,\n },\n ]\n : []),\n ...(onFavorite\n ? [\n {\n label: file.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(file),\n },\n ]\n : []),\n ...(onInfo\n ? [\n {\n label: tWithFallback(t, \"files.card.details\", \"Details\"),\n icon: <Info className=\"size-4\" />,\n onClick: () => onInfo(file),\n },\n ]\n : []),\n ...(onActivity\n ? [\n {\n label: tWithFallback(t, \"files.card.activity\", \"Activity\"),\n icon: <Activity className=\"size-4\" />,\n onClick: () => onActivity(file),\n },\n ]\n : []),\n ...(onDelete\n ? [\n {\n label: tWithFallback(t, \"files.card.delete\", \"Delete\"),\n icon: <Trash2 className=\"size-4\" />,\n onClick: () => onDelete(file),\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(file),\n },\n ]\n : []),\n ],\n [\n file,\n onShare,\n onDownload,\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 flex items-center gap-3 border-b border-border-subtle bg-bg-surface p-3 transition-colors hover:bg-bg-sunken focus-within:bg-bg-sunken ${isDragging ? \"opacity-50\" : \"\"}`}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\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 role=\"button\"\n tabIndex={0}\n aria-label={`Preview ${file.name}`}\n >\n {/* Selection checkbox */}\n <div className=\"flex-shrink-0\">\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 ${file.name}`}\n />\n </div>\n\n {/* File icon */}\n <div className=\"flex-shrink-0\">\n {file.thumbnailUrl ? (\n <img\n src={file.thumbnailUrl}\n alt={file.name}\n className=\"size-8 object-cover rounded\"\n />\n ) : (\n <FileIconComponent className=\"size-6 text-text-muted\" />\n )}\n </div>\n\n {/* File name - takes remaining space */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-text-md font-weight-medium text-text-primary truncate\">\n {file.name}\n </span>\n {file.starred && (\n <Star className=\"size-3 flex-shrink-0 fill-status-warning-bg text-status-warning-bg\" />\n )}\n {file.isShared && (\n <Share2 className=\"size-3 flex-shrink-0 text-text-muted\" />\n )}\n </div>\n\n {/* Tags - visible on medium+ containers */}\n {file.tags && file.tags.length > 0 && (\n <div className=\"hidden @md:flex flex-wrap gap-1 mt-1\">\n {file.tags.slice(0, 3).map((tag) => (\n <span\n key={tag}\n className=\"px-1.5 py-0.5 bg-bg-accent text-text-primary font-text-xs rounded-sm\"\n >\n {tag}\n </span>\n ))}\n {file.tags.length > 3 && (\n <span className=\"text-text-muted font-text-xs\">\n +{file.tags.length - 3}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Owner - visible on large+ containers */}\n {file.createdBy && (\n <div className=\"hidden @lg:flex items-center gap-2 flex-shrink-0 w-40\">\n {file.createdBy.avatar && (\n <img\n src={file.createdBy.avatar}\n alt={file.createdBy.name}\n className=\"size-6 rounded-full\"\n />\n )}\n <span className=\"font-text-sm text-text-secondary truncate\">\n {file.createdBy.name}\n </span>\n </div>\n )}\n\n {/* Size - visible on medium+ containers */}\n <div className=\"hidden @md:block flex-shrink-0 w-24 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {formatFileSize(file.size)}\n </span>\n </div>\n\n {/* Modified date - visible on large+ containers */}\n <div className=\"hidden @lg:block flex-shrink-0 w-32 text-right\">\n <span className=\"font-text-sm text-text-secondary\">\n {formatFileDate(file.updatedAt)}\n </span>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\">\n <div className=\"flex items-center gap-1 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n {file.canRead && onDownload && (\n <button\n onClick={(e) => handleActionClick(e, () => onDownload(file))}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(t, \"files.card.download\", \"Download\")}\n title={tWithFallback(t, \"files.card.download\", \"Download\")}\n >\n <Download className=\"size-4 text-text-primary\" />\n </button>\n )}\n\n {onShare && (\n <button\n onClick={(e) => handleActionClick(e, () => onShare(file))}\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 {onFavorite && (\n <button\n onClick={(e) => handleActionClick(e, () => onFavorite(file))}\n className=\"p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors\"\n aria-label={\n file.starred\n ? tWithFallback(t, \"files.card.unfavorite\", \"Unfavorite\")\n : tWithFallback(t, \"files.card.favorite\", \"Favorite\")\n }\n title={\n file.starred\n ? tWithFallback(t, \"files.card.unfavorite\", \"Unfavorite\")\n : tWithFallback(t, \"files.card.favorite\", \"Favorite\")\n }\n >\n <Star\n className={`size-4 ${\n file.starred\n ? \"fill-status-warning-bg text-status-warning-bg\"\n : \"text-text-primary\"\n }`}\n />\n </button>\n )}\n\n {onRestore && (\n <button\n onClick={(e) => handleActionClick(e, () => onRestore(file))}\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 {file.canWrite && onRename && (\n <button\n onClick={(e) => handleActionClick(e, () => onRename(file))}\n className=\"hidden @md:block 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 {file.canDelete && onDelete && (\n <button\n onClick={(e) => handleActionClick(e, () => onDelete(file))}\n className=\"p-1.5 hover:bg-action-danger-bg-hover rounded transition-colors\"\n aria-label={tWithFallback(t, \"files.card.delete\", \"Delete\")}\n title={tWithFallback(t, \"files.card.delete\", \"Delete\")}\n >\n <Trash2 className=\"size-4 text-status-error-text\" />\n </button>\n )}\n </div>\n\n {/* More actions dropdown - always visible */}\n <ActionMenu\n items={menuItems}\n align=\"right\"\n isOpen={menuOpen}\n onToggle={setMenuOpen}\n />\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { FileItem } from '../types';
2
+ interface FilePreviewModalProps {
3
+ file: FileItem;
4
+ onClose: () => void;
5
+ onDownload: () => void;
6
+ onShare?: () => void;
7
+ onStar?: () => void;
8
+ onDelete?: () => void;
9
+ customActions?: Array<{
10
+ label: string;
11
+ icon: React.ReactNode;
12
+ onClick: () => void;
13
+ }>;
14
+ }
15
+ export declare function FilePreviewModal({ file, onClose, onDownload, onShare, onStar, onDelete, customActions, }: FilePreviewModalProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=FilePreviewModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewModal.d.ts","sourceRoot":"","sources":["../../../src/files/components/FilePreviewModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAWzC,UAAU,qBAAqB;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;QACtB,OAAO,EAAE,MAAM,IAAI,CAAC;KACrB,CAAC,CAAC;CACJ;AA8GD,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,aAAa,GACd,EAAE,qBAAqB,2CAwLvB"}
@@ -0,0 +1,175 @@
1
+ import { tWithFallback as e } from "../utils/i18n.js";
2
+ import { ImageViewer as t } from "./viewers/ImageViewer.js";
3
+ import { PDFViewer as n } from "./viewers/PDFViewer.js";
4
+ import { VideoPlayer as r } from "./viewers/VideoPlayer.js";
5
+ import { AudioPlayer as i } from "./viewers/AudioPlayer.js";
6
+ import { CodeViewer as a } from "./viewers/CodeViewer.js";
7
+ import { TextViewer as o } from "./viewers/TextViewer.js";
8
+ import "./viewers/index.js";
9
+ import { useEffect as s } from "react";
10
+ import { Download as c, Share2 as l, Star as u, Trash2 as d, X as f } from "lucide-react";
11
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
12
+ import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
13
+ //#region src/files/components/FilePreviewModal.tsx
14
+ function g(e, t) {
15
+ if (e.startsWith("image/")) return "image";
16
+ if (e === "application/pdf") return "pdf";
17
+ if (e.startsWith("video/")) return "video";
18
+ if (e.startsWith("audio/")) return "audio";
19
+ let n = /* @__PURE__ */ "js.jsx.ts.tsx.py.java.cpp.c.cs.rb.go.rs.php.html.css.scss.json.yaml.yml.xml.sql.sh.bash.vue.swift.kt.r.dart.lua".split("."), r = t.split(".").pop()?.toLowerCase();
20
+ return r && n.includes(r) ? "code" : e.startsWith("text/") || e === "application/json" || e === "application/xml" ? "text" : "unsupported";
21
+ }
22
+ function _(e) {
23
+ return {
24
+ js: "javascript",
25
+ jsx: "jsx",
26
+ ts: "typescript",
27
+ tsx: "tsx",
28
+ py: "python",
29
+ java: "java",
30
+ cpp: "cpp",
31
+ c: "c",
32
+ cs: "csharp",
33
+ rb: "ruby",
34
+ go: "go",
35
+ rs: "rust",
36
+ php: "php",
37
+ html: "html",
38
+ css: "css",
39
+ json: "json",
40
+ md: "markdown",
41
+ yaml: "yaml",
42
+ yml: "yaml",
43
+ xml: "xml",
44
+ sql: "sql",
45
+ sh: "bash"
46
+ }[e.split(".").pop()?.toLowerCase() || ""] || "text";
47
+ }
48
+ function v({ file: v, onClose: y, onDownload: b, onShare: x, onStar: S, onDelete: C, customActions: w }) {
49
+ let { t: T } = h(), E = g(v.mimeType, v.name), D = v.downloadUrl || v.url;
50
+ return s(() => {
51
+ let e = (e) => {
52
+ e.key === "Escape" && y();
53
+ };
54
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
55
+ }, [y]), /* @__PURE__ */ m("div", {
56
+ className: "fixed inset-0 bg-bg-overlay flex flex-col z-[100] animate-in fade-in duration-200",
57
+ role: "dialog",
58
+ "aria-modal": "true",
59
+ "aria-label": `Preview ${v.name}`,
60
+ children: [/* @__PURE__ */ m("div", {
61
+ className: "flex items-center justify-between px-6 py-4 bg-bg-elevated/90 backdrop-blur-sm border-b border-border-default",
62
+ children: [/* @__PURE__ */ m("div", {
63
+ className: "flex items-center gap-4 flex-1 min-w-0",
64
+ children: [/* @__PURE__ */ p("h2", {
65
+ className: "text-base font-medium text-text-primary truncate",
66
+ children: v.name
67
+ }), /* @__PURE__ */ m("span", {
68
+ className: "text-sm text-text-secondary flex-shrink-0",
69
+ children: [(v.size / 1024 / 1024).toFixed(2), " MB"]
70
+ })]
71
+ }), /* @__PURE__ */ m("div", {
72
+ className: "flex items-center gap-2",
73
+ children: [
74
+ w?.map((e, t) => /* @__PURE__ */ m("button", {
75
+ onClick: e.onClick,
76
+ className: "flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
77
+ title: e.label,
78
+ children: [e.icon, /* @__PURE__ */ p("span", { children: e.label })]
79
+ }, t)),
80
+ /* @__PURE__ */ p("button", {
81
+ onClick: b,
82
+ className: "p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
83
+ title: e(T, "files.common.actions.download", "Download"),
84
+ "aria-label": e(T, "files.preview.downloadFile", "Download file"),
85
+ children: /* @__PURE__ */ p(c, { className: "size-5" })
86
+ }),
87
+ x && /* @__PURE__ */ p("button", {
88
+ onClick: x,
89
+ className: "p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
90
+ title: e(T, "files.common.actions.share", "Share"),
91
+ "aria-label": e(T, "files.preview.shareFile", "Share file"),
92
+ children: /* @__PURE__ */ p(l, { className: "size-5" })
93
+ }),
94
+ S && /* @__PURE__ */ p("button", {
95
+ onClick: S,
96
+ className: "p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
97
+ title: v.starred ? e(T, "files.preview.removeStar", "Remove star") : e(T, "files.preview.addStar", "Add star"),
98
+ "aria-label": v.starred ? e(T, "files.preview.removeStar", "Remove star") : e(T, "files.preview.addStar", "Add star"),
99
+ children: /* @__PURE__ */ p(u, { className: `size-5 ${v.starred ? "fill-status-warning-text text-status-warning-text" : ""}` })
100
+ }),
101
+ C && /* @__PURE__ */ p("button", {
102
+ onClick: C,
103
+ className: "p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200",
104
+ title: e(T, "files.common.actions.delete", "Delete"),
105
+ "aria-label": e(T, "files.preview.deleteFile", "Delete file"),
106
+ children: /* @__PURE__ */ p(d, { className: "size-5" })
107
+ }),
108
+ /* @__PURE__ */ p("button", {
109
+ onClick: y,
110
+ className: "p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200 ml-2",
111
+ title: e(T, "files.common.actions.close", "Close"),
112
+ "aria-label": e(T, "files.preview.close", "Close preview"),
113
+ children: /* @__PURE__ */ p(f, { className: "size-5" })
114
+ })
115
+ ]
116
+ })]
117
+ }), /* @__PURE__ */ p("div", {
118
+ className: "flex-1 overflow-hidden",
119
+ children: (() => {
120
+ switch (E) {
121
+ case "image": return /* @__PURE__ */ p(t, {
122
+ file: v,
123
+ url: D
124
+ });
125
+ case "pdf": return /* @__PURE__ */ p(n, {
126
+ file: v,
127
+ url: D
128
+ });
129
+ case "video": return /* @__PURE__ */ p(r, {
130
+ file: v,
131
+ url: D
132
+ });
133
+ case "audio": return /* @__PURE__ */ p(i, {
134
+ file: v,
135
+ url: D
136
+ });
137
+ case "code": return /* @__PURE__ */ p(a, {
138
+ file: v,
139
+ url: D,
140
+ language: _(v.name)
141
+ });
142
+ case "text": return /* @__PURE__ */ p(o, {
143
+ file: v,
144
+ url: D
145
+ });
146
+ default: return /* @__PURE__ */ p("div", {
147
+ className: "flex flex-col items-center justify-center h-full bg-bg-canvas p-8",
148
+ children: /* @__PURE__ */ m("div", {
149
+ className: "bg-bg-surface p-8 rounded-lg text-center max-w-md",
150
+ children: [
151
+ /* @__PURE__ */ p("p", {
152
+ className: "text-text-secondary mb-4",
153
+ children: e(T, "files.preview.notAvailable", "Preview not available for this file type.")
154
+ }),
155
+ /* @__PURE__ */ p("p", {
156
+ className: "text-sm text-text-tertiary mb-6",
157
+ children: v.mimeType
158
+ }),
159
+ /* @__PURE__ */ p("button", {
160
+ onClick: b,
161
+ className: "px-4 py-2 bg-action-primary-bg text-text-inverse rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200",
162
+ children: e(T, "files.preview.downloadFile", "Download File")
163
+ })
164
+ ]
165
+ })
166
+ });
167
+ }
168
+ })()
169
+ })]
170
+ });
171
+ }
172
+ //#endregion
173
+ export { v as FilePreviewModal };
174
+
175
+ //# sourceMappingURL=FilePreviewModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePreviewModal.js","names":[],"sources":["../../../src/files/components/FilePreviewModal.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { X, Download, Share2, Star, Trash2 } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport type { FileItem } from \"../types\";\nimport { tWithFallback } from \"../utils/i18n\";\nimport {\n ImageViewer,\n PDFViewer,\n VideoPlayer,\n AudioPlayer,\n CodeViewer,\n TextViewer,\n} from \"./viewers\";\n\ninterface FilePreviewModalProps {\n file: FileItem;\n onClose: () => void;\n onDownload: () => void;\n onShare?: () => void;\n onStar?: () => void;\n onDelete?: () => void;\n customActions?: Array<{\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n }>;\n}\n\ntype PreviewType =\n | \"image\"\n | \"pdf\"\n | \"video\"\n | \"audio\"\n | \"code\"\n | \"text\"\n | \"unsupported\";\n\nfunction getFilePreviewType(mimeType: string, filename: string): PreviewType {\n // Image files\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n\n // PDF files\n if (mimeType === \"application/pdf\") {\n return \"pdf\";\n }\n\n // Video files\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n\n // Audio files\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n\n // Code files (by extension)\n const codeExtensions = [\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"py\",\n \"java\",\n \"cpp\",\n \"c\",\n \"cs\",\n \"rb\",\n \"go\",\n \"rs\",\n \"php\",\n \"html\",\n \"css\",\n \"scss\",\n \"json\",\n \"yaml\",\n \"yml\",\n \"xml\",\n \"sql\",\n \"sh\",\n \"bash\",\n \"vue\",\n \"swift\",\n \"kt\",\n \"r\",\n \"dart\",\n \"lua\",\n ];\n const ext = filename.split(\".\").pop()?.toLowerCase();\n if (ext && codeExtensions.includes(ext)) {\n return \"code\";\n }\n\n // Text files\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\"\n ) {\n return \"text\";\n }\n\n return \"unsupported\";\n}\n\nfunction detectLanguage(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const languageMap: Record<string, string> = {\n js: \"javascript\",\n jsx: \"jsx\",\n ts: \"typescript\",\n tsx: \"tsx\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n cs: \"csharp\",\n rb: \"ruby\",\n go: \"go\",\n rs: \"rust\",\n php: \"php\",\n html: \"html\",\n css: \"css\",\n json: \"json\",\n md: \"markdown\",\n yaml: \"yaml\",\n yml: \"yaml\",\n xml: \"xml\",\n sql: \"sql\",\n sh: \"bash\",\n };\n return languageMap[ext || \"\"] || \"text\";\n}\n\nexport function FilePreviewModal({\n file,\n onClose,\n onDownload,\n onShare,\n onStar,\n onDelete,\n customActions,\n}: FilePreviewModalProps) {\n const { t } = useI18n();\n const previewType = getFilePreviewType(file.mimeType, file.name);\n const url = file.downloadUrl || file.url;\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [onClose]);\n\n const renderPreview = () => {\n switch (previewType) {\n case \"image\":\n return <ImageViewer file={file} url={url} />;\n case \"pdf\":\n return <PDFViewer file={file} url={url} />;\n case \"video\":\n return <VideoPlayer file={file} url={url} />;\n case \"audio\":\n return <AudioPlayer file={file} url={url} />;\n case \"code\":\n return (\n <CodeViewer\n file={file}\n url={url}\n language={detectLanguage(file.name)}\n />\n );\n case \"text\":\n return <TextViewer file={file} url={url} />;\n default:\n return (\n <div className=\"flex flex-col items-center justify-center h-full bg-bg-canvas p-8\">\n <div className=\"bg-bg-surface p-8 rounded-lg text-center max-w-md\">\n <p className=\"text-text-secondary mb-4\">\n {tWithFallback(\n t,\n \"files.preview.notAvailable\",\n \"Preview not available for this file type.\",\n )}\n </p>\n <p className=\"text-sm text-text-tertiary mb-6\">{file.mimeType}</p>\n <button\n onClick={onDownload}\n className=\"px-4 py-2 bg-action-primary-bg text-text-inverse rounded-lg hover:bg-action-primary-bg-hover transition-colors duration-200\"\n >\n {tWithFallback(\n t,\n \"files.preview.downloadFile\",\n \"Download File\",\n )}\n </button>\n </div>\n </div>\n );\n }\n };\n\n return (\n <div\n className=\"fixed inset-0 bg-bg-overlay flex flex-col z-[100] animate-in fade-in duration-200\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Preview ${file.name}`}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 bg-bg-elevated/90 backdrop-blur-sm border-b border-border-default\">\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n <h2 className=\"text-base font-medium text-text-primary truncate\">\n {file.name}\n </h2>\n <span className=\"text-sm text-text-secondary flex-shrink-0\">\n {(file.size / 1024 / 1024).toFixed(2)} MB\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Custom Actions */}\n {customActions?.map((action, index) => (\n <button\n key={index}\n onClick={action.onClick}\n className=\"flex items-center gap-1.5 px-3 py-2 text-sm font-medium text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n title={action.label}\n >\n {action.icon}\n <span>{action.label}</span>\n </button>\n ))}\n\n {/* Standard Actions */}\n <button\n onClick={onDownload}\n className=\"p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n title={tWithFallback(\n t,\n \"files.common.actions.download\",\n \"Download\",\n )}\n aria-label={tWithFallback(\n t,\n \"files.preview.downloadFile\",\n \"Download file\",\n )}\n >\n <Download className=\"size-5\" />\n </button>\n {onShare && (\n <button\n onClick={onShare}\n className=\"p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n title={tWithFallback(t, \"files.common.actions.share\", \"Share\")}\n aria-label={tWithFallback(\n t,\n \"files.preview.shareFile\",\n \"Share file\",\n )}\n >\n <Share2 className=\"size-5\" />\n </button>\n )}\n {onStar && (\n <button\n onClick={onStar}\n className=\"p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n title={\n file.starred\n ? tWithFallback(t, \"files.preview.removeStar\", \"Remove star\")\n : tWithFallback(t, \"files.preview.addStar\", \"Add star\")\n }\n aria-label={\n file.starred\n ? tWithFallback(t, \"files.preview.removeStar\", \"Remove star\")\n : tWithFallback(t, \"files.preview.addStar\", \"Add star\")\n }\n >\n <Star\n className={`size-5 ${\n file.starred\n ? \"fill-status-warning-text text-status-warning-text\"\n : \"\"\n }`}\n />\n </button>\n )}\n {onDelete && (\n <button\n onClick={onDelete}\n className=\"p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200\"\n title={tWithFallback(t, \"files.common.actions.delete\", \"Delete\")}\n aria-label={tWithFallback(\n t,\n \"files.preview.deleteFile\",\n \"Delete file\",\n )}\n >\n <Trash2 className=\"size-5\" />\n </button>\n )}\n <button\n onClick={onClose}\n className=\"p-2 text-text-secondary hover:text-text-primary hover:bg-action-ghost-bg-hover rounded-lg transition-colors duration-200 ml-2\"\n title={tWithFallback(t, \"files.common.actions.close\", \"Close\")}\n aria-label={tWithFallback(\n t,\n \"files.preview.close\",\n \"Close preview\",\n )}\n >\n <X className=\"size-5\" />\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-hidden\">{renderPreview()}</div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { FileItem } from '../types';
3
+ interface FileVersionPanelProps {
4
+ file: FileItem;
5
+ onClose: () => void;
6
+ }
7
+ export declare const FileVersionPanel: FC<FileVersionPanelProps>;
8
+ export {};
9
+ //# sourceMappingURL=FileVersionPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileVersionPanel.d.ts","sourceRoot":"","sources":["../../../src/files/components/FileVersionPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAY,MAAM,OAAO,CAAC;AAa1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAYzC,UAAU,qBAAqB;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA+XtD,CAAC"}