@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.
- package/README.md +12 -0
- package/dist/config/index.d.ts +33 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +28 -0
- package/dist/config/index.js.map +1 -0
- package/dist/dev/main.d.ts +1 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/files/FilesRoot.d.ts +31 -0
- package/dist/files/FilesRoot.d.ts.map +1 -0
- package/dist/files/FilesRoot.js +63 -0
- package/dist/files/FilesRoot.js.map +1 -0
- package/dist/files/FilesRoutes.d.ts +12 -0
- package/dist/files/FilesRoutes.d.ts.map +1 -0
- package/dist/files/FilesRoutes.js +45 -0
- package/dist/files/FilesRoutes.js.map +1 -0
- package/dist/files/components/ActionMenu.d.ts +19 -0
- package/dist/files/components/ActionMenu.d.ts.map +1 -0
- package/dist/files/components/ActionMenu.js +73 -0
- package/dist/files/components/ActionMenu.js.map +1 -0
- package/dist/files/components/ConfirmDialog.d.ts +14 -0
- package/dist/files/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/files/components/ConfirmDialog.js +85 -0
- package/dist/files/components/ConfirmDialog.js.map +1 -0
- package/dist/files/components/ContextMenu.d.ts +59 -0
- package/dist/files/components/ContextMenu.d.ts.map +1 -0
- package/dist/files/components/ContextMenu.js +136 -0
- package/dist/files/components/ContextMenu.js.map +1 -0
- package/dist/files/components/CopyDialog.d.ts +12 -0
- package/dist/files/components/CopyDialog.d.ts.map +1 -0
- package/dist/files/components/CopyDialog.js +139 -0
- package/dist/files/components/CopyDialog.js.map +1 -0
- package/dist/files/components/EmptyState.d.ts +8 -0
- package/dist/files/components/EmptyState.d.ts.map +1 -0
- package/dist/files/components/EmptyState.js +66 -0
- package/dist/files/components/EmptyState.js.map +1 -0
- package/dist/files/components/FileBrowser.d.ts +37 -0
- package/dist/files/components/FileBrowser.d.ts.map +1 -0
- package/dist/files/components/FileBrowser.js +421 -0
- package/dist/files/components/FileBrowser.js.map +1 -0
- package/dist/files/components/FileCard.d.ts +30 -0
- package/dist/files/components/FileCard.d.ts.map +1 -0
- package/dist/files/components/FileCard.js +233 -0
- package/dist/files/components/FileCard.js.map +1 -0
- package/dist/files/components/FileInfoPanel.d.ts +9 -0
- package/dist/files/components/FileInfoPanel.d.ts.map +1 -0
- package/dist/files/components/FileInfoPanel.js +224 -0
- package/dist/files/components/FileInfoPanel.js.map +1 -0
- package/dist/files/components/FileListItem.d.ts +46 -0
- package/dist/files/components/FileListItem.d.ts.map +1 -0
- package/dist/files/components/FileListItem.js +235 -0
- package/dist/files/components/FileListItem.js.map +1 -0
- package/dist/files/components/FilePreviewModal.d.ts +17 -0
- package/dist/files/components/FilePreviewModal.d.ts.map +1 -0
- package/dist/files/components/FilePreviewModal.js +175 -0
- package/dist/files/components/FilePreviewModal.js.map +1 -0
- package/dist/files/components/FileVersionPanel.d.ts +9 -0
- package/dist/files/components/FileVersionPanel.d.ts.map +1 -0
- package/dist/files/components/FileVersionPanel.js +227 -0
- package/dist/files/components/FileVersionPanel.js.map +1 -0
- package/dist/files/components/FolderCard.d.ts +34 -0
- package/dist/files/components/FolderCard.d.ts.map +1 -0
- package/dist/files/components/FolderCard.js +225 -0
- package/dist/files/components/FolderCard.js.map +1 -0
- package/dist/files/components/MoveDialog.d.ts +12 -0
- package/dist/files/components/MoveDialog.d.ts.map +1 -0
- package/dist/files/components/MoveDialog.js +123 -0
- package/dist/files/components/MoveDialog.js.map +1 -0
- package/dist/files/components/SearchBar.d.ts +13 -0
- package/dist/files/components/SearchBar.d.ts.map +1 -0
- package/dist/files/components/SearchBar.js +257 -0
- package/dist/files/components/SearchBar.js.map +1 -0
- package/dist/files/components/ShareDialog.d.ts +24 -0
- package/dist/files/components/ShareDialog.d.ts.map +1 -0
- package/dist/files/components/ShareDialog.js +201 -0
- package/dist/files/components/ShareDialog.js.map +1 -0
- package/dist/files/components/TabBar.d.ts +14 -0
- package/dist/files/components/TabBar.d.ts.map +1 -0
- package/dist/files/components/TabBar.js +65 -0
- package/dist/files/components/TabBar.js.map +1 -0
- package/dist/files/components/Toast.d.ts +14 -0
- package/dist/files/components/Toast.d.ts.map +1 -0
- package/dist/files/components/Toast.js +51 -0
- package/dist/files/components/Toast.js.map +1 -0
- package/dist/files/components/UploadQueue.d.ts +21 -0
- package/dist/files/components/UploadQueue.d.ts.map +1 -0
- package/dist/files/components/UploadQueue.js +171 -0
- package/dist/files/components/UploadQueue.js.map +1 -0
- package/dist/files/components/index.d.ts +43 -0
- package/dist/files/components/index.d.ts.map +1 -0
- package/dist/files/components/viewers/AudioPlayer.d.ts +8 -0
- package/dist/files/components/viewers/AudioPlayer.d.ts.map +1 -0
- package/dist/files/components/viewers/AudioPlayer.js +102 -0
- package/dist/files/components/viewers/AudioPlayer.js.map +1 -0
- package/dist/files/components/viewers/CodeViewer.d.ts +16 -0
- package/dist/files/components/viewers/CodeViewer.d.ts.map +1 -0
- package/dist/files/components/viewers/CodeViewer.js +113 -0
- package/dist/files/components/viewers/CodeViewer.js.map +1 -0
- package/dist/files/components/viewers/ImageViewer.d.ts +8 -0
- package/dist/files/components/viewers/ImageViewer.d.ts.map +1 -0
- package/dist/files/components/viewers/ImageViewer.js +138 -0
- package/dist/files/components/viewers/ImageViewer.js.map +1 -0
- package/dist/files/components/viewers/PDFViewer.d.ts +15 -0
- package/dist/files/components/viewers/PDFViewer.d.ts.map +1 -0
- package/dist/files/components/viewers/PDFViewer.js +80 -0
- package/dist/files/components/viewers/PDFViewer.js.map +1 -0
- package/dist/files/components/viewers/TextViewer.d.ts +8 -0
- package/dist/files/components/viewers/TextViewer.d.ts.map +1 -0
- package/dist/files/components/viewers/TextViewer.js +121 -0
- package/dist/files/components/viewers/TextViewer.js.map +1 -0
- package/dist/files/components/viewers/VideoPlayer.d.ts +8 -0
- package/dist/files/components/viewers/VideoPlayer.d.ts.map +1 -0
- package/dist/files/components/viewers/VideoPlayer.js +138 -0
- package/dist/files/components/viewers/VideoPlayer.js.map +1 -0
- package/dist/files/components/viewers/index.d.ts +7 -0
- package/dist/files/components/viewers/index.d.ts.map +1 -0
- package/dist/files/components/viewers/index.js +6 -0
- package/dist/files/graphql-types.d.ts +317 -0
- package/dist/files/graphql-types.d.ts.map +1 -0
- package/dist/files/hooks/useBatchOperations.d.ts +32 -0
- package/dist/files/hooks/useBatchOperations.d.ts.map +1 -0
- package/dist/files/hooks/useBatchOperations.js +18 -0
- package/dist/files/hooks/useBatchOperations.js.map +1 -0
- package/dist/files/hooks/useBinItems.d.ts +11 -0
- package/dist/files/hooks/useBinItems.d.ts.map +1 -0
- package/dist/files/hooks/useBinItems.js +27 -0
- package/dist/files/hooks/useBinItems.js.map +1 -0
- package/dist/files/hooks/useBrowsePage.d.ts +18 -0
- package/dist/files/hooks/useBrowsePage.d.ts.map +1 -0
- package/dist/files/hooks/useBrowsePage.js +34 -0
- package/dist/files/hooks/useBrowsePage.js.map +1 -0
- package/dist/files/hooks/useCopyFile.d.ts +14 -0
- package/dist/files/hooks/useCopyFile.d.ts.map +1 -0
- package/dist/files/hooks/useCopyFile.js +22 -0
- package/dist/files/hooks/useCopyFile.js.map +1 -0
- package/dist/files/hooks/useCreateFolder.d.ts +14 -0
- package/dist/files/hooks/useCreateFolder.d.ts.map +1 -0
- package/dist/files/hooks/useCreateFolder.js +14 -0
- package/dist/files/hooks/useCreateFolder.js.map +1 -0
- package/dist/files/hooks/useCreateFolderShare.d.ts +16 -0
- package/dist/files/hooks/useCreateFolderShare.d.ts.map +1 -0
- package/dist/files/hooks/useCreateFolderShare.js +14 -0
- package/dist/files/hooks/useCreateFolderShare.js.map +1 -0
- package/dist/files/hooks/useCreateShare.d.ts +16 -0
- package/dist/files/hooks/useCreateShare.d.ts.map +1 -0
- package/dist/files/hooks/useCreateShare.js +14 -0
- package/dist/files/hooks/useCreateShare.js.map +1 -0
- package/dist/files/hooks/useDeleteFile.d.ts +9 -0
- package/dist/files/hooks/useDeleteFile.d.ts.map +1 -0
- package/dist/files/hooks/useDeleteFile.js +20 -0
- package/dist/files/hooks/useDeleteFile.js.map +1 -0
- package/dist/files/hooks/useDeleteFolder.d.ts +10 -0
- package/dist/files/hooks/useDeleteFolder.d.ts.map +1 -0
- package/dist/files/hooks/useDeleteFolder.js +24 -0
- package/dist/files/hooks/useDeleteFolder.js.map +1 -0
- package/dist/files/hooks/useDragDrop.d.ts +31 -0
- package/dist/files/hooks/useDragDrop.d.ts.map +1 -0
- package/dist/files/hooks/useDragDrop.js +45 -0
- package/dist/files/hooks/useDragDrop.js.map +1 -0
- package/dist/files/hooks/useFileVersions.d.ts +52 -0
- package/dist/files/hooks/useFileVersions.d.ts.map +1 -0
- package/dist/files/hooks/useFileVersions.js +52 -0
- package/dist/files/hooks/useFileVersions.js.map +1 -0
- package/dist/files/hooks/useFiles.d.ts +18 -0
- package/dist/files/hooks/useFiles.d.ts.map +1 -0
- package/dist/files/hooks/useFolder.d.ts +7 -0
- package/dist/files/hooks/useFolder.d.ts.map +1 -0
- package/dist/files/hooks/useFolderPath.d.ts +2 -0
- package/dist/files/hooks/useFolderPath.d.ts.map +1 -0
- package/dist/files/hooks/useFoldersQuery.d.ts +7 -0
- package/dist/files/hooks/useFoldersQuery.d.ts.map +1 -0
- package/dist/files/hooks/useFoldersQuery.js +13 -0
- package/dist/files/hooks/useFoldersQuery.js.map +1 -0
- package/dist/files/hooks/useKeyboardNavigation.d.ts +17 -0
- package/dist/files/hooks/useKeyboardNavigation.d.ts.map +1 -0
- package/dist/files/hooks/useKeyboardNavigation.js +105 -0
- package/dist/files/hooks/useKeyboardNavigation.js.map +1 -0
- package/dist/files/hooks/useMoveFile.d.ts +10 -0
- package/dist/files/hooks/useMoveFile.d.ts.map +1 -0
- package/dist/files/hooks/useMoveFile.js +21 -0
- package/dist/files/hooks/useMoveFile.js.map +1 -0
- package/dist/files/hooks/useMoveFolder.d.ts +10 -0
- package/dist/files/hooks/useMoveFolder.d.ts.map +1 -0
- package/dist/files/hooks/useMoveFolder.js +21 -0
- package/dist/files/hooks/useMoveFolder.js.map +1 -0
- package/dist/files/hooks/usePermanentlyDeleteFile.d.ts +9 -0
- package/dist/files/hooks/usePermanentlyDeleteFile.d.ts.map +1 -0
- package/dist/files/hooks/usePermanentlyDeleteFile.js +18 -0
- package/dist/files/hooks/usePermanentlyDeleteFile.js.map +1 -0
- package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts +9 -0
- package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts.map +1 -0
- package/dist/files/hooks/usePermanentlyDeleteFolder.js +18 -0
- package/dist/files/hooks/usePermanentlyDeleteFolder.js.map +1 -0
- package/dist/files/hooks/useRecentFiles.d.ts +10 -0
- package/dist/files/hooks/useRecentFiles.d.ts.map +1 -0
- package/dist/files/hooks/useRecentFiles.js +24 -0
- package/dist/files/hooks/useRecentFiles.js.map +1 -0
- package/dist/files/hooks/useRenameFile.d.ts +10 -0
- package/dist/files/hooks/useRenameFile.d.ts.map +1 -0
- package/dist/files/hooks/useRenameFile.js +21 -0
- package/dist/files/hooks/useRenameFile.js.map +1 -0
- package/dist/files/hooks/useRenameFolder.d.ts +10 -0
- package/dist/files/hooks/useRenameFolder.d.ts.map +1 -0
- package/dist/files/hooks/useRenameFolder.js +21 -0
- package/dist/files/hooks/useRenameFolder.js.map +1 -0
- package/dist/files/hooks/useRestoreFile.d.ts +9 -0
- package/dist/files/hooks/useRestoreFile.d.ts.map +1 -0
- package/dist/files/hooks/useRestoreFile.js +21 -0
- package/dist/files/hooks/useRestoreFile.js.map +1 -0
- package/dist/files/hooks/useRestoreFolder.d.ts +9 -0
- package/dist/files/hooks/useRestoreFolder.d.ts.map +1 -0
- package/dist/files/hooks/useRestoreFolder.js +21 -0
- package/dist/files/hooks/useRestoreFolder.js.map +1 -0
- package/dist/files/hooks/useSearch.d.ts +15 -0
- package/dist/files/hooks/useSearch.d.ts.map +1 -0
- package/dist/files/hooks/useSearch.js +27 -0
- package/dist/files/hooks/useSearch.js.map +1 -0
- package/dist/files/hooks/useStarredItems.d.ts +10 -0
- package/dist/files/hooks/useStarredItems.d.ts.map +1 -0
- package/dist/files/hooks/useStarredItems.js +18 -0
- package/dist/files/hooks/useStarredItems.js.map +1 -0
- package/dist/files/hooks/useToast.d.ts +11 -0
- package/dist/files/hooks/useToast.d.ts.map +1 -0
- package/dist/files/hooks/useToast.js +28 -0
- package/dist/files/hooks/useToast.js.map +1 -0
- package/dist/files/hooks/useToggleStar.d.ts +10 -0
- package/dist/files/hooks/useToggleStar.d.ts.map +1 -0
- package/dist/files/hooks/useToggleStar.js +26 -0
- package/dist/files/hooks/useToggleStar.js.map +1 -0
- package/dist/files/hooks/useUploadFile.d.ts +25 -0
- package/dist/files/hooks/useUploadFile.d.ts.map +1 -0
- package/dist/files/hooks/useUploadFile.js +74 -0
- package/dist/files/hooks/useUploadFile.js.map +1 -0
- package/dist/files/index.d.ts +29 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +3 -0
- package/dist/files/pages/BrowserPage.d.ts +5 -0
- package/dist/files/pages/BrowserPage.d.ts.map +1 -0
- package/dist/files/pages/BrowserPage.js +1014 -0
- package/dist/files/pages/BrowserPage.js.map +1 -0
- package/dist/files/pages/ShareAccessPage.d.ts +2 -0
- package/dist/files/pages/ShareAccessPage.d.ts.map +1 -0
- package/dist/files/pages/ShareAccessPage.js +162 -0
- package/dist/files/pages/ShareAccessPage.js.map +1 -0
- package/dist/files/providers/FilesProvider.d.ts +25 -0
- package/dist/files/providers/FilesProvider.d.ts.map +1 -0
- package/dist/files/providers/FilesProvider.js +18 -0
- package/dist/files/providers/FilesProvider.js.map +1 -0
- package/dist/files/store/filesStore.d.ts +99 -0
- package/dist/files/store/filesStore.d.ts.map +1 -0
- package/dist/files/store/filesStore.js +129 -0
- package/dist/files/store/filesStore.js.map +1 -0
- package/dist/files/types.d.ts +266 -0
- package/dist/files/types.d.ts.map +1 -0
- package/dist/files/utils/events.d.ts +6 -0
- package/dist/files/utils/events.d.ts.map +1 -0
- package/dist/files/utils/events.js +16 -0
- package/dist/files/utils/events.js.map +1 -0
- package/dist/files/utils/i18n.d.ts +5 -0
- package/dist/files/utils/i18n.d.ts.map +1 -0
- package/dist/files/utils/i18n.js +15 -0
- package/dist/files/utils/i18n.js.map +1 -0
- package/dist/files/utils/index.d.ts +74 -0
- package/dist/files/utils/index.d.ts.map +1 -0
- package/dist/files/utils/index.js +50 -0
- package/dist/files/utils/index.js.map +1 -0
- package/dist/files/utils/thumbnail.d.ts +5 -0
- package/dist/files/utils/thumbnail.d.ts.map +1 -0
- package/dist/files/utils/thumbnail.js +39 -0
- package/dist/files/utils/thumbnail.js.map +1 -0
- package/dist/files.d.ts +2 -0
- package/dist/files.js +6 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2706 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-operations.js +1085 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/generated/wspace-types.d.ts +55214 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/shared/types/index.d.ts +101 -0
- package/dist/shared/types/index.d.ts.map +1 -0
- package/dist/utils/nativeBridge.d.ts +3 -0
- package/dist/utils/nativeBridge.d.ts.map +1 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +126 -0
package/README.md
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# microfe-files
|
|
2
|
+
|
|
3
|
+
Part of the [Burdenoff](https://burdenoff.com) platform by
|
|
4
|
+
[AlgoShred](https://github.com/algoshred).
|
|
5
|
+
|
|
6
|
+
## Getting Started
|
|
7
|
+
|
|
8
|
+
See `AGENTS.md` for development commands and architecture details.
|
|
9
|
+
|
|
10
|
+
## License
|
|
11
|
+
|
|
12
|
+
Proprietary — Copyright Burdenoff Consultancy Services Pvt. Ltd.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration module for files microfrontend
|
|
3
|
+
* This config is typically injected by the shell application at runtime
|
|
4
|
+
*/
|
|
5
|
+
export interface FilesConfig {
|
|
6
|
+
/** Full GraphQL endpoint URL (e.g., http://localhost:4003/workspaces/graphql) */
|
|
7
|
+
apiGatewayUrl: string;
|
|
8
|
+
/** Base URL for gateway (optional, used to construct full endpoint) */
|
|
9
|
+
apiGatewayBaseUrl?: string;
|
|
10
|
+
/** Auth token for API requests */
|
|
11
|
+
authToken?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get current configuration
|
|
15
|
+
*/
|
|
16
|
+
export declare const config: FilesConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Set runtime configuration (called by shell app)
|
|
19
|
+
* @param newConfig - Configuration object
|
|
20
|
+
*/
|
|
21
|
+
export declare function setFilesConfig(newConfig: Partial<FilesConfig>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Build full GraphQL endpoint URL from base URL
|
|
24
|
+
* @param baseUrl - Base gateway URL (e.g., http://localhost:4003)
|
|
25
|
+
* @param supergraph - Supergraph name (workspaces or global)
|
|
26
|
+
* @returns Full GraphQL endpoint URL
|
|
27
|
+
*/
|
|
28
|
+
export declare function buildGraphQLEndpoint(baseUrl: string, supergraph?: "workspaces" | "global"): string;
|
|
29
|
+
/**
|
|
30
|
+
* Reset configuration to defaults
|
|
31
|
+
*/
|
|
32
|
+
export declare function resetFilesConfig(): void;
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,eAAO,MAAM,MAAM,aAIjB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,YAAY,GAAG,QAAuB,GACjD,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/config/index.ts
|
|
2
|
+
var e = {
|
|
3
|
+
apiGatewayUrl: "",
|
|
4
|
+
apiGatewayBaseUrl: "",
|
|
5
|
+
authToken: void 0
|
|
6
|
+
}, t = new Proxy({}, { get(t, n) {
|
|
7
|
+
return e[n];
|
|
8
|
+
} });
|
|
9
|
+
function n(t) {
|
|
10
|
+
e = {
|
|
11
|
+
...e,
|
|
12
|
+
...t
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function r(e, t = "workspaces") {
|
|
16
|
+
return `${e.endsWith("/") ? e.slice(0, -1) : e}${t === "workspaces" ? "/workspaces/graphql" : "/global/graphql"}`;
|
|
17
|
+
}
|
|
18
|
+
function i() {
|
|
19
|
+
e = {
|
|
20
|
+
apiGatewayUrl: "",
|
|
21
|
+
apiGatewayBaseUrl: "",
|
|
22
|
+
authToken: void 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { r as buildGraphQLEndpoint, t as config, i as resetFilesConfig, n as setFilesConfig };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/config/index.ts"],"sourcesContent":["/**\n * Configuration module for files microfrontend\n * This config is typically injected by the shell application at runtime\n */\n\nexport interface FilesConfig {\n /** Full GraphQL endpoint URL (e.g., http://localhost:4003/workspaces/graphql) */\n apiGatewayUrl: string;\n /** Base URL for gateway (optional, used to construct full endpoint) */\n apiGatewayBaseUrl?: string;\n /** Auth token for API requests */\n authToken?: string;\n}\n\n// Default configuration: empty strings so unconfigured callers fail loudly\n// (network error with an obviously-invalid URL) instead of silently hitting\n// `localhost:4003`, which can't be reached from inside containers and\n// previously manifested as a blank screen on /files.\nlet runtimeConfig: FilesConfig = {\n apiGatewayUrl: \"\",\n apiGatewayBaseUrl: \"\",\n authToken: undefined,\n};\n\n/**\n * Get current configuration\n */\nexport const config = new Proxy({} as FilesConfig, {\n get(_, prop: keyof FilesConfig) {\n return runtimeConfig[prop];\n },\n});\n\n/**\n * Set runtime configuration (called by shell app)\n * @param newConfig - Configuration object\n */\nexport function setFilesConfig(newConfig: Partial<FilesConfig>): void {\n runtimeConfig = { ...runtimeConfig, ...newConfig };\n}\n\n/**\n * Build full GraphQL endpoint URL from base URL\n * @param baseUrl - Base gateway URL (e.g., http://localhost:4003)\n * @param supergraph - Supergraph name (workspaces or global)\n * @returns Full GraphQL endpoint URL\n */\nexport function buildGraphQLEndpoint(\n baseUrl: string,\n supergraph: \"workspaces\" | \"global\" = \"workspaces\",\n): string {\n const cleanBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const path =\n supergraph === \"workspaces\" ? \"/workspaces/graphql\" : \"/global/graphql\";\n return `${cleanBase}${path}`;\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetFilesConfig(): void {\n runtimeConfig = {\n apiGatewayUrl: \"\",\n apiGatewayBaseUrl: \"\",\n authToken: undefined,\n };\n}\n"],"mappings":";AAkBA,IAAI,IAA6B;CAC/B,eAAe;CACf,mBAAmB;CACnB,WAAW,KAAA;CACZ,EAKY,IAAS,IAAI,MAAM,EAAE,EAAiB,EACjD,IAAI,GAAG,GAAyB;AAC9B,QAAO,EAAc;GAExB,CAAC;AAMF,SAAgB,EAAe,GAAuC;AACpE,KAAgB;EAAE,GAAG;EAAe,GAAG;EAAW;;AASpD,SAAgB,EACd,GACA,IAAsC,cAC9B;AAIR,QAAO,GAHW,EAAQ,SAAS,IAAI,GAAG,EAAQ,MAAM,GAAG,GAAG,GAAG,IAE/D,MAAe,eAAe,wBAAwB;;AAO1D,SAAgB,IAAyB;AACvC,KAAgB;EACd,eAAe;EACf,mBAAmB;EACnB,WAAW,KAAA;EACZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/dev/main.tsx"],"names":[],"mappings":"AAQA,OAAO,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { FilesRootProps } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Root component for the Files microfrontend.
|
|
5
|
+
*
|
|
6
|
+
* This is the main entry point that host applications import and render.
|
|
7
|
+
* It sets up the necessary providers and renders the internal routing.
|
|
8
|
+
* Automatically registers navigation items with the shell if registration functions are provided.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import { FilesRoot } from '@burdenoff/micro-fe/files';
|
|
13
|
+
*
|
|
14
|
+
* function App() {
|
|
15
|
+
* return (
|
|
16
|
+
* <Route path="/files/*" element={
|
|
17
|
+
* <FilesRoot
|
|
18
|
+
* basePath="/files"
|
|
19
|
+
* navigate={navigate}
|
|
20
|
+
* currentUser={user}
|
|
21
|
+
* workspaceId="ws-123"
|
|
22
|
+
* apiGatewayUrl="https://api.example.com"
|
|
23
|
+
* authToken="token"
|
|
24
|
+
* />
|
|
25
|
+
* } />
|
|
26
|
+
* );
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare const FilesRoot: FC<FilesRootProps>;
|
|
31
|
+
//# sourceMappingURL=FilesRoot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesRoot.d.ts","sourceRoot":"","sources":["../../src/files/FilesRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAOhC,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,SAAS,CAAC;AAcvD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CA6FxC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { FilesProvider as e } from "./providers/FilesProvider.js";
|
|
2
|
+
import { buildGraphQLEndpoint as t, setFilesConfig as n } from "../config/index.js";
|
|
3
|
+
import { FilesRoutes as r } from "./FilesRoutes.js";
|
|
4
|
+
import { useEffect as i } from "react";
|
|
5
|
+
import { ErrorBoundary as a } from "@burdenoff/fe-libs/shared/components";
|
|
6
|
+
import { QueryClient as o, QueryClientProvider as s } from "@tanstack/react-query";
|
|
7
|
+
import { FolderOpen as c } from "lucide-react";
|
|
8
|
+
import { FeatureFlagProvider as l } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
9
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
10
|
+
//#region src/files/FilesRoot.tsx
|
|
11
|
+
var d = new o({ defaultOptions: { queries: {
|
|
12
|
+
staleTime: 1e3 * 60 * 5,
|
|
13
|
+
refetchOnWindowFocus: !1
|
|
14
|
+
} } }), f = (o) => {
|
|
15
|
+
let { registerNavItems: f, registerFooterItems: p, basePath: m = "/", apiGatewayUrl: h, authToken: g, workspaceId: _ } = o;
|
|
16
|
+
i(() => {
|
|
17
|
+
h && n({
|
|
18
|
+
apiGatewayUrl: h.includes("/graphql") ? h : t(h, "workspaces"),
|
|
19
|
+
apiGatewayBaseUrl: h,
|
|
20
|
+
authToken: g
|
|
21
|
+
});
|
|
22
|
+
}, [h, g]);
|
|
23
|
+
let v = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
|
|
24
|
+
return i(() => {
|
|
25
|
+
if (f) return f([{
|
|
26
|
+
id: "files-browse",
|
|
27
|
+
label: "All Files",
|
|
28
|
+
path: v(m, "browse"),
|
|
29
|
+
icon: /* @__PURE__ */ u(c, { size: 20 }),
|
|
30
|
+
order: 10,
|
|
31
|
+
group: "files"
|
|
32
|
+
}]);
|
|
33
|
+
}, [f, m]), i(() => {
|
|
34
|
+
if (p) return p([{
|
|
35
|
+
id: "files-status",
|
|
36
|
+
label: "Files Ready",
|
|
37
|
+
type: "status",
|
|
38
|
+
order: 10,
|
|
39
|
+
section: "left"
|
|
40
|
+
}]);
|
|
41
|
+
}, [p]), /* @__PURE__ */ u(a, {
|
|
42
|
+
fallback: /* @__PURE__ */ u("div", {
|
|
43
|
+
className: "p-6 text-center text-text-secondary",
|
|
44
|
+
children: "Something went wrong loading this module. Please refresh the page."
|
|
45
|
+
}),
|
|
46
|
+
children: /* @__PURE__ */ u(s, {
|
|
47
|
+
client: d,
|
|
48
|
+
children: /* @__PURE__ */ u(l, {
|
|
49
|
+
workspaceId: _ ?? null,
|
|
50
|
+
gateway: "global",
|
|
51
|
+
defaultEnabled: !1,
|
|
52
|
+
children: /* @__PURE__ */ u(e, {
|
|
53
|
+
...o,
|
|
54
|
+
children: /* @__PURE__ */ u(r, {})
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|
|
61
|
+
export { f as FilesRoot };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=FilesRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesRoot.js","names":[],"sources":["../../src/files/FilesRoot.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect } from \"react\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { FolderOpen } from \"lucide-react\";\nimport { FeatureFlagProvider } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { FilesProvider } from \"./providers/FilesProvider\";\nimport type { NavItem, FilesRootProps } from \"./types\";\nimport { FilesRoutes } from \"./FilesRoutes\";\nimport { setFilesConfig, buildGraphQLEndpoint } from \"../config\";\n\n// Create a query client instance\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60 * 5, // 5 minutes\n refetchOnWindowFocus: false,\n },\n },\n});\n\n/**\n * Root component for the Files microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { FilesRoot } from '@burdenoff/micro-fe/files';\n *\n * function App() {\n * return (\n * <Route path=\"/files/*\" element={\n * <FilesRoot\n * basePath=\"/files\"\n * navigate={navigate}\n * currentUser={user}\n * workspaceId=\"ws-123\"\n * apiGatewayUrl=\"https://api.example.com\"\n * authToken=\"token\"\n * />\n * } />\n * );\n * }\n * ```\n */\nexport const FilesRoot: FC<FilesRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = \"/\",\n apiGatewayUrl,\n authToken,\n workspaceId,\n } = props;\n\n // Initialize runtime configuration from props\n useEffect(() => {\n if (apiGatewayUrl) {\n const fullEndpoint = apiGatewayUrl.includes(\"/graphql\")\n ? apiGatewayUrl\n : buildGraphQLEndpoint(apiGatewayUrl, \"workspaces\");\n\n setFilesConfig({\n apiGatewayUrl: fullEndpoint,\n apiGatewayBaseUrl: apiGatewayUrl,\n authToken,\n });\n }\n }, [apiGatewayUrl, authToken]);\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: \"files-browse\",\n label: \"All Files\",\n path: joinPath(basePath, \"browse\"),\n icon: <FolderOpen size={20} />,\n order: 10,\n group: \"files\",\n },\n ];\n\n // Register and get cleanup function\n const cleanup = registerNavItems(navItems);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath]);\n\n // Register footer items (example: storage status in left section)\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: \"files-status\",\n label: \"Files Ready\",\n type: \"status\" as const,\n order: 10,\n section: \"left\" as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider\n workspaceId={workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={false}\n >\n <FilesProvider {...props}>\n <FilesRoutes />\n </FilesProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;AAYA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,MAAO,KAAK;CACvB,sBAAsB;CACvB,EACF,EACF,CAAC,EA6BW,KAAiC,MAAU;CACtD,IAAM,EACJ,qBACA,wBACA,cAAW,KACX,kBACA,cACA,mBACE;AAGJ,SAAgB;AACd,EAAI,KAKF,EAAe;GACb,eALmB,EAAc,SAAS,WAAW,GACnD,IACA,EAAqB,GAAe,aAAa;GAInD,mBAAmB;GACnB;GACD,CAAC;IAEH,CAAC,GAAe,EAAU,CAAC;CAG9B,IAAM,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AA4CtD,QAvCA,QAAgB;AACT,QAiBL,QAHgB,EAZY,CAC1B;GACE,IAAI;GACJ,OAAO;GACP,MAAM,EAAS,GAAU,SAAS;GAClC,MAAM,kBAAC,GAAD,EAAY,MAAM,IAAM,CAAA;GAC9B,OAAO;GACP,OAAO;GACR,CACF,CAGyC;IAIzC,CAAC,GAAkB,EAAS,CAAC,EAGhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EACE,UACE,kBAAC,OAAD;GAAK,WAAU;aAAsC;GAE/C,CAAA;YAGR,kBAAC,GAAD;GAAqB,QAAQ;aAC3B,kBAAC,GAAD;IACE,aAAa,KAAe;IAC5B,SAAQ;IACR,gBAAgB;cAEhB,kBAAC,GAAD;KAAe,GAAI;eACjB,kBAAC,GAAD,EAAe,CAAA;KACD,CAAA;IACI,CAAA;GACF,CAAA;EACR,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal router for the Files microfrontend.
|
|
3
|
+
* This component handles routing within the microfrontend using React Router v7.
|
|
4
|
+
*
|
|
5
|
+
* Routes:
|
|
6
|
+
* - / → Redirect to browse
|
|
7
|
+
* - /browse → File browser page (root folder) - eager loaded
|
|
8
|
+
* - /browse/:folderId → File browser page (specific folder) - eager loaded
|
|
9
|
+
* - /* → Catch-all redirects to browse
|
|
10
|
+
*/
|
|
11
|
+
export declare function FilesRoutes(): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=FilesRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesRoutes.d.ts","sourceRoot":"","sources":["../../src/files/FilesRoutes.tsx"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,WAAW,4CAgC1B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useFilesContext as e } from "./providers/FilesProvider.js";
|
|
2
|
+
import { BrowserPage as t } from "./pages/BrowserPage.js";
|
|
3
|
+
import { ShareAccessPage as n } from "./pages/ShareAccessPage.js";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { Navigate as a, Route as o, Routes as s, useLocation as c } from "react-router-dom";
|
|
6
|
+
//#region src/files/FilesRoutes.tsx
|
|
7
|
+
function l() {
|
|
8
|
+
let { basePath: l } = e(), u = c(), d = l.replace(/\/+$/, "") || "/", f = `${d === "/" ? "" : d}/share/:token`, p = `${d === "/" ? "" : d}/share/`, m = `${d === "/" ? "" : d}/browse`;
|
|
9
|
+
return u.pathname.startsWith(p) ? /* @__PURE__ */ r(n, {}) : /* @__PURE__ */ i(s, { children: [
|
|
10
|
+
/* @__PURE__ */ r(o, {
|
|
11
|
+
index: !0,
|
|
12
|
+
element: /* @__PURE__ */ r(a, {
|
|
13
|
+
to: m,
|
|
14
|
+
replace: !0
|
|
15
|
+
})
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ r(o, {
|
|
18
|
+
path: "browse",
|
|
19
|
+
element: /* @__PURE__ */ r(t, {})
|
|
20
|
+
}),
|
|
21
|
+
/* @__PURE__ */ r(o, {
|
|
22
|
+
path: "browse/:folderId",
|
|
23
|
+
element: /* @__PURE__ */ r(t, {})
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ r(o, {
|
|
26
|
+
path: "share/:token",
|
|
27
|
+
element: /* @__PURE__ */ r(n, {})
|
|
28
|
+
}),
|
|
29
|
+
/* @__PURE__ */ r(o, {
|
|
30
|
+
path: f,
|
|
31
|
+
element: /* @__PURE__ */ r(n, {})
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ r(o, {
|
|
34
|
+
path: "*",
|
|
35
|
+
element: /* @__PURE__ */ r(a, {
|
|
36
|
+
to: m,
|
|
37
|
+
replace: !0
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
] });
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { l as FilesRoutes };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=FilesRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilesRoutes.js","names":[],"sources":["../../src/files/FilesRoutes.tsx"],"sourcesContent":["import { Navigate, Route, Routes, useLocation } from \"react-router-dom\";\nimport { BrowserPage } from \"./pages/BrowserPage\";\nimport { ShareAccessPage } from \"./pages/ShareAccessPage\";\nimport { useFilesContext } from \"./providers/FilesProvider\";\n\n/**\n * Internal router for the Files microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes:\n * - / → Redirect to browse\n * - /browse → File browser page (root folder) - eager loaded\n * - /browse/:folderId → File browser page (specific folder) - eager loaded\n * - /* → Catch-all redirects to browse\n */\nexport function FilesRoutes() {\n const { basePath } = useFilesContext();\n const location = useLocation();\n const normalizedBasePath = basePath.replace(/\\/+$/, \"\") || \"/\";\n const absoluteSharePath = `${normalizedBasePath === \"/\" ? \"\" : normalizedBasePath}/share/:token`;\n const absoluteSharePrefix = `${normalizedBasePath === \"/\" ? \"\" : normalizedBasePath}/share/`;\n // Absolute target for default + catch-all redirects. Using a relative `to=\"browse\"`\n // here causes an infinite path-compounding loop when a splat (`path=\"*\"`) matches a\n // host-shell sibling route (e.g. `/files/shared`): React Router resolves the\n // relative path against the splat-matched URL, so each render appends another\n // `/browse` segment (`/files/shared/browse/browse/...`).\n const absoluteBrowsePath = `${normalizedBasePath === \"/\" ? \"\" : normalizedBasePath}/browse`;\n\n if (location.pathname.startsWith(absoluteSharePrefix)) {\n return <ShareAccessPage />;\n }\n\n return (\n <Routes>\n {/* Default route - redirect to browse */}\n <Route index element={<Navigate to={absoluteBrowsePath} replace />} />\n\n {/* Main pages - BrowserPage is eager loaded (primary entry point) */}\n <Route path=\"browse\" element={<BrowserPage />} />\n <Route path=\"browse/:folderId\" element={<BrowserPage />} />\n <Route path=\"share/:token\" element={<ShareAccessPage />} />\n <Route path={absoluteSharePath} element={<ShareAccessPage />} />\n\n {/* Catch-all route - redirect to browse (absolute to avoid splat-relative compounding) */}\n <Route path=\"*\" element={<Navigate to={absoluteBrowsePath} replace />} />\n </Routes>\n );\n}\n"],"mappings":";;;;;;AAeA,SAAgB,IAAc;CAC5B,IAAM,EAAE,gBAAa,GAAiB,EAChC,IAAW,GAAa,EACxB,IAAqB,EAAS,QAAQ,QAAQ,GAAG,IAAI,KACrD,IAAoB,GAAG,MAAuB,MAAM,KAAK,EAAmB,gBAC5E,IAAsB,GAAG,MAAuB,MAAM,KAAK,EAAmB,UAM9E,IAAqB,GAAG,MAAuB,MAAM,KAAK,EAAmB;AAMnF,QAJI,EAAS,SAAS,WAAW,EAAoB,GAC5C,kBAAC,GAAD,EAAmB,CAAA,GAI1B,kBAAC,GAAD,EAAA,UAAA;EAEE,kBAAC,GAAD;GAAO,OAAA;GAAM,SAAS,kBAAC,GAAD;IAAU,IAAI;IAAoB,SAAA;IAAU,CAAA;GAAI,CAAA;EAGtE,kBAAC,GAAD;GAAO,MAAK;GAAS,SAAS,kBAAC,GAAD,EAAe,CAAA;GAAI,CAAA;EACjD,kBAAC,GAAD;GAAO,MAAK;GAAmB,SAAS,kBAAC,GAAD,EAAe,CAAA;GAAI,CAAA;EAC3D,kBAAC,GAAD;GAAO,MAAK;GAAe,SAAS,kBAAC,GAAD,EAAmB,CAAA;GAAI,CAAA;EAC3D,kBAAC,GAAD;GAAO,MAAM;GAAmB,SAAS,kBAAC,GAAD,EAAmB,CAAA;GAAI,CAAA;EAGhE,kBAAC,GAAD;GAAO,MAAK;GAAI,SAAS,kBAAC,GAAD;IAAU,IAAI;IAAoB,SAAA;IAAU,CAAA;GAAI,CAAA;EAClE,EAAA,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
export interface ActionMenuItem {
|
|
3
|
+
label: string;
|
|
4
|
+
icon?: React.ReactNode;
|
|
5
|
+
onClick: () => void;
|
|
6
|
+
variant?: "default" | "danger";
|
|
7
|
+
divider?: boolean;
|
|
8
|
+
}
|
|
9
|
+
interface ActionMenuProps {
|
|
10
|
+
items: ActionMenuItem[];
|
|
11
|
+
triggerClassName?: string;
|
|
12
|
+
menuClassName?: string;
|
|
13
|
+
align?: "left" | "right";
|
|
14
|
+
isOpen?: boolean;
|
|
15
|
+
onToggle?: (open: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare const ActionMenu: FC<ActionMenuProps>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=ActionMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenu.d.ts","sourceRoot":"","sources":["../../../src/files/components/ActionMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAA+B,MAAM,OAAO,CAAC;AAM7D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAsJ1C,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { tWithFallback as e } from "../utils/i18n.js";
|
|
2
|
+
import { useEffect as t, useRef as n, useState as r } from "react";
|
|
3
|
+
import { MoreVertical as i } from "lucide-react";
|
|
4
|
+
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
|
+
import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
6
|
+
import { createPortal as l } from "react-dom";
|
|
7
|
+
//#region src/files/components/ActionMenu.tsx
|
|
8
|
+
var u = ({ items: u, triggerClassName: d = "", menuClassName: f = "", align: p = "right", isOpen: m, onToggle: h }) => {
|
|
9
|
+
let { t: g } = c(), [_, v] = r(!1), [y, b] = r(null), x = n(null), S = n(null), C = m === void 0 ? _ : m, w = (e) => {
|
|
10
|
+
h ? h(e) : v(e);
|
|
11
|
+
};
|
|
12
|
+
t(() => {
|
|
13
|
+
if (C && x.current) {
|
|
14
|
+
let e = x.current.getBoundingClientRect(), t = p === "right" ? e.right - 200 : e.left;
|
|
15
|
+
t < 10 && (t = 10), t + 200 > window.innerWidth - 10 && (t = window.innerWidth - 200 - 10), b({
|
|
16
|
+
top: e.bottom + 4,
|
|
17
|
+
left: t
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}, [C, p]), t(() => {
|
|
21
|
+
let e = (e) => {
|
|
22
|
+
S.current && !S.current.contains(e.target) && w(!1);
|
|
23
|
+
};
|
|
24
|
+
if (C) return document.addEventListener("mousedown", e), () => {
|
|
25
|
+
document.removeEventListener("mousedown", e);
|
|
26
|
+
};
|
|
27
|
+
}, [C]), t(() => {
|
|
28
|
+
let e = (e) => {
|
|
29
|
+
e.key === "Escape" && w(!1);
|
|
30
|
+
};
|
|
31
|
+
if (C) return document.addEventListener("keydown", e), () => {
|
|
32
|
+
document.removeEventListener("keydown", e);
|
|
33
|
+
};
|
|
34
|
+
}, [C]);
|
|
35
|
+
let T = (e) => {
|
|
36
|
+
e.onClick(), w(!1);
|
|
37
|
+
};
|
|
38
|
+
return /* @__PURE__ */ s(a, { children: [/* @__PURE__ */ o("button", {
|
|
39
|
+
ref: x,
|
|
40
|
+
onClick: (e) => {
|
|
41
|
+
e.stopPropagation(), w(!C);
|
|
42
|
+
},
|
|
43
|
+
className: `p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors ${d}`,
|
|
44
|
+
"aria-label": e(g, "files.actionMenu.moreActions", "More actions"),
|
|
45
|
+
title: e(g, "files.actionMenu.moreActions", "More actions"),
|
|
46
|
+
"aria-expanded": C,
|
|
47
|
+
"aria-haspopup": "true",
|
|
48
|
+
children: /* @__PURE__ */ o(i, { className: "size-4 text-text-primary" })
|
|
49
|
+
}), !C || !y ? null : l(/* @__PURE__ */ o("div", {
|
|
50
|
+
ref: S,
|
|
51
|
+
className: `fixed z-[9999] min-w-[200px] bg-bg-elevated rounded-lg shadow-lg border border-border-default py-1 animate-in fade-in-0 zoom-in-95 duration-150 ${f}`,
|
|
52
|
+
style: {
|
|
53
|
+
top: `${y.top}px`,
|
|
54
|
+
left: `${y.left}px`
|
|
55
|
+
},
|
|
56
|
+
role: "menu",
|
|
57
|
+
children: u.map((e, t) => /* @__PURE__ */ s("div", { children: [e.divider && t > 0 && /* @__PURE__ */ o("div", { className: "h-px bg-border-subtle my-1" }), /* @__PURE__ */ s("button", {
|
|
58
|
+
onClick: (t) => {
|
|
59
|
+
t.stopPropagation(), T(e);
|
|
60
|
+
},
|
|
61
|
+
className: `w-full flex items-center gap-3 px-4 py-2 text-sm transition-all duration-150 ${e.variant === "danger" ? "text-status-error-text hover:bg-status-error-bg-subtle" : "text-text-primary hover:bg-action-ghost-bg-hover"}`,
|
|
62
|
+
role: "menuitem",
|
|
63
|
+
children: [e.icon && /* @__PURE__ */ o("span", {
|
|
64
|
+
className: "flex-shrink-0",
|
|
65
|
+
children: e.icon
|
|
66
|
+
}), /* @__PURE__ */ o("span", { children: e.label })]
|
|
67
|
+
})] }, t))
|
|
68
|
+
}), document.body)] });
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
export { u as ActionMenu };
|
|
72
|
+
|
|
73
|
+
//# sourceMappingURL=ActionMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenu.js","names":[],"sources":["../../../src/files/components/ActionMenu.tsx"],"sourcesContent":["import { type FC, useState, useRef, useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { MoreVertical } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { tWithFallback } from \"../utils/i18n\";\n\nexport interface ActionMenuItem {\n label: string;\n icon?: React.ReactNode;\n onClick: () => void;\n variant?: \"default\" | \"danger\";\n divider?: boolean;\n}\n\ninterface ActionMenuProps {\n items: ActionMenuItem[];\n triggerClassName?: string;\n menuClassName?: string;\n align?: \"left\" | \"right\";\n isOpen?: boolean;\n onToggle?: (open: boolean) => void;\n}\n\nexport const ActionMenu: FC<ActionMenuProps> = ({\n items,\n triggerClassName = \"\",\n menuClassName = \"\",\n align = \"right\",\n isOpen: controlledIsOpen,\n onToggle,\n}) => {\n const { t } = useI18n();\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Use controlled state if provided, otherwise use internal state\n const isOpen =\n controlledIsOpen !== undefined ? controlledIsOpen : internalIsOpen;\n const setIsOpen = (open: boolean) => {\n if (onToggle) {\n onToggle(open);\n } else {\n setInternalIsOpen(open);\n }\n };\n\n // Calculate menu position when opening\n useEffect(() => {\n if (isOpen && buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n const menuWidth = 200; // Approximate menu width\n\n let left = align === \"right\" ? rect.right - menuWidth : rect.left;\n\n // Ensure menu doesn't go off-screen\n if (left < 10) left = 10;\n if (left + menuWidth > window.innerWidth - 10) {\n left = window.innerWidth - menuWidth - 10;\n }\n\n setMenuPosition({\n top: rect.bottom + 4, // 4px gap below button\n left: left,\n });\n }\n }, [isOpen, align]);\n\n // Close menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }\n }, [isOpen]);\n\n // Close menu on Escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }\n }, [isOpen]);\n\n const handleItemClick = (item: ActionMenuItem) => {\n item.onClick();\n setIsOpen(false);\n };\n\n // Render menu dropdown\n const renderMenu = () => {\n if (!isOpen || !menuPosition) return null;\n\n return createPortal(\n <div\n ref={menuRef}\n className={`fixed z-[9999] min-w-[200px] bg-bg-elevated rounded-lg shadow-lg border border-border-default py-1 animate-in fade-in-0 zoom-in-95 duration-150 ${menuClassName}`}\n style={{\n top: `${menuPosition.top}px`,\n left: `${menuPosition.left}px`,\n }}\n role=\"menu\"\n >\n {items.map((item, index) => (\n <div key={index}>\n {item.divider && index > 0 && (\n <div className=\"h-px bg-border-subtle my-1\" />\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleItemClick(item);\n }}\n className={`w-full flex items-center gap-3 px-4 py-2 text-sm transition-all duration-150 ${\n item.variant === \"danger\"\n ? \"text-status-error-text hover:bg-status-error-bg-subtle\"\n : \"text-text-primary hover:bg-action-ghost-bg-hover\"\n }`}\n role=\"menuitem\"\n >\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span>{item.label}</span>\n </button>\n </div>\n ))}\n </div>,\n document.body,\n );\n };\n\n return (\n <>\n <button\n ref={buttonRef}\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen(!isOpen);\n }}\n className={`p-1.5 hover:bg-action-ghost-bg-hover rounded transition-colors ${triggerClassName}`}\n aria-label={tWithFallback(\n t,\n \"files.actionMenu.moreActions\",\n \"More actions\",\n )}\n title={tWithFallback(t, \"files.actionMenu.moreActions\", \"More actions\")}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n <MoreVertical className=\"size-4 text-text-primary\" />\n </button>\n {renderMenu()}\n </>\n );\n};\n"],"mappings":";;;;;;;AAuBA,IAAa,KAAmC,EAC9C,UACA,sBAAmB,IACnB,mBAAgB,IAChB,WAAQ,SACR,QAAQ,GACR,kBACI;CACJ,IAAM,EAAE,SAAM,GAAS,EACjB,CAAC,GAAgB,KAAqB,EAAS,GAAM,EACrD,CAAC,GAAc,KAAmB,EAG9B,KAAK,EACT,IAAY,EAA0B,KAAK,EAC3C,IAAU,EAAuB,KAAK,EAGtC,IACJ,MAAqB,KAAA,IAA+B,IAAnB,GAC7B,KAAa,MAAkB;AACnC,EAAI,IACF,EAAS,EAAK,GAEd,EAAkB,EAAK;;AA0C3B,CArCA,QAAgB;AACd,MAAI,KAAU,EAAU,SAAS;GAC/B,IAAM,IAAO,EAAU,QAAQ,uBAAuB,EAGlD,IAAO,MAAU,UAAU,EAAK,QAAQ,MAAY,EAAK;AAQ7D,GALI,IAAO,OAAI,IAAO,KAClB,IAAO,MAAY,OAAO,aAAa,OACzC,IAAO,OAAO,aAAa,MAAY,KAGzC,EAAgB;IACd,KAAK,EAAK,SAAS;IACb;IACP,CAAC;;IAEH,CAAC,GAAQ,EAAM,CAAC,EAGnB,QAAgB;EACd,IAAM,KAAsB,MAAsB;AAChD,GAAI,EAAQ,WAAW,CAAC,EAAQ,QAAQ,SAAS,EAAM,OAAe,IACpE,EAAU,GAAM;;AAIpB,MAAI,EAEF,QADA,SAAS,iBAAiB,aAAa,EAAmB,QAC7C;AACX,YAAS,oBAAoB,aAAa,EAAmB;;IAGhE,CAAC,EAAO,CAAC,EAGZ,QAAgB;EACd,IAAM,KAAgB,MAAyB;AAC7C,GAAI,EAAM,QAAQ,YAChB,EAAU,GAAM;;AAIpB,MAAI,EAEF,QADA,SAAS,iBAAiB,WAAW,EAAa,QACrC;AACX,YAAS,oBAAoB,WAAW,EAAa;;IAGxD,CAAC,EAAO,CAAC;CAEZ,IAAM,KAAmB,MAAyB;AAEhD,EADA,EAAK,SAAS,EACd,EAAU,GAAM;;AA4ClB,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;EACE,KAAK;EACL,UAAU,MAAM;AAEd,GADA,EAAE,iBAAiB,EACnB,EAAU,CAAC,EAAO;;EAEpB,WAAW,kEAAkE;EAC7E,cAAY,EACV,GACA,gCACA,eACD;EACD,OAAO,EAAc,GAAG,gCAAgC,eAAe;EACvE,iBAAe;EACf,iBAAc;YAEd,kBAAC,GAAD,EAAc,WAAU,4BAA6B,CAAA;EAC9C,CAAA,EA1DP,CAAC,KAAU,CAAC,IAAqB,OAE9B,EACL,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,mJAAmJ;EAC9J,OAAO;GACL,KAAK,GAAG,EAAa,IAAI;GACzB,MAAM,GAAG,EAAa,KAAK;GAC5B;EACD,MAAK;YAEJ,EAAM,KAAK,GAAM,MAChB,kBAAC,OAAD,EAAA,UAAA,CACG,EAAK,WAAW,IAAQ,KACvB,kBAAC,OAAD,EAAK,WAAU,8BAA+B,CAAA,EAEhD,kBAAC,UAAD;GACE,UAAU,MAAM;AAEd,IADA,EAAE,iBAAiB,EACnB,EAAgB,EAAK;;GAEvB,WAAW,gFACT,EAAK,YAAY,WACb,2DACA;GAEN,MAAK;aAVP,CAYG,EAAK,QAAQ,kBAAC,QAAD;IAAM,WAAU;cAAiB,EAAK;IAAY,CAAA,EAChE,kBAAC,QAAD,EAAA,UAAO,EAAK,OAAa,CAAA,CAClB;KACL,EAAA,EAnBI,EAmBJ,CACN;EACE,CAAA,EACN,SAAS,KACV,CAwBE,EAAA,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
interface ConfirmDialogProps {
|
|
3
|
+
title: string;
|
|
4
|
+
description: ReactNode;
|
|
5
|
+
confirmLabel: string;
|
|
6
|
+
cancelLabel: string;
|
|
7
|
+
variant?: "danger" | "default";
|
|
8
|
+
loading?: boolean;
|
|
9
|
+
onConfirm: () => void;
|
|
10
|
+
onCancel: () => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function ConfirmDialog({ title, description, confirmLabel, cancelLabel, variant, loading, onConfirm, onCancel, }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=ConfirmDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/files/components/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA4B,MAAM,OAAO,CAAC;AAGjE,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,SAAS,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,OAAmB,EACnB,OAAe,EACf,SAAS,EACT,QAAQ,GACT,EAAE,kBAAkB,2CA8FpB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { useEffect as e, useId as t, useRef as n } from "react";
|
|
2
|
+
import { AlertTriangle as r, Loader2 as i, X as a } from "lucide-react";
|
|
3
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
+
//#region src/files/components/ConfirmDialog.tsx
|
|
5
|
+
function c({ title: c, description: l, confirmLabel: u, cancelLabel: d, variant: f = "default", loading: p = !1, onConfirm: m, onCancel: h }) {
|
|
6
|
+
let g = t(), _ = t(), v = n(null);
|
|
7
|
+
return e(() => {
|
|
8
|
+
v.current?.focus();
|
|
9
|
+
let e = (e) => {
|
|
10
|
+
e.key === "Escape" && !p && h();
|
|
11
|
+
};
|
|
12
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
13
|
+
}, [p, h]), /* @__PURE__ */ o("div", {
|
|
14
|
+
className: "fixed inset-0 z-[140] flex items-center justify-center bg-bg-overlay p-4",
|
|
15
|
+
role: "presentation",
|
|
16
|
+
onMouseDown: (e) => {
|
|
17
|
+
e.target === e.currentTarget && !p && h();
|
|
18
|
+
},
|
|
19
|
+
children: /* @__PURE__ */ s("section", {
|
|
20
|
+
role: "alertdialog",
|
|
21
|
+
"aria-modal": "true",
|
|
22
|
+
"aria-labelledby": g,
|
|
23
|
+
"aria-describedby": _,
|
|
24
|
+
className: "w-full max-w-md rounded-2xl border border-border-default bg-bg-surface p-5 shadow-elevation-3",
|
|
25
|
+
children: [/* @__PURE__ */ s("div", {
|
|
26
|
+
className: "flex items-start gap-3",
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ o("div", {
|
|
29
|
+
className: "rounded-full bg-status-warning-bg-subtle p-2 text-status-warning-text",
|
|
30
|
+
children: /* @__PURE__ */ o(r, {
|
|
31
|
+
className: "size-5",
|
|
32
|
+
"aria-hidden": "true"
|
|
33
|
+
})
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ s("div", {
|
|
36
|
+
className: "min-w-0 flex-1",
|
|
37
|
+
children: [/* @__PURE__ */ o("h2", {
|
|
38
|
+
id: g,
|
|
39
|
+
className: "text-base font-semibold text-text-primary",
|
|
40
|
+
children: c
|
|
41
|
+
}), /* @__PURE__ */ o("div", {
|
|
42
|
+
id: _,
|
|
43
|
+
className: "mt-2 text-sm leading-6 text-text-secondary",
|
|
44
|
+
children: l
|
|
45
|
+
})]
|
|
46
|
+
}),
|
|
47
|
+
/* @__PURE__ */ o("button", {
|
|
48
|
+
type: "button",
|
|
49
|
+
onClick: h,
|
|
50
|
+
disabled: p,
|
|
51
|
+
className: "rounded-lg p-1 text-text-tertiary transition-colors hover:bg-bg-muted hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border disabled:cursor-not-allowed disabled:opacity-50",
|
|
52
|
+
"aria-label": d,
|
|
53
|
+
children: /* @__PURE__ */ o(a, {
|
|
54
|
+
className: "size-4",
|
|
55
|
+
"aria-hidden": "true"
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
]
|
|
59
|
+
}), /* @__PURE__ */ s("div", {
|
|
60
|
+
className: "mt-6 flex flex-col-reverse gap-3 sm:flex-row sm:justify-end",
|
|
61
|
+
children: [/* @__PURE__ */ o("button", {
|
|
62
|
+
ref: v,
|
|
63
|
+
type: "button",
|
|
64
|
+
onClick: h,
|
|
65
|
+
disabled: p,
|
|
66
|
+
className: "inline-flex items-center justify-center rounded-lg border border-border-default bg-bg-surface px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border disabled:cursor-not-allowed disabled:opacity-50",
|
|
67
|
+
children: d
|
|
68
|
+
}), /* @__PURE__ */ s("button", {
|
|
69
|
+
type: "button",
|
|
70
|
+
onClick: m,
|
|
71
|
+
disabled: p,
|
|
72
|
+
className: `inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-60 ${f === "danger" ? "bg-status-error-bg text-text-inverse hover:bg-status-error-bg focus-visible:ring-status-error-border" : "bg-action-primary-bg text-text-inverse hover:bg-action-primary-bg-hover focus-visible:ring-action-primary-border"}`,
|
|
73
|
+
children: [p && /* @__PURE__ */ o(i, {
|
|
74
|
+
className: "size-4 animate-spin",
|
|
75
|
+
"aria-hidden": "true"
|
|
76
|
+
}), u]
|
|
77
|
+
})]
|
|
78
|
+
})]
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { c as ConfirmDialog };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=ConfirmDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","names":[],"sources":["../../../src/files/components/ConfirmDialog.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useId, useRef } from \"react\";\nimport { AlertTriangle, Loader2, X } from \"lucide-react\";\n\ninterface ConfirmDialogProps {\n title: string;\n description: ReactNode;\n confirmLabel: string;\n cancelLabel: string;\n variant?: \"danger\" | \"default\";\n loading?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n title,\n description,\n confirmLabel,\n cancelLabel,\n variant = \"default\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n const titleId = useId();\n const descriptionId = useId();\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n\n useEffect(() => {\n cancelButtonRef.current?.focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && !loading) {\n onCancel();\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [loading, onCancel]);\n\n const confirmClassName =\n variant === \"danger\"\n ? \"bg-status-error-bg text-text-inverse hover:bg-status-error-bg focus-visible:ring-status-error-border\"\n : \"bg-action-primary-bg text-text-inverse hover:bg-action-primary-bg-hover focus-visible:ring-action-primary-border\";\n\n return (\n <div\n className=\"fixed inset-0 z-[140] flex items-center justify-center bg-bg-overlay p-4\"\n role=\"presentation\"\n onMouseDown={(event) => {\n if (event.target === event.currentTarget && !loading) {\n onCancel();\n }\n }}\n >\n <section\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n className=\"w-full max-w-md rounded-2xl border border-border-default bg-bg-surface p-5 shadow-elevation-3\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"rounded-full bg-status-warning-bg-subtle p-2 text-status-warning-text\">\n <AlertTriangle className=\"size-5\" aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h2\n id={titleId}\n className=\"text-base font-semibold text-text-primary\"\n >\n {title}\n </h2>\n <div\n id={descriptionId}\n className=\"mt-2 text-sm leading-6 text-text-secondary\"\n >\n {description}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCancel}\n disabled={loading}\n className=\"rounded-lg p-1 text-text-tertiary transition-colors hover:bg-bg-muted hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border disabled:cursor-not-allowed disabled:opacity-50\"\n aria-label={cancelLabel}\n >\n <X className=\"size-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className=\"mt-6 flex flex-col-reverse gap-3 sm:flex-row sm:justify-end\">\n <button\n ref={cancelButtonRef}\n type=\"button\"\n onClick={onCancel}\n disabled={loading}\n className=\"inline-flex items-center justify-center rounded-lg border border-border-default bg-bg-surface px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n disabled={loading}\n className={`inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-60 ${confirmClassName}`}\n >\n {loading && (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n )}\n {confirmLabel}\n </button>\n </div>\n </section>\n </div>\n );\n}\n"],"mappings":";;;;AAcA,SAAgB,EAAc,EAC5B,UACA,gBACA,iBACA,gBACA,aAAU,WACV,aAAU,IACV,cACA,eACqB;CACrB,IAAM,IAAU,GAAO,EACjB,IAAgB,GAAO,EACvB,IAAkB,EAA0B,KAAK;AAoBvD,QAlBA,QAAgB;AACd,IAAgB,SAAS,OAAO;EAEhC,IAAM,KAAiB,MAAyB;AAC9C,GAAI,EAAM,QAAQ,YAAY,CAAC,KAC7B,GAAU;;AAKd,SADA,SAAS,iBAAiB,WAAW,EAAc,QACtC,SAAS,oBAAoB,WAAW,EAAc;IAClE,CAAC,GAAS,EAAS,CAAC,EAQrB,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,cAAc,MAAU;AACtB,GAAI,EAAM,WAAW,EAAM,iBAAiB,CAAC,KAC3C,GAAU;;YAId,kBAAC,WAAD;GACE,MAAK;GACL,cAAW;GACX,mBAAiB;GACjB,oBAAkB;GAClB,WAAU;aALZ,CAOE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAe,WAAU;OAAS,eAAY;OAAS,CAAA;MACnD,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OACE,IAAI;OACJ,WAAU;iBAET;OACE,CAAA,EACL,kBAAC,OAAD;OACE,IAAI;OACJ,WAAU;iBAET;OACG,CAAA,CACF;;KACN,kBAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAU;MACV,cAAY;gBAEZ,kBAAC,GAAD;OAAG,WAAU;OAAS,eAAY;OAAS,CAAA;MACpC,CAAA;KACL;OAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,UAAD;KACE,KAAK;KACL,MAAK;KACL,SAAS;KACT,UAAU;KACV,WAAU;eAET;KACM,CAAA,EACT,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,UAAU;KACV,WAAW,4MAhEnB,MAAY,WACR,yGACA;eA0DE,CAMG,KACC,kBAAC,GAAD;MAAS,WAAU;MAAsB,eAAY;MAAS,CAAA,EAE/D,EACM;OACL;MACE;;EACN,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { I18nContextValue } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';
|
|
2
|
+
interface ContextMenuProps {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
items: {
|
|
7
|
+
label: string;
|
|
8
|
+
icon: React.ReactNode;
|
|
9
|
+
onClick: () => void;
|
|
10
|
+
variant?: "default" | "danger";
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
}[];
|
|
13
|
+
}
|
|
14
|
+
export declare function ContextMenu({ x, y, onClose, items }: ContextMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function createFileMenuItems(options: {
|
|
16
|
+
onShare?: () => void;
|
|
17
|
+
onDownload?: () => void;
|
|
18
|
+
onCopy?: () => void;
|
|
19
|
+
onRename?: () => void;
|
|
20
|
+
onStar?: () => void;
|
|
21
|
+
onMove?: () => void;
|
|
22
|
+
onInfo?: () => void;
|
|
23
|
+
onActivity?: () => void;
|
|
24
|
+
onRestore?: () => void;
|
|
25
|
+
onDelete?: () => void;
|
|
26
|
+
isStarred?: boolean;
|
|
27
|
+
}, t: I18nContextValue["t"]): ({
|
|
28
|
+
label: string;
|
|
29
|
+
icon: import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
onClick: () => void;
|
|
31
|
+
variant?: undefined;
|
|
32
|
+
} | {
|
|
33
|
+
label: string;
|
|
34
|
+
icon: import("react/jsx-runtime").JSX.Element;
|
|
35
|
+
onClick: () => void;
|
|
36
|
+
variant: "danger";
|
|
37
|
+
})[];
|
|
38
|
+
export declare function createFolderMenuItems(options: {
|
|
39
|
+
onShare?: () => void;
|
|
40
|
+
onRename?: () => void;
|
|
41
|
+
onStar?: () => void;
|
|
42
|
+
onMove?: () => void;
|
|
43
|
+
onInfo?: () => void;
|
|
44
|
+
onRestore?: () => void;
|
|
45
|
+
onDelete?: () => void;
|
|
46
|
+
isStarred?: boolean;
|
|
47
|
+
}, t: I18nContextValue["t"]): ({
|
|
48
|
+
label: string;
|
|
49
|
+
icon: import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
onClick: () => void;
|
|
51
|
+
variant?: undefined;
|
|
52
|
+
} | {
|
|
53
|
+
label: string;
|
|
54
|
+
icon: import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
onClick: () => void;
|
|
56
|
+
variant: "danger";
|
|
57
|
+
})[];
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=ContextMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMenu.d.ts","sourceRoot":"","sources":["../../../src/files/components/ContextMenu.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAC;AAG/F,UAAU,gBAAgB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;QACtB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,EAAE,CAAC;CACL;AAED,wBAAgB,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA0DrE;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC;;;mBAZN,IAAI;;;;;mBASH,IAAI;;KAgHxB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,EACD,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC;;;mBATN,IAAI;;;;;mBAMH,IAAI;;KAiFxB"}
|