@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.
Files changed (236) hide show
  1. package/dist/client.d.mts +5 -0
  2. package/dist/client.mjs +6 -0
  3. package/dist/components/content.d.mts +14 -0
  4. package/dist/components/content.d.mts.map +1 -0
  5. package/dist/components/content.mjs +18 -0
  6. package/dist/components/content.mjs.map +1 -0
  7. package/dist/components/context.client.d.mts +14 -0
  8. package/dist/components/context.client.d.mts.map +1 -0
  9. package/dist/components/dnd.client.d.mts +17 -0
  10. package/dist/components/dnd.client.d.mts.map +1 -0
  11. package/dist/components/dnd.client.mjs +30 -0
  12. package/dist/components/dnd.client.mjs.map +1 -0
  13. package/dist/components/grid-card.client.d.mts +43 -0
  14. package/dist/components/grid-card.client.d.mts.map +1 -0
  15. package/dist/components/grid-card.client.mjs +173 -0
  16. package/dist/components/grid-card.client.mjs.map +1 -0
  17. package/dist/components/grid.client.d.mts +54 -0
  18. package/dist/components/grid.client.d.mts.map +1 -0
  19. package/dist/components/grid.client.mjs +54 -0
  20. package/dist/components/grid.client.mjs.map +1 -0
  21. package/dist/components/navigation/breadcrumbs.client.d.mts +26 -0
  22. package/dist/components/navigation/breadcrumbs.client.d.mts.map +1 -0
  23. package/dist/components/navigation/breadcrumbs.client.mjs +52 -0
  24. package/dist/components/navigation/breadcrumbs.client.mjs.map +1 -0
  25. package/dist/components/navigation/header.client.d.mts +28 -0
  26. package/dist/components/navigation/header.client.d.mts.map +1 -0
  27. package/dist/components/navigation/header.client.mjs +41 -0
  28. package/dist/components/navigation/header.client.mjs.map +1 -0
  29. package/dist/components/navigation/toolbar.client.d.mts +24 -0
  30. package/dist/components/navigation/toolbar.client.d.mts.map +1 -0
  31. package/dist/components/navigation/toolbar.client.mjs +35 -0
  32. package/dist/components/navigation/toolbar.client.mjs.map +1 -0
  33. package/dist/components/navigation/view-switcher.client.d.mts +10 -0
  34. package/dist/components/navigation/view-switcher.client.d.mts.map +1 -0
  35. package/dist/components/navigation/view-switcher.client.mjs +36 -0
  36. package/dist/components/navigation/view-switcher.client.mjs.map +1 -0
  37. package/dist/components/selection.client.d.mts +28 -0
  38. package/dist/components/selection.client.d.mts.map +1 -0
  39. package/dist/components/selection.client.mjs +39 -0
  40. package/dist/components/selection.client.mjs.map +1 -0
  41. package/dist/components/view.client.d.mts +26 -0
  42. package/dist/components/view.client.d.mts.map +1 -0
  43. package/dist/components/view.client.mjs +44 -0
  44. package/dist/components/view.client.mjs.map +1 -0
  45. package/dist/config/filters.mjs +15 -0
  46. package/dist/config/filters.mjs.map +1 -0
  47. package/dist/config/types.mjs +61 -0
  48. package/dist/config/types.mjs.map +1 -0
  49. package/dist/google/client.d.mts +8 -0
  50. package/dist/google/client.mjs +9 -0
  51. package/dist/google/server.d.mts +3 -0
  52. package/dist/google/server.mjs +4 -0
  53. package/dist/google.d.mts +6 -0
  54. package/dist/google.mjs +7 -0
  55. package/dist/index.d.mts +7 -0
  56. package/dist/index.mjs +7 -0
  57. package/dist/lib/constants.d.mts +12 -0
  58. package/dist/lib/constants.d.mts.map +1 -0
  59. package/dist/lib/constants.mjs +21 -0
  60. package/dist/lib/constants.mjs.map +1 -0
  61. package/dist/lib/contracts.d.mts +101 -0
  62. package/dist/lib/contracts.d.mts.map +1 -0
  63. package/dist/lib/dto.d.mts +118 -0
  64. package/dist/lib/dto.d.mts.map +1 -0
  65. package/dist/lib/dto.mjs +58 -0
  66. package/dist/lib/dto.mjs.map +1 -0
  67. package/dist/lib/helpers.d.mts +18 -0
  68. package/dist/lib/helpers.d.mts.map +1 -0
  69. package/dist/lib/helpers.mjs +37 -0
  70. package/dist/lib/helpers.mjs.map +1 -0
  71. package/dist/lib/helpers.server.d.mts +14 -0
  72. package/dist/lib/helpers.server.d.mts.map +1 -0
  73. package/dist/lib/helpers.server.mjs +16 -0
  74. package/dist/lib/helpers.server.mjs.map +1 -0
  75. package/dist/lib/search-params.d.mts +9 -0
  76. package/dist/lib/search-params.d.mts.map +1 -0
  77. package/dist/lib/search-params.mjs +8 -0
  78. package/dist/lib/search-params.mjs.map +1 -0
  79. package/dist/lib/validators.d.mts +158 -0
  80. package/dist/lib/validators.d.mts.map +1 -0
  81. package/dist/lib/validators.mjs +66 -0
  82. package/dist/lib/validators.mjs.map +1 -0
  83. package/dist/local/client.d.mts +13 -0
  84. package/dist/local/client.mjs +13 -0
  85. package/dist/local/server.d.mts +4 -0
  86. package/dist/local/server.mjs +5 -0
  87. package/dist/local.d.mts +8 -0
  88. package/dist/local.mjs +9 -0
  89. package/dist/providers/google/components/command-file-update.d.mts +22 -0
  90. package/dist/providers/google/components/command-file-update.d.mts.map +1 -0
  91. package/dist/providers/google/components/command-file-update.mjs +52 -0
  92. package/dist/providers/google/components/command-file-update.mjs.map +1 -0
  93. package/dist/providers/google/components/command-folder-create.d.mts +22 -0
  94. package/dist/providers/google/components/command-folder-create.d.mts.map +1 -0
  95. package/dist/providers/google/components/command-folder-create.mjs +59 -0
  96. package/dist/providers/google/components/command-folder-create.mjs.map +1 -0
  97. package/dist/providers/google/components/command-folder-update.d.mts +22 -0
  98. package/dist/providers/google/components/command-folder-update.d.mts.map +1 -0
  99. package/dist/providers/google/components/command-folder-update.mjs +52 -0
  100. package/dist/providers/google/components/command-folder-update.mjs.map +1 -0
  101. package/dist/providers/google/components/content.client.d.mts +10 -0
  102. package/dist/providers/google/components/content.client.d.mts.map +1 -0
  103. package/dist/providers/google/components/content.client.mjs +11 -0
  104. package/dist/providers/google/components/content.client.mjs.map +1 -0
  105. package/dist/providers/google/components/navigation.client.d.mts +16 -0
  106. package/dist/providers/google/components/navigation.client.d.mts.map +1 -0
  107. package/dist/providers/google/components/navigation.client.mjs +18 -0
  108. package/dist/providers/google/components/navigation.client.mjs.map +1 -0
  109. package/dist/providers/google/components/provider.client.d.mts +33 -0
  110. package/dist/providers/google/components/provider.client.d.mts.map +1 -0
  111. package/dist/providers/google/components/provider.client.mjs +43 -0
  112. package/dist/providers/google/components/provider.client.mjs.map +1 -0
  113. package/dist/providers/google/components/view.client.d.mts +41 -0
  114. package/dist/providers/google/components/view.client.d.mts.map +1 -0
  115. package/dist/providers/google/components/view.client.mjs +98 -0
  116. package/dist/providers/google/components/view.client.mjs.map +1 -0
  117. package/dist/providers/google/config/columns-data.d.mts +8 -0
  118. package/dist/providers/google/config/columns-data.d.mts.map +1 -0
  119. package/dist/providers/google/config/columns-data.mjs +70 -0
  120. package/dist/providers/google/config/columns-data.mjs.map +1 -0
  121. package/dist/providers/google/config/filters.d.mts +16 -0
  122. package/dist/providers/google/config/filters.d.mts.map +1 -0
  123. package/dist/providers/google/config/filters.mjs +8 -0
  124. package/dist/providers/google/config/filters.mjs.map +1 -0
  125. package/dist/providers/google/lib/constants.mjs +13 -0
  126. package/dist/providers/google/lib/constants.mjs.map +1 -0
  127. package/dist/providers/google/lib/dto.d.mts +39 -0
  128. package/dist/providers/google/lib/dto.d.mts.map +1 -0
  129. package/dist/providers/google/lib/dto.mjs +66 -0
  130. package/dist/providers/google/lib/dto.mjs.map +1 -0
  131. package/dist/providers/google/lib/helpers.mjs +46 -0
  132. package/dist/providers/google/lib/helpers.mjs.map +1 -0
  133. package/dist/providers/google/lib/router.server.d.mts +612 -0
  134. package/dist/providers/google/lib/router.server.d.mts.map +1 -0
  135. package/dist/providers/google/lib/router.server.mjs +40 -0
  136. package/dist/providers/google/lib/router.server.mjs.map +1 -0
  137. package/dist/providers/google/lib/search-params.d.mts +15 -0
  138. package/dist/providers/google/lib/search-params.d.mts.map +1 -0
  139. package/dist/providers/google/lib/search-params.mjs +12 -0
  140. package/dist/providers/google/lib/search-params.mjs.map +1 -0
  141. package/dist/providers/google/lib/service.server.d.mts +186 -0
  142. package/dist/providers/google/lib/service.server.d.mts.map +1 -0
  143. package/dist/providers/google/lib/service.server.mjs +613 -0
  144. package/dist/providers/google/lib/service.server.mjs.map +1 -0
  145. package/dist/providers/google/lib/validators.d.mts +303 -0
  146. package/dist/providers/google/lib/validators.d.mts.map +1 -0
  147. package/dist/providers/google/lib/validators.mjs +59 -0
  148. package/dist/providers/google/lib/validators.mjs.map +1 -0
  149. package/dist/providers/local/components/command-file-update.d.mts +18 -0
  150. package/dist/providers/local/components/command-file-update.d.mts.map +1 -0
  151. package/dist/providers/local/components/command-file-update.mjs +48 -0
  152. package/dist/providers/local/components/command-file-update.mjs.map +1 -0
  153. package/dist/providers/local/components/command-file-upload.d.mts +11 -0
  154. package/dist/providers/local/components/command-file-upload.d.mts.map +1 -0
  155. package/dist/providers/local/components/command-file-upload.mjs +35 -0
  156. package/dist/providers/local/components/command-file-upload.mjs.map +1 -0
  157. package/dist/providers/local/components/command-folder-create.d.mts +18 -0
  158. package/dist/providers/local/components/command-folder-create.d.mts.map +1 -0
  159. package/dist/providers/local/components/command-folder-create.mjs +55 -0
  160. package/dist/providers/local/components/command-folder-create.mjs.map +1 -0
  161. package/dist/providers/local/components/command-folder-update.d.mts +18 -0
  162. package/dist/providers/local/components/command-folder-update.d.mts.map +1 -0
  163. package/dist/providers/local/components/command-folder-update.mjs +48 -0
  164. package/dist/providers/local/components/command-folder-update.mjs.map +1 -0
  165. package/dist/providers/local/components/content.client.d.mts +7 -0
  166. package/dist/providers/local/components/content.client.d.mts.map +1 -0
  167. package/dist/providers/local/components/content.client.mjs +8 -0
  168. package/dist/providers/local/components/content.client.mjs.map +1 -0
  169. package/dist/providers/local/components/navigation.client.d.mts +16 -0
  170. package/dist/providers/local/components/navigation.client.d.mts.map +1 -0
  171. package/dist/providers/local/components/navigation.client.mjs +18 -0
  172. package/dist/providers/local/components/navigation.client.mjs.map +1 -0
  173. package/dist/providers/local/components/provider.client.d.mts +40 -0
  174. package/dist/providers/local/components/provider.client.d.mts.map +1 -0
  175. package/dist/providers/local/components/provider.client.mjs +61 -0
  176. package/dist/providers/local/components/provider.client.mjs.map +1 -0
  177. package/dist/providers/local/components/upload-zone-context.client.d.mts +38 -0
  178. package/dist/providers/local/components/upload-zone-context.client.d.mts.map +1 -0
  179. package/dist/providers/local/components/upload-zone-context.client.mjs +23 -0
  180. package/dist/providers/local/components/upload-zone-context.client.mjs.map +1 -0
  181. package/dist/providers/local/components/upload-zone.client.d.mts +30 -0
  182. package/dist/providers/local/components/upload-zone.client.d.mts.map +1 -0
  183. package/dist/providers/local/components/upload-zone.client.mjs +147 -0
  184. package/dist/providers/local/components/upload-zone.client.mjs.map +1 -0
  185. package/dist/providers/local/components/view.client.d.mts +32 -0
  186. package/dist/providers/local/components/view.client.d.mts.map +1 -0
  187. package/dist/providers/local/components/view.client.mjs +91 -0
  188. package/dist/providers/local/components/view.client.mjs.map +1 -0
  189. package/dist/providers/local/config/columns-data.d.mts +8 -0
  190. package/dist/providers/local/config/columns-data.d.mts.map +1 -0
  191. package/dist/providers/local/config/columns-data.mjs +70 -0
  192. package/dist/providers/local/config/columns-data.mjs.map +1 -0
  193. package/dist/providers/local/config/filters.d.mts +26 -0
  194. package/dist/providers/local/config/filters.d.mts.map +1 -0
  195. package/dist/providers/local/config/filters.mjs +15 -0
  196. package/dist/providers/local/config/filters.mjs.map +1 -0
  197. package/dist/providers/local/lib/constants.d.mts +12 -0
  198. package/dist/providers/local/lib/constants.d.mts.map +1 -0
  199. package/dist/providers/local/lib/constants.mjs +29 -0
  200. package/dist/providers/local/lib/constants.mjs.map +1 -0
  201. package/dist/providers/local/lib/helpers.d.mts +45 -0
  202. package/dist/providers/local/lib/helpers.d.mts.map +1 -0
  203. package/dist/providers/local/lib/helpers.mjs +110 -0
  204. package/dist/providers/local/lib/helpers.mjs.map +1 -0
  205. package/dist/providers/local/lib/route-handler.server.d.mts +34 -0
  206. package/dist/providers/local/lib/route-handler.server.d.mts.map +1 -0
  207. package/dist/providers/local/lib/route-handler.server.mjs +114 -0
  208. package/dist/providers/local/lib/route-handler.server.mjs.map +1 -0
  209. package/dist/providers/local/lib/router.server.d.mts +41648 -0
  210. package/dist/providers/local/lib/router.server.d.mts.map +1 -0
  211. package/dist/providers/local/lib/router.server.mjs +52 -0
  212. package/dist/providers/local/lib/router.server.mjs.map +1 -0
  213. package/dist/providers/local/lib/schema.d.mts +1113 -0
  214. package/dist/providers/local/lib/schema.d.mts.map +1 -0
  215. package/dist/providers/local/lib/schema.mjs +71 -0
  216. package/dist/providers/local/lib/schema.mjs.map +1 -0
  217. package/dist/providers/local/lib/search-params.d.mts +14 -0
  218. package/dist/providers/local/lib/search-params.d.mts.map +1 -0
  219. package/dist/providers/local/lib/search-params.mjs +9 -0
  220. package/dist/providers/local/lib/search-params.mjs.map +1 -0
  221. package/dist/providers/local/lib/service.server.d.mts +489 -0
  222. package/dist/providers/local/lib/service.server.d.mts.map +1 -0
  223. package/dist/providers/local/lib/service.server.mjs +668 -0
  224. package/dist/providers/local/lib/service.server.mjs.map +1 -0
  225. package/dist/providers/local/lib/upload.client.d.mts +62 -0
  226. package/dist/providers/local/lib/upload.client.d.mts.map +1 -0
  227. package/dist/providers/local/lib/upload.client.mjs +100 -0
  228. package/dist/providers/local/lib/upload.client.mjs.map +1 -0
  229. package/dist/providers/local/lib/validators.d.mts +454 -0
  230. package/dist/providers/local/lib/validators.d.mts.map +1 -0
  231. package/dist/providers/local/lib/validators.mjs +96 -0
  232. package/dist/providers/local/lib/validators.mjs.map +1 -0
  233. package/dist/server.d.mts +2 -0
  234. package/dist/server.mjs +3 -0
  235. package/package.json +3 -2
  236. 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 };
@@ -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"}