@tulip-systems/drive 0.8.1 → 0.8.2
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/dist/client.d.mts +5 -0
- package/dist/client.mjs +6 -0
- package/dist/components/content.d.mts +14 -0
- package/dist/components/content.d.mts.map +1 -0
- package/dist/components/content.mjs +18 -0
- package/dist/components/content.mjs.map +1 -0
- package/dist/components/context.client.d.mts +14 -0
- package/dist/components/context.client.d.mts.map +1 -0
- package/dist/components/dnd.client.d.mts +17 -0
- package/dist/components/dnd.client.d.mts.map +1 -0
- package/dist/components/dnd.client.mjs +30 -0
- package/dist/components/dnd.client.mjs.map +1 -0
- package/dist/components/grid-card.client.d.mts +43 -0
- package/dist/components/grid-card.client.d.mts.map +1 -0
- package/dist/components/grid-card.client.mjs +173 -0
- package/dist/components/grid-card.client.mjs.map +1 -0
- package/dist/components/grid.client.d.mts +54 -0
- package/dist/components/grid.client.d.mts.map +1 -0
- package/dist/components/grid.client.mjs +54 -0
- package/dist/components/grid.client.mjs.map +1 -0
- package/dist/components/navigation/breadcrumbs.client.d.mts +26 -0
- package/dist/components/navigation/breadcrumbs.client.d.mts.map +1 -0
- package/dist/components/navigation/breadcrumbs.client.mjs +52 -0
- package/dist/components/navigation/breadcrumbs.client.mjs.map +1 -0
- package/dist/components/navigation/header.client.d.mts +28 -0
- package/dist/components/navigation/header.client.d.mts.map +1 -0
- package/dist/components/navigation/header.client.mjs +41 -0
- package/dist/components/navigation/header.client.mjs.map +1 -0
- package/dist/components/navigation/toolbar.client.d.mts +24 -0
- package/dist/components/navigation/toolbar.client.d.mts.map +1 -0
- package/dist/components/navigation/toolbar.client.mjs +35 -0
- package/dist/components/navigation/toolbar.client.mjs.map +1 -0
- package/dist/components/navigation/view-switcher.client.d.mts +10 -0
- package/dist/components/navigation/view-switcher.client.d.mts.map +1 -0
- package/dist/components/navigation/view-switcher.client.mjs +36 -0
- package/dist/components/navigation/view-switcher.client.mjs.map +1 -0
- package/dist/components/selection.client.d.mts +28 -0
- package/dist/components/selection.client.d.mts.map +1 -0
- package/dist/components/selection.client.mjs +39 -0
- package/dist/components/selection.client.mjs.map +1 -0
- package/dist/components/view.client.d.mts +26 -0
- package/dist/components/view.client.d.mts.map +1 -0
- package/dist/components/view.client.mjs +44 -0
- package/dist/components/view.client.mjs.map +1 -0
- package/dist/config/filters.mjs +15 -0
- package/dist/config/filters.mjs.map +1 -0
- package/dist/config/types.mjs +61 -0
- package/dist/config/types.mjs.map +1 -0
- package/dist/google/client.d.mts +8 -0
- package/dist/google/client.mjs +9 -0
- package/dist/google/server.d.mts +3 -0
- package/dist/google/server.mjs +4 -0
- package/dist/google.d.mts +6 -0
- package/dist/google.mjs +7 -0
- package/dist/index.d.mts +7 -0
- package/dist/index.mjs +7 -0
- package/dist/lib/constants.d.mts +12 -0
- package/dist/lib/constants.d.mts.map +1 -0
- package/dist/lib/constants.mjs +21 -0
- package/dist/lib/constants.mjs.map +1 -0
- package/dist/lib/contracts.d.mts +101 -0
- package/dist/lib/contracts.d.mts.map +1 -0
- package/dist/lib/dto.d.mts +118 -0
- package/dist/lib/dto.d.mts.map +1 -0
- package/dist/lib/dto.mjs +58 -0
- package/dist/lib/dto.mjs.map +1 -0
- package/dist/lib/helpers.d.mts +18 -0
- package/dist/lib/helpers.d.mts.map +1 -0
- package/dist/lib/helpers.mjs +37 -0
- package/dist/lib/helpers.mjs.map +1 -0
- package/dist/lib/helpers.server.d.mts +14 -0
- package/dist/lib/helpers.server.d.mts.map +1 -0
- package/dist/lib/helpers.server.mjs +16 -0
- package/dist/lib/helpers.server.mjs.map +1 -0
- package/dist/lib/search-params.d.mts +9 -0
- package/dist/lib/search-params.d.mts.map +1 -0
- package/dist/lib/search-params.mjs +8 -0
- package/dist/lib/search-params.mjs.map +1 -0
- package/dist/lib/validators.d.mts +158 -0
- package/dist/lib/validators.d.mts.map +1 -0
- package/dist/lib/validators.mjs +66 -0
- package/dist/lib/validators.mjs.map +1 -0
- package/dist/local/client.d.mts +13 -0
- package/dist/local/client.mjs +13 -0
- package/dist/local/server.d.mts +4 -0
- package/dist/local/server.mjs +5 -0
- package/dist/local.d.mts +8 -0
- package/dist/local.mjs +9 -0
- package/dist/providers/google/components/command-file-update.d.mts +22 -0
- package/dist/providers/google/components/command-file-update.d.mts.map +1 -0
- package/dist/providers/google/components/command-file-update.mjs +52 -0
- package/dist/providers/google/components/command-file-update.mjs.map +1 -0
- package/dist/providers/google/components/command-folder-create.d.mts +22 -0
- package/dist/providers/google/components/command-folder-create.d.mts.map +1 -0
- package/dist/providers/google/components/command-folder-create.mjs +59 -0
- package/dist/providers/google/components/command-folder-create.mjs.map +1 -0
- package/dist/providers/google/components/command-folder-update.d.mts +22 -0
- package/dist/providers/google/components/command-folder-update.d.mts.map +1 -0
- package/dist/providers/google/components/command-folder-update.mjs +52 -0
- package/dist/providers/google/components/command-folder-update.mjs.map +1 -0
- package/dist/providers/google/components/content.client.d.mts +10 -0
- package/dist/providers/google/components/content.client.d.mts.map +1 -0
- package/dist/providers/google/components/content.client.mjs +11 -0
- package/dist/providers/google/components/content.client.mjs.map +1 -0
- package/dist/providers/google/components/navigation.client.d.mts +16 -0
- package/dist/providers/google/components/navigation.client.d.mts.map +1 -0
- package/dist/providers/google/components/navigation.client.mjs +18 -0
- package/dist/providers/google/components/navigation.client.mjs.map +1 -0
- package/dist/providers/google/components/provider.client.d.mts +33 -0
- package/dist/providers/google/components/provider.client.d.mts.map +1 -0
- package/dist/providers/google/components/provider.client.mjs +43 -0
- package/dist/providers/google/components/provider.client.mjs.map +1 -0
- package/dist/providers/google/components/view.client.d.mts +41 -0
- package/dist/providers/google/components/view.client.d.mts.map +1 -0
- package/dist/providers/google/components/view.client.mjs +98 -0
- package/dist/providers/google/components/view.client.mjs.map +1 -0
- package/dist/providers/google/config/columns-data.d.mts +8 -0
- package/dist/providers/google/config/columns-data.d.mts.map +1 -0
- package/dist/providers/google/config/columns-data.mjs +70 -0
- package/dist/providers/google/config/columns-data.mjs.map +1 -0
- package/dist/providers/google/config/filters.d.mts +16 -0
- package/dist/providers/google/config/filters.d.mts.map +1 -0
- package/dist/providers/google/config/filters.mjs +8 -0
- package/dist/providers/google/config/filters.mjs.map +1 -0
- package/dist/providers/google/lib/constants.mjs +13 -0
- package/dist/providers/google/lib/constants.mjs.map +1 -0
- package/dist/providers/google/lib/dto.d.mts +39 -0
- package/dist/providers/google/lib/dto.d.mts.map +1 -0
- package/dist/providers/google/lib/dto.mjs +66 -0
- package/dist/providers/google/lib/dto.mjs.map +1 -0
- package/dist/providers/google/lib/helpers.mjs +46 -0
- package/dist/providers/google/lib/helpers.mjs.map +1 -0
- package/dist/providers/google/lib/router.server.d.mts +612 -0
- package/dist/providers/google/lib/router.server.d.mts.map +1 -0
- package/dist/providers/google/lib/router.server.mjs +40 -0
- package/dist/providers/google/lib/router.server.mjs.map +1 -0
- package/dist/providers/google/lib/search-params.d.mts +15 -0
- package/dist/providers/google/lib/search-params.d.mts.map +1 -0
- package/dist/providers/google/lib/search-params.mjs +12 -0
- package/dist/providers/google/lib/search-params.mjs.map +1 -0
- package/dist/providers/google/lib/service.server.d.mts +186 -0
- package/dist/providers/google/lib/service.server.d.mts.map +1 -0
- package/dist/providers/google/lib/service.server.mjs +613 -0
- package/dist/providers/google/lib/service.server.mjs.map +1 -0
- package/dist/providers/google/lib/validators.d.mts +303 -0
- package/dist/providers/google/lib/validators.d.mts.map +1 -0
- package/dist/providers/google/lib/validators.mjs +59 -0
- package/dist/providers/google/lib/validators.mjs.map +1 -0
- package/dist/providers/local/components/command-file-update.d.mts +18 -0
- package/dist/providers/local/components/command-file-update.d.mts.map +1 -0
- package/dist/providers/local/components/command-file-update.mjs +48 -0
- package/dist/providers/local/components/command-file-update.mjs.map +1 -0
- package/dist/providers/local/components/command-file-upload.d.mts +11 -0
- package/dist/providers/local/components/command-file-upload.d.mts.map +1 -0
- package/dist/providers/local/components/command-file-upload.mjs +35 -0
- package/dist/providers/local/components/command-file-upload.mjs.map +1 -0
- package/dist/providers/local/components/command-folder-create.d.mts +18 -0
- package/dist/providers/local/components/command-folder-create.d.mts.map +1 -0
- package/dist/providers/local/components/command-folder-create.mjs +55 -0
- package/dist/providers/local/components/command-folder-create.mjs.map +1 -0
- package/dist/providers/local/components/command-folder-update.d.mts +18 -0
- package/dist/providers/local/components/command-folder-update.d.mts.map +1 -0
- package/dist/providers/local/components/command-folder-update.mjs +48 -0
- package/dist/providers/local/components/command-folder-update.mjs.map +1 -0
- package/dist/providers/local/components/content.client.d.mts +7 -0
- package/dist/providers/local/components/content.client.d.mts.map +1 -0
- package/dist/providers/local/components/content.client.mjs +8 -0
- package/dist/providers/local/components/content.client.mjs.map +1 -0
- package/dist/providers/local/components/navigation.client.d.mts +16 -0
- package/dist/providers/local/components/navigation.client.d.mts.map +1 -0
- package/dist/providers/local/components/navigation.client.mjs +18 -0
- package/dist/providers/local/components/navigation.client.mjs.map +1 -0
- package/dist/providers/local/components/provider.client.d.mts +40 -0
- package/dist/providers/local/components/provider.client.d.mts.map +1 -0
- package/dist/providers/local/components/provider.client.mjs +61 -0
- package/dist/providers/local/components/provider.client.mjs.map +1 -0
- package/dist/providers/local/components/upload-zone-context.client.d.mts +38 -0
- package/dist/providers/local/components/upload-zone-context.client.d.mts.map +1 -0
- package/dist/providers/local/components/upload-zone-context.client.mjs +23 -0
- package/dist/providers/local/components/upload-zone-context.client.mjs.map +1 -0
- package/dist/providers/local/components/upload-zone.client.d.mts +30 -0
- package/dist/providers/local/components/upload-zone.client.d.mts.map +1 -0
- package/dist/providers/local/components/upload-zone.client.mjs +147 -0
- package/dist/providers/local/components/upload-zone.client.mjs.map +1 -0
- package/dist/providers/local/components/view.client.d.mts +32 -0
- package/dist/providers/local/components/view.client.d.mts.map +1 -0
- package/dist/providers/local/components/view.client.mjs +91 -0
- package/dist/providers/local/components/view.client.mjs.map +1 -0
- package/dist/providers/local/config/columns-data.d.mts +8 -0
- package/dist/providers/local/config/columns-data.d.mts.map +1 -0
- package/dist/providers/local/config/columns-data.mjs +70 -0
- package/dist/providers/local/config/columns-data.mjs.map +1 -0
- package/dist/providers/local/config/filters.d.mts +26 -0
- package/dist/providers/local/config/filters.d.mts.map +1 -0
- package/dist/providers/local/config/filters.mjs +15 -0
- package/dist/providers/local/config/filters.mjs.map +1 -0
- package/dist/providers/local/lib/constants.d.mts +12 -0
- package/dist/providers/local/lib/constants.d.mts.map +1 -0
- package/dist/providers/local/lib/constants.mjs +29 -0
- package/dist/providers/local/lib/constants.mjs.map +1 -0
- package/dist/providers/local/lib/helpers.d.mts +45 -0
- package/dist/providers/local/lib/helpers.d.mts.map +1 -0
- package/dist/providers/local/lib/helpers.mjs +110 -0
- package/dist/providers/local/lib/helpers.mjs.map +1 -0
- package/dist/providers/local/lib/route-handler.server.d.mts +34 -0
- package/dist/providers/local/lib/route-handler.server.d.mts.map +1 -0
- package/dist/providers/local/lib/route-handler.server.mjs +114 -0
- package/dist/providers/local/lib/route-handler.server.mjs.map +1 -0
- package/dist/providers/local/lib/router.server.d.mts +41648 -0
- package/dist/providers/local/lib/router.server.d.mts.map +1 -0
- package/dist/providers/local/lib/router.server.mjs +52 -0
- package/dist/providers/local/lib/router.server.mjs.map +1 -0
- package/dist/providers/local/lib/schema.d.mts +1113 -0
- package/dist/providers/local/lib/schema.d.mts.map +1 -0
- package/dist/providers/local/lib/schema.mjs +71 -0
- package/dist/providers/local/lib/schema.mjs.map +1 -0
- package/dist/providers/local/lib/search-params.d.mts +14 -0
- package/dist/providers/local/lib/search-params.d.mts.map +1 -0
- package/dist/providers/local/lib/search-params.mjs +9 -0
- package/dist/providers/local/lib/search-params.mjs.map +1 -0
- package/dist/providers/local/lib/service.server.d.mts +489 -0
- package/dist/providers/local/lib/service.server.d.mts.map +1 -0
- package/dist/providers/local/lib/service.server.mjs +668 -0
- package/dist/providers/local/lib/service.server.mjs.map +1 -0
- package/dist/providers/local/lib/upload.client.d.mts +62 -0
- package/dist/providers/local/lib/upload.client.d.mts.map +1 -0
- package/dist/providers/local/lib/upload.client.mjs +100 -0
- package/dist/providers/local/lib/upload.client.mjs.map +1 -0
- package/dist/providers/local/lib/validators.d.mts +454 -0
- package/dist/providers/local/lib/validators.d.mts.map +1 -0
- package/dist/providers/local/lib/validators.mjs +96 -0
- package/dist/providers/local/lib/validators.mjs.map +1 -0
- package/dist/server.d.mts +2 -0
- package/dist/server.mjs +3 -0
- package/package.json +3 -2
- package/src/providers/local/lib/helpers.ts +0 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridEmptyProps, DriveGridLoading, DriveGridLoadingProps, DriveGridProps } from "./components/grid.client.mjs";
|
|
2
|
+
import { DriveGridCard, DriveGridCardSkeleton, DriveGridFileCard, DriveGridFolderCard } from "./components/grid-card.client.mjs";
|
|
3
|
+
import { DriveSelectionContextValue, DriveSelectionProvider, useDriveSelectionContext } from "./components/selection.client.mjs";
|
|
4
|
+
import { DriveViewContextValue, DriveViewMode, DriveViewProvider, DriveViewProviderProps, useDriveViewContext } from "./components/view.client.mjs";
|
|
5
|
+
export { DriveGrid, DriveGridBottombar, DriveGridCard, DriveGridCardSkeleton, DriveGridEmpty, DriveGridEmptyProps, DriveGridFileCard, DriveGridFolderCard, DriveGridLoading, DriveGridLoadingProps, DriveGridProps, DriveSelectionContextValue, DriveSelectionProvider, DriveViewContextValue, DriveViewMode, DriveViewProvider, DriveViewProviderProps, useDriveSelectionContext, useDriveViewContext };
|
package/dist/client.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DriveSelectionProvider, useDriveSelectionContext } from "./components/selection.client.mjs";
|
|
2
|
+
import { DriveGridCard, DriveGridCardSkeleton, DriveGridFileCard, DriveGridFolderCard } from "./components/grid-card.client.mjs";
|
|
3
|
+
import { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridLoading } from "./components/grid.client.mjs";
|
|
4
|
+
import { DriveViewProvider, useDriveViewContext } from "./components/view.client.mjs";
|
|
5
|
+
|
|
6
|
+
export { DriveGrid, DriveGridBottombar, DriveGridCard, DriveGridCardSkeleton, DriveGridEmpty, DriveGridFileCard, DriveGridFolderCard, DriveGridLoading, DriveSelectionProvider, DriveViewProvider, useDriveSelectionContext, useDriveViewContext };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/content.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Drive Content
|
|
7
|
+
*/
|
|
8
|
+
declare function DriveContent({
|
|
9
|
+
className,
|
|
10
|
+
...props
|
|
11
|
+
}: ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { DriveContent };
|
|
14
|
+
//# sourceMappingURL=content.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.mts","names":[],"sources":["../../src/components/content.tsx"],"mappings":";;;;;;;iBAMgB,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { cn } from "@tulip-systems/core/lib";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/content.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Drive Content
|
|
7
|
+
*/
|
|
8
|
+
function DriveContent({ className, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx("div", {
|
|
10
|
+
...props,
|
|
11
|
+
className: cn("space-y-6", className),
|
|
12
|
+
children: props.children
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { DriveContent };
|
|
18
|
+
//# sourceMappingURL=content.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.mjs","names":[],"sources":["../../src/components/content.tsx"],"sourcesContent":["import { cn } from \"@tulip-systems/core/lib\";\nimport type { ComponentProps } from \"react\";\n\n/**\n * Drive Content\n */\nexport function DriveContent({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div {...props} className={cn(\"space-y-6\", className)}>\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,aAAa,EAAE,WAAW,GAAG,SAAgC;AAC3E,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,aAAa,UAAU;YAClD,MAAM;GACH"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Permission } from "@tulip-systems/core/auth";
|
|
2
|
+
|
|
3
|
+
//#region src/components/context.client.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* DriveContext
|
|
6
|
+
*/
|
|
7
|
+
type DriveContextValue = {
|
|
8
|
+
namespace: string;
|
|
9
|
+
permission?: Permission;
|
|
10
|
+
meta?: object;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { DriveContextValue };
|
|
14
|
+
//# sourceMappingURL=context.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.client.d.mts","names":[],"sources":["../../src/components/context.client.tsx"],"mappings":";;;;;AAOA;KAAY,iBAAA;EACV,SAAA;EACA,UAAA,GAAa,UAAA;EACb,IAAA;AAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PropsWithChildren } from "react";
|
|
2
|
+
import "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/dnd.client.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* DriveViewProvider
|
|
7
|
+
*/
|
|
8
|
+
type DriveDragDropProviderProps = PropsWithChildren<{
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onMove?: (input: {
|
|
11
|
+
id: string;
|
|
12
|
+
parentId: string | null;
|
|
13
|
+
}) => void;
|
|
14
|
+
}>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { DriveDragDropProviderProps };
|
|
17
|
+
//# sourceMappingURL=dnd.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dnd.client.d.mts","names":[],"sources":["../../src/components/dnd.client.tsx"],"mappings":";;;;;;;KAUY,0BAAA,GAA6B,iBAAA;EACvC,QAAA;EACA,MAAA,IAAU,KAAA;IAAS,EAAA;IAAY,QAAA;EAAA;AAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { DragDropProvider } from "@dnd-kit/react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
import { PointerActivationConstraints, PointerSensor } from "@dnd-kit/dom";
|
|
6
|
+
|
|
7
|
+
//#region src/components/dnd.client.tsx
|
|
8
|
+
function DriveDragDropProvider(props) {
|
|
9
|
+
return /* @__PURE__ */ jsx(DragDropProvider, {
|
|
10
|
+
sensors: (defaults) => [...defaults, PointerSensor.configure({ activationConstraints: [new PointerActivationConstraints.Distance({ value: 35 })] })],
|
|
11
|
+
onDragEnd: (event) => {
|
|
12
|
+
if (props.disabled) return;
|
|
13
|
+
const { operation, canceled } = event;
|
|
14
|
+
const { source, target } = operation;
|
|
15
|
+
if (!source || !target || canceled) return;
|
|
16
|
+
const id = source.id.toString();
|
|
17
|
+
const parentId = target.id.toString() === "drive" ? null : target.id.toString();
|
|
18
|
+
if (id === parentId) return;
|
|
19
|
+
props.onMove?.({
|
|
20
|
+
id,
|
|
21
|
+
parentId
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
children: props.children
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
export { DriveDragDropProvider };
|
|
30
|
+
//# sourceMappingURL=dnd.client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dnd.client.mjs","names":[],"sources":["../../src/components/dnd.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { PointerActivationConstraints, PointerSensor } from \"@dnd-kit/dom\";\nimport { DragDropProvider } from \"@dnd-kit/react\";\nimport type { PropsWithChildren } from \"react\";\n\n/**\n * DriveViewProvider\n */\n\nexport type DriveDragDropProviderProps = PropsWithChildren<{\n disabled?: boolean;\n onMove?: (input: { id: string; parentId: string | null }) => void;\n}>;\n\nexport function DriveDragDropProvider(props: DriveDragDropProviderProps) {\n return (\n <DragDropProvider\n sensors={(defaults) => [\n ...defaults,\n PointerSensor.configure({\n activationConstraints: [\n // Start dragging after moving 35 pixels to prevent accidental drags when clicking\n new PointerActivationConstraints.Distance({ value: 35 }),\n ],\n }),\n ]}\n onDragEnd={(event) => {\n if (props.disabled) return;\n\n const { operation, canceled } = event;\n const { source, target } = operation;\n\n if (!source || !target || canceled) return;\n\n const id = source.id.toString();\n const parentId = target.id.toString() === \"drive\" ? null : target.id.toString();\n\n if (id === parentId) return;\n\n props.onMove?.({ id, parentId });\n }}\n >\n {props.children}\n </DragDropProvider>\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,sBAAsB,OAAmC;AACvE,QACE,oBAAC;EACC,UAAU,aAAa,CACrB,GAAG,UACH,cAAc,UAAU,EACtB,uBAAuB,CAErB,IAAI,6BAA6B,SAAS,EAAE,OAAO,IAAI,CAAC,CACzD,EACF,CAAC,CACH;EACD,YAAY,UAAU;AACpB,OAAI,MAAM,SAAU;GAEpB,MAAM,EAAE,WAAW,aAAa;GAChC,MAAM,EAAE,QAAQ,WAAW;AAE3B,OAAI,CAAC,UAAU,CAAC,UAAU,SAAU;GAEpC,MAAM,KAAK,OAAO,GAAG,UAAU;GAC/B,MAAM,WAAW,OAAO,GAAG,UAAU,KAAK,UAAU,OAAO,OAAO,GAAG,UAAU;AAE/E,OAAI,OAAO,SAAU;AAErB,SAAM,SAAS;IAAE;IAAI;IAAU,CAAC;;YAGjC,MAAM;GACU"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DriveNode } from "../lib/dto.mjs";
|
|
2
|
+
import { ComponentProps } from "react";
|
|
3
|
+
import { ImageLoaderProps } from "next/image";
|
|
4
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
5
|
+
import { CommandDef } from "@tulip-systems/core/commands";
|
|
6
|
+
|
|
7
|
+
//#region src/components/grid-card.client.d.ts
|
|
8
|
+
/**
|
|
9
|
+
* Drive Grid Card
|
|
10
|
+
*/
|
|
11
|
+
type DriveGridCardProps<TData extends DriveNode> = ComponentProps<"div"> & {
|
|
12
|
+
node: TData;
|
|
13
|
+
commands?: CommandDef<TData>[];
|
|
14
|
+
imageLoader?: (props: ImageLoaderProps) => string;
|
|
15
|
+
};
|
|
16
|
+
declare function DriveGridCard<TData extends DriveNode>(props: DriveGridCardProps<TData>): react_jsx_runtime0.JSX.Element | null;
|
|
17
|
+
/**
|
|
18
|
+
* Folder card
|
|
19
|
+
*/
|
|
20
|
+
declare function DriveGridFolderCard<TData extends DriveNode>({
|
|
21
|
+
node,
|
|
22
|
+
commands,
|
|
23
|
+
onDoubleClick,
|
|
24
|
+
className,
|
|
25
|
+
...props
|
|
26
|
+
}: DriveGridCardProps<TData>): react_jsx_runtime0.JSX.Element | null;
|
|
27
|
+
/**
|
|
28
|
+
* File card
|
|
29
|
+
*/
|
|
30
|
+
declare function DriveGridFileCard<TData extends DriveNode>({
|
|
31
|
+
node,
|
|
32
|
+
commands,
|
|
33
|
+
imageLoader,
|
|
34
|
+
className,
|
|
35
|
+
...props
|
|
36
|
+
}: DriveGridCardProps<TData>): react_jsx_runtime0.JSX.Element | null;
|
|
37
|
+
/**
|
|
38
|
+
* Card Skeleton
|
|
39
|
+
*/
|
|
40
|
+
declare function DriveGridCardSkeleton(): react_jsx_runtime0.JSX.Element;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { DriveGridCard, DriveGridCardSkeleton, DriveGridFileCard, DriveGridFolderCard };
|
|
43
|
+
//# sourceMappingURL=grid-card.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-card.client.d.mts","names":[],"sources":["../../src/components/grid-card.client.tsx"],"mappings":";;;;;;;;;;KA6BK,kBAAA,eAAiC,SAAA,IAAa,cAAA;EACjD,IAAA,EAAM,KAAA;EACN,QAAA,GAAW,UAAA,CAAW,KAAA;EACtB,WAAA,IAAe,KAAA,EAAO,gBAAA;AAAA;AAAA,iBAGR,aAAA,eAA4B,SAAA,CAAA,CAAW,KAAA,EAAO,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAmBvE,mBAAA,eAAkC,SAAA,CAAA,CAAA;EAChD,IAAA;EACA,QAAA;EACA,aAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAkFZ,iBAAA,eAAgC,SAAA,CAAA,CAAA;EAC9C,IAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAmGZ,qBAAA,CAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { nodeSubtypeConfig, nodeSubtypeVariants } from "../config/types.mjs";
|
|
4
|
+
import { useDriveSelectionContext } from "./selection.client.mjs";
|
|
5
|
+
import { Card, CardContent, CardHeader, CardTitle, Skeleton, findStatus } from "@tulip-systems/core/components";
|
|
6
|
+
import { createElement } from "react";
|
|
7
|
+
import { useDraggable, useDroppable } from "@dnd-kit/react";
|
|
8
|
+
import { ContextCommandMenu, ContextCommandMenuContent, ContextCommandMenuTrigger, DropdownCommandMenu } from "@tulip-systems/core/commands/client";
|
|
9
|
+
import { FolderIcon } from "lucide-react";
|
|
10
|
+
import Image from "next/image";
|
|
11
|
+
import { useRouter } from "next/navigation";
|
|
12
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
|
|
14
|
+
//#region src/components/grid-card.client.tsx
|
|
15
|
+
function DriveGridCard(props) {
|
|
16
|
+
if (props.node.availability === "pending") return /* @__PURE__ */ jsx(DriveGridCardSkeleton, { ...props });
|
|
17
|
+
if (props.node.type === "folder") return /* @__PURE__ */ jsx(DriveGridFolderCard, { ...props });
|
|
18
|
+
if (props.node.type === "file") return /* @__PURE__ */ jsx(DriveGridFileCard, { ...props });
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Folder card
|
|
23
|
+
*/
|
|
24
|
+
function DriveGridFolderCard({ node, commands, onDoubleClick, className, ...props }) {
|
|
25
|
+
const { id } = node;
|
|
26
|
+
const router = useRouter();
|
|
27
|
+
const { selection, selectionConditions } = useDriveSelectionContext();
|
|
28
|
+
const droppable = useDroppable({ id: node.id });
|
|
29
|
+
const draggable = useDraggable({ id: node.id });
|
|
30
|
+
if (node.hidden) return null;
|
|
31
|
+
return /* @__PURE__ */ jsxs(ContextCommandMenu, { children: [/* @__PURE__ */ jsx(ContextCommandMenuTrigger, {
|
|
32
|
+
asChild: true,
|
|
33
|
+
children: /* @__PURE__ */ createElement(Card, {
|
|
34
|
+
...props,
|
|
35
|
+
key: id,
|
|
36
|
+
ref: draggable.ref,
|
|
37
|
+
"data-selected": selection?.rowSelection?.[id],
|
|
38
|
+
"data-dragging": draggable.isDragging,
|
|
39
|
+
className: "group @container relative flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden bg-transparent p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50",
|
|
40
|
+
onClick: () => {
|
|
41
|
+
const conditions = selectionConditions?.(node);
|
|
42
|
+
if (conditions !== void 0) {
|
|
43
|
+
if (!(Array.isArray(conditions) ? conditions.some((condition) => condition) : conditions)) return;
|
|
44
|
+
}
|
|
45
|
+
if (!selection?.rowSelection?.[id]) selection?.setRowSelection?.((old) => ({
|
|
46
|
+
...old,
|
|
47
|
+
[id]: true
|
|
48
|
+
}));
|
|
49
|
+
else selection?.setRowSelection?.((old) => {
|
|
50
|
+
const newSelection = { ...old };
|
|
51
|
+
delete newSelection[id];
|
|
52
|
+
return newSelection;
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
onDoubleClick: () => router.push(`?parentId=${id}`)
|
|
56
|
+
}, /* @__PURE__ */ jsx("div", {
|
|
57
|
+
ref: droppable.ref,
|
|
58
|
+
"data-over": droppable.isDropTarget && !draggable.isDragging,
|
|
59
|
+
className: "absolute inset-0 -z-10 data-[over=true]:bg-primary/35"
|
|
60
|
+
}), /* @__PURE__ */ jsxs(CardHeader, {
|
|
61
|
+
className: "flex w-full flex-row items-center justify-between gap-2.5 p-0 px-1.5",
|
|
62
|
+
children: [
|
|
63
|
+
/* @__PURE__ */ jsx(FolderIcon, { className: "my-1.5 size-4 fill-foreground" }),
|
|
64
|
+
/* @__PURE__ */ jsx(CardTitle, {
|
|
65
|
+
className: "line-clamp-2 w-full break-all text-xs leading-[1.2]",
|
|
66
|
+
title: node.name,
|
|
67
|
+
children: node.name
|
|
68
|
+
}),
|
|
69
|
+
commands && /* @__PURE__ */ jsx(DropdownCommandMenu, {
|
|
70
|
+
data: node,
|
|
71
|
+
commands
|
|
72
|
+
})
|
|
73
|
+
]
|
|
74
|
+
}), /* @__PURE__ */ jsx(CardContent, {
|
|
75
|
+
className: "h-48 w-full overflow-hidden rounded-lg bg-background p-0 group-hover:bg-background",
|
|
76
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
77
|
+
className: "flex h-full w-full items-center justify-center",
|
|
78
|
+
children: /* @__PURE__ */ jsx(FolderIcon, { className: "size-12 fill-foreground" })
|
|
79
|
+
})
|
|
80
|
+
}))
|
|
81
|
+
}), commands && /* @__PURE__ */ jsx(ContextCommandMenuContent, {
|
|
82
|
+
data: node,
|
|
83
|
+
commands
|
|
84
|
+
})] });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* File card
|
|
88
|
+
*/
|
|
89
|
+
function DriveGridFileCard({ node, commands, imageLoader, className, ...props }) {
|
|
90
|
+
const { id } = node;
|
|
91
|
+
const { ref, isDragging } = useDraggable({ id });
|
|
92
|
+
const { selection, selectionConditions } = useDriveSelectionContext();
|
|
93
|
+
const Icon = findStatus(nodeSubtypeConfig, node.subtype)?.icon;
|
|
94
|
+
const fileUrl = node.links.view ?? node.links.download;
|
|
95
|
+
const imageUrl = node.links.thumbnail ?? node.links.preview;
|
|
96
|
+
if (node.hidden) return null;
|
|
97
|
+
return /* @__PURE__ */ jsxs(ContextCommandMenu, { children: [/* @__PURE__ */ jsx(ContextCommandMenuTrigger, {
|
|
98
|
+
asChild: true,
|
|
99
|
+
children: /* @__PURE__ */ createElement(Card, {
|
|
100
|
+
...props,
|
|
101
|
+
key: id,
|
|
102
|
+
ref,
|
|
103
|
+
"data-selected": selection?.rowSelection?.[id],
|
|
104
|
+
"data-dragging": isDragging,
|
|
105
|
+
className: "@container flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50",
|
|
106
|
+
onClick: () => {
|
|
107
|
+
const conditions = selectionConditions?.(node);
|
|
108
|
+
if (conditions !== void 0) {
|
|
109
|
+
if (!(Array.isArray(conditions) ? conditions.some((condition) => condition) : conditions)) return;
|
|
110
|
+
}
|
|
111
|
+
if (!selection?.rowSelection?.[id]) selection?.setRowSelection?.((old) => ({
|
|
112
|
+
...old,
|
|
113
|
+
[id]: true
|
|
114
|
+
}));
|
|
115
|
+
else selection?.setRowSelection?.((old) => {
|
|
116
|
+
const newSelection = { ...old };
|
|
117
|
+
delete newSelection[id];
|
|
118
|
+
return newSelection;
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
onDoubleClick: () => window.open(fileUrl ?? "", "_blank", "noopener,noreferrer")
|
|
122
|
+
}, /* @__PURE__ */ jsxs(CardHeader, {
|
|
123
|
+
className: "flex w-full flex-row items-center justify-between gap-2 p-0 px-1.5",
|
|
124
|
+
children: [
|
|
125
|
+
Icon && /* @__PURE__ */ jsx(Icon, { className: nodeSubtypeVariants({
|
|
126
|
+
status: node.subtype,
|
|
127
|
+
className: "my-1.5 size-4"
|
|
128
|
+
}) }),
|
|
129
|
+
/* @__PURE__ */ jsx(CardTitle, {
|
|
130
|
+
className: "line-clamp-2 w-full break-all text-xs leading-[1.2]",
|
|
131
|
+
title: node.name,
|
|
132
|
+
children: node.name
|
|
133
|
+
}),
|
|
134
|
+
commands && /* @__PURE__ */ jsx(DropdownCommandMenu, {
|
|
135
|
+
data: node,
|
|
136
|
+
commands
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}), /* @__PURE__ */ jsx(CardContent, {
|
|
140
|
+
className: "h-48 w-full overflow-hidden rounded-lg bg-background p-0",
|
|
141
|
+
children: node.subtype === "image" ? /* @__PURE__ */ jsx(Image, {
|
|
142
|
+
src: imageUrl ?? fileUrl ?? "",
|
|
143
|
+
alt: node.name,
|
|
144
|
+
width: 200,
|
|
145
|
+
height: 200,
|
|
146
|
+
loader: imageLoader,
|
|
147
|
+
className: "h-full w-full object-cover"
|
|
148
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
149
|
+
className: "flex h-full w-full items-center justify-center",
|
|
150
|
+
children: Icon && /* @__PURE__ */ jsx(Icon, { className: nodeSubtypeVariants({
|
|
151
|
+
status: node.subtype,
|
|
152
|
+
className: "size-12"
|
|
153
|
+
}) })
|
|
154
|
+
})
|
|
155
|
+
}))
|
|
156
|
+
}), commands && /* @__PURE__ */ jsx(ContextCommandMenuContent, {
|
|
157
|
+
data: node,
|
|
158
|
+
commands
|
|
159
|
+
})] });
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Card Skeleton
|
|
163
|
+
*/
|
|
164
|
+
function DriveGridCardSkeleton() {
|
|
165
|
+
return /* @__PURE__ */ jsxs(Card, {
|
|
166
|
+
className: "flex max-h-52 cursor-pointer flex-col items-center gap-3 overflow-hidden bg-muted/70 p-3",
|
|
167
|
+
children: [/* @__PURE__ */ jsx(Skeleton, { className: "h-7" }), /* @__PURE__ */ jsx(CardContent, { className: "h-52 w-full overflow-hidden rounded-lg bg-background p-0" })]
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
//#endregion
|
|
172
|
+
export { DriveGridCard, DriveGridCardSkeleton, DriveGridFileCard, DriveGridFolderCard };
|
|
173
|
+
//# sourceMappingURL=grid-card.client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-card.client.mjs","names":[],"sources":["../../src/components/grid-card.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDraggable, useDroppable } from \"@dnd-kit/react\";\nimport type { CommandDef } from \"@tulip-systems/core/commands\";\nimport {\n ContextCommandMenu,\n ContextCommandMenuContent,\n ContextCommandMenuTrigger,\n DropdownCommandMenu,\n} from \"@tulip-systems/core/commands/client\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n findStatus,\n Skeleton,\n} from \"@tulip-systems/core/components\";\nimport { FolderIcon } from \"lucide-react\";\nimport Image, { type ImageLoaderProps } from \"next/image\";\nimport { useRouter } from \"next/navigation\";\nimport type { ComponentProps } from \"react\";\nimport { nodeSubtypeConfig, nodeSubtypeVariants } from \"@/config/types\";\nimport type { DriveNode } from \"@/lib/dto\";\nimport { useDriveSelectionContext } from \"./selection.client\";\n\n/**\n * Drive Grid Card\n */\ntype DriveGridCardProps<TData extends DriveNode> = ComponentProps<\"div\"> & {\n node: TData;\n commands?: CommandDef<TData>[];\n imageLoader?: (props: ImageLoaderProps) => string;\n};\n\nexport function DriveGridCard<TData extends DriveNode>(props: DriveGridCardProps<TData>) {\n if (props.node.availability === \"pending\") {\n return <DriveGridCardSkeleton {...props} />;\n }\n\n if (props.node.type === \"folder\") {\n return <DriveGridFolderCard {...props} />;\n }\n\n if (props.node.type === \"file\") {\n return <DriveGridFileCard {...props} />;\n }\n\n return null;\n}\n\n/**\n * Folder card\n */\nexport function DriveGridFolderCard<TData extends DriveNode>({\n node,\n commands,\n onDoubleClick,\n className,\n ...props\n}: DriveGridCardProps<TData>) {\n const { id } = node;\n\n const router = useRouter();\n\n const { selection, selectionConditions } = useDriveSelectionContext();\n\n const droppable = useDroppable({ id: node.id });\n const draggable = useDraggable({ id: node.id });\n\n if (node.hidden) return null;\n\n return (\n <ContextCommandMenu>\n <ContextCommandMenuTrigger asChild>\n <Card\n {...props}\n key={id}\n ref={draggable.ref}\n data-selected={selection?.rowSelection?.[id]}\n data-dragging={draggable.isDragging}\n className=\"group @container relative flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden bg-transparent p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50\"\n onClick={() => {\n const conditions = selectionConditions?.(node);\n\n if (conditions !== undefined) {\n const canSelect = Array.isArray(conditions)\n ? conditions.some((condition) => condition)\n : conditions;\n\n if (!canSelect) return;\n }\n\n const isSelected = selection?.rowSelection?.[id];\n\n if (!isSelected) {\n selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));\n } else {\n selection?.setRowSelection?.((old) => {\n const newSelection = { ...old };\n delete newSelection[id];\n return newSelection;\n });\n }\n }}\n onDoubleClick={() => router.push(`?parentId=${id}`)}\n >\n <div\n ref={droppable.ref}\n data-over={droppable.isDropTarget && !draggable.isDragging}\n className=\"absolute inset-0 -z-10 data-[over=true]:bg-primary/35\"\n />\n\n <CardHeader className=\"flex w-full flex-row items-center justify-between gap-2.5 p-0 px-1.5\">\n <FolderIcon className=\"my-1.5 size-4 fill-foreground\" />\n\n <CardTitle\n className=\"line-clamp-2 w-full break-all text-xs leading-[1.2]\"\n title={node.name}\n >\n {node.name}\n </CardTitle>\n\n {commands && <DropdownCommandMenu data={node} commands={commands} />}\n </CardHeader>\n\n <CardContent className=\"h-48 w-full overflow-hidden rounded-lg bg-background p-0 group-hover:bg-background\">\n <div className=\"flex h-full w-full items-center justify-center\">\n <FolderIcon className=\"size-12 fill-foreground\" />\n </div>\n </CardContent>\n </Card>\n </ContextCommandMenuTrigger>\n\n {commands && <ContextCommandMenuContent data={node} commands={commands} />}\n </ContextCommandMenu>\n );\n}\n\n/**\n * File card\n */\nexport function DriveGridFileCard<TData extends DriveNode>({\n node,\n commands,\n imageLoader,\n className,\n ...props\n}: DriveGridCardProps<TData>) {\n const { id } = node;\n\n const { ref, isDragging } = useDraggable({ id });\n const { selection, selectionConditions } = useDriveSelectionContext();\n\n const subtype = findStatus(nodeSubtypeConfig, node.subtype);\n const Icon = subtype?.icon;\n const fileUrl = node.links.view ?? node.links.download;\n const imageUrl = node.links.thumbnail ?? node.links.preview;\n if (node.hidden) return null;\n\n return (\n <ContextCommandMenu>\n <ContextCommandMenuTrigger asChild>\n <Card\n {...props}\n key={id}\n ref={ref}\n data-selected={selection?.rowSelection?.[id]}\n data-dragging={isDragging}\n className=\"@container flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50\"\n onClick={() => {\n const conditions = selectionConditions?.(node);\n\n if (conditions !== undefined) {\n const canSelect = Array.isArray(conditions)\n ? conditions.some((condition) => condition)\n : conditions;\n\n if (!canSelect) return;\n }\n\n const isSelected = selection?.rowSelection?.[id];\n\n if (!isSelected) {\n selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));\n } else {\n selection?.setRowSelection?.((old) => {\n const newSelection = { ...old };\n delete newSelection[id];\n return newSelection;\n });\n }\n }}\n onDoubleClick={() => window.open(fileUrl ?? \"\", \"_blank\", \"noopener,noreferrer\")}\n >\n <CardHeader className=\"flex w-full flex-row items-center justify-between gap-2 p-0 px-1.5\">\n {Icon && (\n <Icon\n className={nodeSubtypeVariants({\n status: node.subtype,\n className: \"my-1.5 size-4\",\n })}\n />\n )}\n\n <CardTitle\n className=\"line-clamp-2 w-full break-all text-xs leading-[1.2]\"\n title={node.name}\n >\n {node.name}\n </CardTitle>\n\n {commands && <DropdownCommandMenu data={node} commands={commands} />}\n </CardHeader>\n\n <CardContent className=\"h-48 w-full overflow-hidden rounded-lg bg-background p-0\">\n {node.subtype === \"image\" ? (\n <Image\n src={imageUrl ?? fileUrl ?? \"\"}\n alt={node.name}\n width={200}\n height={200}\n loader={imageLoader}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n {Icon && (\n <Icon\n className={nodeSubtypeVariants({ status: node.subtype, className: \"size-12\" })}\n />\n )}\n </div>\n )}\n </CardContent>\n </Card>\n </ContextCommandMenuTrigger>\n\n {commands && <ContextCommandMenuContent data={node} commands={commands} />}\n </ContextCommandMenu>\n );\n}\n\n/**\n * Card Skeleton\n */\n\nexport function DriveGridCardSkeleton() {\n return (\n <Card className=\"flex max-h-52 cursor-pointer flex-col items-center gap-3 overflow-hidden bg-muted/70 p-3\">\n <Skeleton className=\"h-7\" />\n <CardContent className=\"h-52 w-full overflow-hidden rounded-lg bg-background p-0\" />\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from "react";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/grid.client.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Layout primitive for drive grid content.
|
|
7
|
+
*/
|
|
8
|
+
type DriveGridProps = ComponentProps<"div">;
|
|
9
|
+
declare function DriveGrid({
|
|
10
|
+
className,
|
|
11
|
+
...props
|
|
12
|
+
}: DriveGridProps): react_jsx_runtime0.JSX.Element;
|
|
13
|
+
/**
|
|
14
|
+
* Empty state that spans the full grid.
|
|
15
|
+
*/
|
|
16
|
+
type DriveGridEmptyProps = ComponentProps<"div"> & {
|
|
17
|
+
title?: ReactNode;
|
|
18
|
+
description?: ReactNode;
|
|
19
|
+
};
|
|
20
|
+
declare function DriveGridEmpty({
|
|
21
|
+
title,
|
|
22
|
+
description,
|
|
23
|
+
className,
|
|
24
|
+
children,
|
|
25
|
+
...props
|
|
26
|
+
}: DriveGridEmptyProps): react_jsx_runtime0.JSX.Element;
|
|
27
|
+
/**
|
|
28
|
+
* Skeleton grid for page-level loading states.
|
|
29
|
+
*/
|
|
30
|
+
type DriveGridLoadingProps = ComponentProps<"div">;
|
|
31
|
+
declare function DriveGridLoading({
|
|
32
|
+
className,
|
|
33
|
+
...props
|
|
34
|
+
}: DriveGridLoadingProps): react_jsx_runtime0.JSX.Element;
|
|
35
|
+
/**
|
|
36
|
+
* Infinite table bottombar
|
|
37
|
+
*/
|
|
38
|
+
type DriveGridBottombarProps = ComponentProps<"div"> & {
|
|
39
|
+
hasNextPage: boolean;
|
|
40
|
+
fetchNextPage: () => void;
|
|
41
|
+
isFetching: boolean;
|
|
42
|
+
isFetchingNextPage: boolean;
|
|
43
|
+
};
|
|
44
|
+
declare function DriveGridBottombar({
|
|
45
|
+
hasNextPage,
|
|
46
|
+
fetchNextPage,
|
|
47
|
+
isFetching,
|
|
48
|
+
isFetchingNextPage,
|
|
49
|
+
className,
|
|
50
|
+
...props
|
|
51
|
+
}: DriveGridBottombarProps): react_jsx_runtime0.JSX.Element;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridEmptyProps, DriveGridLoading, DriveGridLoadingProps, DriveGridProps };
|
|
54
|
+
//# sourceMappingURL=grid.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.client.d.mts","names":[],"sources":["../../src/components/grid.client.tsx"],"mappings":";;;;;;;KAWY,cAAA,GAAiB,cAAA;AAAA,iBAEb,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAerD,mBAAA,GAAsB,cAAA;EAChC,KAAA,GAAQ,SAAA;EACR,WAAA,GAAc,SAAA;AAAA;AAAA,iBAGA,cAAA,CAAA;EACd,KAAA;EACA,WAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAYV,qBAAA,GAAwB,cAAA;AAAA,iBAEpB,gBAAA,CAAA;EAAmB,SAAA;EAAA,GAAc;AAAA,GAAS,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAa1E,uBAAA,GAA0B,cAAA;EAC7B,WAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;AAAA;AAAA,iBAGc,kBAAA,CAAA;EACd,WAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { DriveGridCardSkeleton } from "./grid-card.client.mjs";
|
|
4
|
+
import { EmptyDescription, EmptyPage, EmptyPageTitle } from "@tulip-systems/core/components";
|
|
5
|
+
import { cn } from "@tulip-systems/core/lib";
|
|
6
|
+
import { useInView } from "motion/react";
|
|
7
|
+
import { useEffect, useRef } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
|
|
10
|
+
//#region src/components/grid.client.tsx
|
|
11
|
+
function DriveGrid({ className, ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx("div", {
|
|
13
|
+
...props,
|
|
14
|
+
className: cn("grid grid-cols-1 gap-5 md:grid-cols-[repeat(auto-fill,minmax(13rem,1fr))]", className)
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function DriveGridEmpty({ title, description, className, children, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsxs(EmptyPage, {
|
|
19
|
+
...props,
|
|
20
|
+
className: cn("col-span-full min-h-[80dvh]", className),
|
|
21
|
+
children: [/* @__PURE__ */ jsx(EmptyPageTitle, { children: title }), description && /* @__PURE__ */ jsx(EmptyDescription, { children: description })]
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function DriveGridLoading({ className, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsx(DriveGrid, {
|
|
26
|
+
...props,
|
|
27
|
+
children: Array.from({ length: 12 }).map((_, index) => /* @__PURE__ */ jsx(DriveGridCardSkeleton, {}, index))
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function DriveGridBottombar({ hasNextPage, fetchNextPage, isFetching, isFetchingNextPage, className, ...props }) {
|
|
31
|
+
const scrollRef = useRef(null);
|
|
32
|
+
const isInView = useInView(scrollRef);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (isInView && hasNextPage && !isFetching && !isFetchingNextPage) fetchNextPage();
|
|
35
|
+
}, [
|
|
36
|
+
isInView,
|
|
37
|
+
fetchNextPage,
|
|
38
|
+
hasNextPage,
|
|
39
|
+
isFetching,
|
|
40
|
+
isFetchingNextPage
|
|
41
|
+
]);
|
|
42
|
+
return /* @__PURE__ */ jsx("div", {
|
|
43
|
+
...props,
|
|
44
|
+
className: cn("relative col-span-full", className),
|
|
45
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
46
|
+
ref: scrollRef,
|
|
47
|
+
className: "absolute bottom-0 -z-50 min-h-[500px] bg-primary"
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
export { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridLoading };
|
|
54
|
+
//# sourceMappingURL=grid.client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.client.mjs","names":[],"sources":["../../src/components/grid.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { EmptyDescription, EmptyPage, EmptyPageTitle } from \"@tulip-systems/core/components\";\nimport { cn } from \"@tulip-systems/core/lib\";\nimport { useInView } from \"motion/react\";\nimport { type ComponentProps, type ReactNode, useEffect, useRef } from \"react\";\nimport { DriveGridCardSkeleton } from \"./grid-card.client\";\n\n/**\n * Layout primitive for drive grid content.\n */\nexport type DriveGridProps = ComponentProps<\"div\">;\n\nexport function DriveGrid({ className, ...props }: DriveGridProps) {\n return (\n <div\n {...props}\n className={cn(\n \"grid grid-cols-1 gap-5 md:grid-cols-[repeat(auto-fill,minmax(13rem,1fr))]\",\n className,\n )}\n />\n );\n}\n\n/**\n * Empty state that spans the full grid.\n */\nexport type DriveGridEmptyProps = ComponentProps<\"div\"> & {\n title?: ReactNode;\n description?: ReactNode;\n};\n\nexport function DriveGridEmpty({\n title,\n description,\n className,\n children,\n ...props\n}: DriveGridEmptyProps) {\n return (\n <EmptyPage {...props} className={cn(\"col-span-full min-h-[80dvh]\", className)}>\n <EmptyPageTitle>{title}</EmptyPageTitle>\n {description && <EmptyDescription>{description}</EmptyDescription>}\n </EmptyPage>\n );\n}\n\n/**\n * Skeleton grid for page-level loading states.\n */\nexport type DriveGridLoadingProps = ComponentProps<\"div\">;\n\nexport function DriveGridLoading({ className, ...props }: DriveGridLoadingProps) {\n return (\n <DriveGrid {...props}>\n {Array.from({ length: 12 }).map((_, index) => (\n <DriveGridCardSkeleton key={index} />\n ))}\n </DriveGrid>\n );\n}\n\n/**\n * Infinite table bottombar\n */\ntype DriveGridBottombarProps = ComponentProps<\"div\"> & {\n hasNextPage: boolean;\n fetchNextPage: () => void;\n isFetching: boolean;\n isFetchingNextPage: boolean;\n};\n\nexport function DriveGridBottombar({\n hasNextPage,\n fetchNextPage,\n isFetching,\n isFetchingNextPage,\n className,\n ...props\n}: DriveGridBottombarProps) {\n const scrollRef = useRef(null);\n const isInView = useInView(scrollRef);\n\n useEffect(() => {\n if (isInView && hasNextPage && !isFetching && !isFetchingNextPage) {\n fetchNextPage();\n }\n }, [isInView, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage]);\n\n return (\n <div {...props} className={cn(\"relative col-span-full\", className)}>\n <div ref={scrollRef} className=\"absolute bottom-0 -z-50 min-h-[500px] bg-primary\" />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;AACjE,QACE,oBAAC;EACC,GAAI;EACJ,WAAW,GACT,6EACA,UACD;GACD;;AAYN,SAAgB,eAAe,EAC7B,OACA,aACA,WACA,UACA,GAAG,SACmB;AACtB,QACE,qBAAC;EAAU,GAAI;EAAO,WAAW,GAAG,+BAA+B,UAAU;aAC3E,oBAAC,4BAAgB,QAAuB,EACvC,eAAe,oBAAC,8BAAkB,cAA+B;GACxD;;AAShB,SAAgB,iBAAiB,EAAE,WAAW,GAAG,SAAgC;AAC/E,QACE,oBAAC;EAAU,GAAI;YACZ,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,UAClC,oBAAC,2BAA2B,MAAS,CACrC;GACQ;;AAchB,SAAgB,mBAAmB,EACjC,aACA,eACA,YACA,oBACA,WACA,GAAG,SACuB;CAC1B,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,WAAW,UAAU,UAAU;AAErC,iBAAgB;AACd,MAAI,YAAY,eAAe,CAAC,cAAc,CAAC,mBAC7C,gBAAe;IAEhB;EAAC;EAAU;EAAe;EAAa;EAAY;EAAmB,CAAC;AAE1E,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,0BAA0B,UAAU;YAChE,oBAAC;GAAI,KAAK;GAAW,WAAU;IAAqD;GAChF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/navigation/breadcrumbs.client.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Drive Header Breadcrumbs
|
|
6
|
+
*/
|
|
7
|
+
type DriveNodeBreadcrumb = {
|
|
8
|
+
node: true;
|
|
9
|
+
label: string;
|
|
10
|
+
parentId: string | null;
|
|
11
|
+
};
|
|
12
|
+
type DriveHrefBreadcrumb = {
|
|
13
|
+
node?: false;
|
|
14
|
+
label: string;
|
|
15
|
+
href: string;
|
|
16
|
+
};
|
|
17
|
+
type DriveBreadcrumb = DriveNodeBreadcrumb | DriveHrefBreadcrumb;
|
|
18
|
+
type DriveBreadCrumbsProps = {
|
|
19
|
+
breadcrumbs?: DriveBreadcrumb[];
|
|
20
|
+
};
|
|
21
|
+
declare function DriveBreadcrumbs({
|
|
22
|
+
breadcrumbs
|
|
23
|
+
}: DriveBreadCrumbsProps): react_jsx_runtime0.JSX.Element;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DriveBreadCrumbsProps, DriveBreadcrumb, DriveBreadcrumbs };
|
|
26
|
+
//# sourceMappingURL=breadcrumbs.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs.client.d.mts","names":[],"sources":["../../../src/components/navigation/breadcrumbs.client.tsx"],"mappings":";;;;;;KAsBK,mBAAA;EACH,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGG,mBAAA;EACH,IAAA;EACA,KAAA;EACA,IAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,mBAAA,GAAsB,mBAAA;AAAA,KAExC,qBAAA;EACV,WAAA,GAAc,eAAA;AAAA;AAAA,iBAGA,gBAAA,CAAA;EAAmB;AAAA,GAAoB,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { driveTreeSearchParams } from "../../lib/search-params.mjs";
|
|
4
|
+
import { BreadcrumbItem, BreadcrumbLink, BreadcrumbPage } from "@tulip-systems/core/components";
|
|
5
|
+
import { Fragment } from "react";
|
|
6
|
+
import { useDroppable } from "@dnd-kit/react";
|
|
7
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { HeaderBreadcrumbSeparator, HeaderBreadcrumbs, HeaderBreadcrumbsDesktopList, HeaderBreadcrumbsDropdownMenu, HeaderBreadcrumbsDropdownMenuItem, HeaderBreadcrumbsLink, HeaderBreadcrumbsMobileList } from "@tulip-systems/core/components/client";
|
|
9
|
+
import Link from "next/link";
|
|
10
|
+
import { createSerializer, useQueryStates } from "nuqs";
|
|
11
|
+
import { pointerIntersection } from "@dnd-kit/collision";
|
|
12
|
+
|
|
13
|
+
//#region src/components/navigation/breadcrumbs.client.tsx
|
|
14
|
+
function DriveBreadcrumbs({ breadcrumbs = [] }) {
|
|
15
|
+
return /* @__PURE__ */ jsxs(HeaderBreadcrumbs, { children: [/* @__PURE__ */ jsxs(HeaderBreadcrumbsMobileList, { children: [breadcrumbs.length > 1 && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(HeaderBreadcrumbsDropdownMenu, { children: breadcrumbs.slice(0, -1).map((breadcrumb, index) => /* @__PURE__ */ jsx(HeaderBreadcrumbsDropdownMenuItem, { breadcrumb }, index)) }), /* @__PURE__ */ jsx(HeaderBreadcrumbSeparator, {})] }), breadcrumbs.slice(-1).map((breadcrumb, index, array) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(HeaderBreadcrumbsLink, { breadcrumb }), index < array.length - 1 && /* @__PURE__ */ jsx(HeaderBreadcrumbSeparator, {})] }, index))] }), /* @__PURE__ */ jsxs(HeaderBreadcrumbsDesktopList, { children: [breadcrumbs.length > 2 && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(HeaderBreadcrumbsDropdownMenu, { children: breadcrumbs.slice(0, -2).map((breadcrumb, index) => /* @__PURE__ */ jsx(HeaderBreadcrumbsDropdownMenuItem, { breadcrumb }, index)) }), /* @__PURE__ */ jsx(HeaderBreadcrumbSeparator, {})] }), breadcrumbs.slice(-2).map((breadcrumb, index, array) => /* @__PURE__ */ jsxs(Fragment, { children: [breadcrumb.node ? /* @__PURE__ */ jsx(DriveHeaderBreadcrumbsLink, { breadcrumb }) : /* @__PURE__ */ jsx(HeaderBreadcrumbsLink, { breadcrumb }), index < array.length - 1 && /* @__PURE__ */ jsx(HeaderBreadcrumbSeparator, {})] }, index))] })] });
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Drive Header Breadcrumbs Link with DnD support
|
|
19
|
+
*/
|
|
20
|
+
function DriveHeaderBreadcrumbsLink(props) {
|
|
21
|
+
const id = props.breadcrumb.parentId ?? null;
|
|
22
|
+
const [query] = useQueryStates(driveTreeSearchParams);
|
|
23
|
+
const serialize = createSerializer(driveTreeSearchParams);
|
|
24
|
+
const { ref, isDropTarget } = useDroppable({
|
|
25
|
+
id: id ?? "drive",
|
|
26
|
+
collisionDetector: pointerIntersection
|
|
27
|
+
});
|
|
28
|
+
const href = serialize({
|
|
29
|
+
...query,
|
|
30
|
+
parentId: id
|
|
31
|
+
});
|
|
32
|
+
return /* @__PURE__ */ jsx(BreadcrumbItem, {
|
|
33
|
+
ref,
|
|
34
|
+
"data-over": isDropTarget && query.parentId !== id,
|
|
35
|
+
className: "data-[over=true]:bg-primary/35",
|
|
36
|
+
children: href !== void 0 && href !== null ? /* @__PURE__ */ jsx(BreadcrumbLink, {
|
|
37
|
+
asChild: true,
|
|
38
|
+
children: /* @__PURE__ */ jsx(Link, {
|
|
39
|
+
href: href || "?",
|
|
40
|
+
className: "truncate",
|
|
41
|
+
children: props.breadcrumb.label
|
|
42
|
+
})
|
|
43
|
+
}) : /* @__PURE__ */ jsx(BreadcrumbPage, {
|
|
44
|
+
className: "truncate",
|
|
45
|
+
children: props.breadcrumb.label
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { DriveBreadcrumbs };
|
|
52
|
+
//# sourceMappingURL=breadcrumbs.client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs.client.mjs","names":[],"sources":["../../../src/components/navigation/breadcrumbs.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { pointerIntersection } from \"@dnd-kit/collision\";\nimport { useDroppable } from \"@dnd-kit/react\";\nimport { BreadcrumbItem, BreadcrumbLink, BreadcrumbPage } from \"@tulip-systems/core/components\";\nimport {\n HeaderBreadcrumbSeparator,\n HeaderBreadcrumbs,\n HeaderBreadcrumbsDesktopList,\n HeaderBreadcrumbsDropdownMenu,\n HeaderBreadcrumbsDropdownMenuItem,\n HeaderBreadcrumbsLink,\n HeaderBreadcrumbsMobileList,\n} from \"@tulip-systems/core/components/client\";\nimport Link from \"next/link\";\nimport { createSerializer, useQueryStates } from \"nuqs\";\nimport { Fragment } from \"react\";\nimport { driveTreeSearchParams } from \"@/entry\";\n\n/**\n * Drive Header Breadcrumbs\n */\ntype DriveNodeBreadcrumb = {\n node: true;\n label: string;\n parentId: string | null;\n};\n\ntype DriveHrefBreadcrumb = {\n node?: false;\n label: string;\n href: string;\n};\n\nexport type DriveBreadcrumb = DriveNodeBreadcrumb | DriveHrefBreadcrumb;\n\nexport type DriveBreadCrumbsProps = {\n breadcrumbs?: DriveBreadcrumb[];\n};\n\nexport function DriveBreadcrumbs({ breadcrumbs = [] }: DriveBreadCrumbsProps) {\n return (\n <HeaderBreadcrumbs>\n <HeaderBreadcrumbsMobileList>\n {breadcrumbs.length > 1 && (\n <>\n <HeaderBreadcrumbsDropdownMenu>\n {breadcrumbs.slice(0, -1).map((breadcrumb, index) => (\n <HeaderBreadcrumbsDropdownMenuItem key={index} breadcrumb={breadcrumb} />\n ))}\n </HeaderBreadcrumbsDropdownMenu>\n\n <HeaderBreadcrumbSeparator />\n </>\n )}\n\n {breadcrumbs.slice(-1).map((breadcrumb, index, array) => (\n <Fragment key={index}>\n <HeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n {index < array.length - 1 && <HeaderBreadcrumbSeparator />}\n </Fragment>\n ))}\n </HeaderBreadcrumbsMobileList>\n\n <HeaderBreadcrumbsDesktopList>\n {breadcrumbs.length > 2 && (\n <>\n <HeaderBreadcrumbsDropdownMenu>\n {breadcrumbs.slice(0, -2).map((breadcrumb, index) => (\n <HeaderBreadcrumbsDropdownMenuItem key={index} breadcrumb={breadcrumb} />\n ))}\n </HeaderBreadcrumbsDropdownMenu>\n\n <HeaderBreadcrumbSeparator />\n </>\n )}\n\n {breadcrumbs.slice(-2).map((breadcrumb, index, array) => (\n <Fragment key={index}>\n {breadcrumb.node ? (\n <DriveHeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n ) : (\n <HeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n )}\n {index < array.length - 1 && <HeaderBreadcrumbSeparator />}\n </Fragment>\n ))}\n </HeaderBreadcrumbsDesktopList>\n </HeaderBreadcrumbs>\n );\n}\n\n/**\n * Drive Header Breadcrumbs Link with DnD support\n */\nfunction DriveHeaderBreadcrumbsLink(props: { breadcrumb: DriveNodeBreadcrumb }) {\n const id = props.breadcrumb.parentId ?? null;\n const [query] = useQueryStates(driveTreeSearchParams);\n const serialize = createSerializer(driveTreeSearchParams);\n\n const { ref, isDropTarget } = useDroppable({\n id: id ?? \"drive\",\n collisionDetector: pointerIntersection,\n });\n\n const href = serialize({ ...query, parentId: id });\n\n return (\n <BreadcrumbItem\n ref={ref}\n data-over={isDropTarget && query.parentId !== id}\n className=\"data-[over=true]:bg-primary/35\"\n >\n {href !== undefined && href !== null ? (\n <BreadcrumbLink asChild>\n <Link href={href || \"?\"} className=\"truncate\">\n {props.breadcrumb.label}\n </Link>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"truncate\">{props.breadcrumb.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAwCA,SAAgB,iBAAiB,EAAE,cAAc,EAAE,IAA2B;AAC5E,QACE,qBAAC,gCACC,qBAAC,0CACE,YAAY,SAAS,KACpB,8CACE,oBAAC,2CACE,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,YAAY,UACzC,oBAAC,qCAA0D,cAAnB,MAAiC,CACzE,GAC4B,EAEhC,oBAAC,8BAA4B,IAC5B,EAGJ,YAAY,MAAM,GAAG,CAAC,KAAK,YAAY,OAAO,UAC7C,qBAAC,uBACC,oBAAC,yBAAkC,aAAc,EAChD,QAAQ,MAAM,SAAS,KAAK,oBAAC,8BAA4B,KAF7C,MAGJ,CACX,IAC0B,EAE9B,qBAAC,2CACE,YAAY,SAAS,KACpB,8CACE,oBAAC,2CACE,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,YAAY,UACzC,oBAAC,qCAA0D,cAAnB,MAAiC,CACzE,GAC4B,EAEhC,oBAAC,8BAA4B,IAC5B,EAGJ,YAAY,MAAM,GAAG,CAAC,KAAK,YAAY,OAAO,UAC7C,qBAAC,uBACE,WAAW,OACV,oBAAC,8BAAuC,aAAc,GAEtD,oBAAC,yBAAkC,aAAc,EAElD,QAAQ,MAAM,SAAS,KAAK,oBAAC,8BAA4B,KAN7C,MAOJ,CACX,IAC2B,IACb;;;;;AAOxB,SAAS,2BAA2B,OAA4C;CAC9E,MAAM,KAAK,MAAM,WAAW,YAAY;CACxC,MAAM,CAAC,SAAS,eAAe,sBAAsB;CACrD,MAAM,YAAY,iBAAiB,sBAAsB;CAEzD,MAAM,EAAE,KAAK,iBAAiB,aAAa;EACzC,IAAI,MAAM;EACV,mBAAmB;EACpB,CAAC;CAEF,MAAM,OAAO,UAAU;EAAE,GAAG;EAAO,UAAU;EAAI,CAAC;AAElD,QACE,oBAAC;EACM;EACL,aAAW,gBAAgB,MAAM,aAAa;EAC9C,WAAU;YAET,SAAS,UAAa,SAAS,OAC9B,oBAAC;GAAe;aACd,oBAAC;IAAK,MAAM,QAAQ;IAAK,WAAU;cAChC,MAAM,WAAW;KACb;IACQ,GAEjB,oBAAC;GAAe,WAAU;aAAY,MAAM,WAAW;IAAuB;GAEjE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DriveBreadCrumbsProps } from "./breadcrumbs.client.mjs";
|
|
2
|
+
import { ComponentProps } from "react";
|
|
3
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
+
|
|
5
|
+
//#region src/components/navigation/header.client.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Drive Header
|
|
8
|
+
*/
|
|
9
|
+
declare function DriveHeader({
|
|
10
|
+
children,
|
|
11
|
+
...props
|
|
12
|
+
}: ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
13
|
+
/**
|
|
14
|
+
* Drive Header Breadcrumbs
|
|
15
|
+
*/
|
|
16
|
+
declare function DriveHeaderBreadcrumbs({
|
|
17
|
+
breadcrumbs
|
|
18
|
+
}: DriveBreadCrumbsProps): react_jsx_runtime0.JSX.Element;
|
|
19
|
+
/**
|
|
20
|
+
* Drive Header Tools
|
|
21
|
+
*/
|
|
22
|
+
declare function DriveHeaderTools({
|
|
23
|
+
children,
|
|
24
|
+
...props
|
|
25
|
+
}: ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { DriveHeader, DriveHeaderBreadcrumbs, DriveHeaderTools };
|
|
28
|
+
//# sourceMappingURL=header.client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.client.d.mts","names":[],"sources":["../../../src/components/navigation/header.client.tsx"],"mappings":";;;;;;;;iBAegB,WAAA,CAAA;EAAc,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAWzD,sBAAA,CAAA;EAAyB;AAAA,GAAe,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAgB7D,gBAAA,CAAA;EAAmB,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|