@tulip-systems/drive 0.8.2 → 0.8.3

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 (230) hide show
  1. package/dist/components/content.d.mts +1 -2
  2. package/dist/components/content.mjs +1 -2
  3. package/dist/components/context.client.d.mts +1 -2
  4. package/dist/components/dnd.client.d.mts +1 -2
  5. package/dist/components/dnd.client.mjs +1 -2
  6. package/dist/components/grid-card.client.d.mts +5 -2
  7. package/dist/components/grid-card.client.mjs +15 -15
  8. package/dist/components/grid.client.d.mts +1 -2
  9. package/dist/components/grid.client.mjs +1 -2
  10. package/dist/components/navigation/breadcrumbs.client.d.mts +1 -2
  11. package/dist/components/navigation/breadcrumbs.client.mjs +1 -2
  12. package/dist/components/navigation/header.client.d.mts +1 -2
  13. package/dist/components/navigation/header.client.mjs +1 -2
  14. package/dist/components/navigation/toolbar.client.d.mts +1 -2
  15. package/dist/components/navigation/toolbar.client.mjs +1 -2
  16. package/dist/components/navigation/view-switcher.client.d.mts +1 -2
  17. package/dist/components/navigation/view-switcher.client.mjs +1 -2
  18. package/dist/components/selection.client.d.mts +2 -3
  19. package/dist/components/selection.client.mjs +2 -5
  20. package/dist/components/view.client.d.mts +1 -2
  21. package/dist/components/view.client.mjs +1 -2
  22. package/dist/config/filters.mjs +1 -2
  23. package/dist/config/types.mjs +1 -2
  24. package/dist/lib/constants.d.mts +1 -2
  25. package/dist/lib/constants.mjs +1 -2
  26. package/dist/lib/contracts.d.mts +1 -2
  27. package/dist/lib/dto.d.mts +1 -2
  28. package/dist/lib/dto.mjs +1 -2
  29. package/dist/lib/helpers.d.mts +1 -2
  30. package/dist/lib/helpers.mjs +1 -2
  31. package/dist/lib/helpers.server.d.mts +1 -2
  32. package/dist/lib/helpers.server.mjs +1 -2
  33. package/dist/lib/search-params.d.mts +1 -2
  34. package/dist/lib/search-params.mjs +1 -2
  35. package/dist/lib/validators.d.mts +1 -2
  36. package/dist/lib/validators.mjs +1 -2
  37. package/dist/providers/google/components/command-file-update.d.mts +1 -2
  38. package/dist/providers/google/components/command-file-update.mjs +3 -4
  39. package/dist/providers/google/components/command-folder-create.d.mts +1 -2
  40. package/dist/providers/google/components/command-folder-create.mjs +3 -4
  41. package/dist/providers/google/components/command-folder-update.d.mts +1 -2
  42. package/dist/providers/google/components/command-folder-update.mjs +3 -4
  43. package/dist/providers/google/components/content.client.d.mts +1 -2
  44. package/dist/providers/google/components/content.client.mjs +1 -2
  45. package/dist/providers/google/components/navigation.client.d.mts +1 -2
  46. package/dist/providers/google/components/navigation.client.mjs +1 -2
  47. package/dist/providers/google/components/provider.client.d.mts +1 -2
  48. package/dist/providers/google/components/provider.client.mjs +1 -2
  49. package/dist/providers/google/components/view.client.d.mts +1 -2
  50. package/dist/providers/google/components/view.client.mjs +2 -4
  51. package/dist/providers/google/config/columns-data.d.mts +1 -2
  52. package/dist/providers/google/config/columns-data.mjs +1 -2
  53. package/dist/providers/google/config/filters.d.mts +1 -2
  54. package/dist/providers/google/config/filters.mjs +1 -2
  55. package/dist/providers/google/lib/constants.mjs +1 -2
  56. package/dist/providers/google/lib/dto.d.mts +1 -2
  57. package/dist/providers/google/lib/dto.mjs +1 -2
  58. package/dist/providers/google/lib/helpers.mjs +1 -9
  59. package/dist/providers/google/lib/router.server.d.mts +3 -4
  60. package/dist/providers/google/lib/router.server.mjs +1 -2
  61. package/dist/providers/google/lib/search-params.d.mts +1 -2
  62. package/dist/providers/google/lib/search-params.mjs +1 -2
  63. package/dist/providers/google/lib/service.server.d.mts +1 -2
  64. package/dist/providers/google/lib/service.server.mjs +2 -5
  65. package/dist/providers/google/lib/validators.d.mts +1 -2
  66. package/dist/providers/google/lib/validators.mjs +1 -2
  67. package/dist/providers/local/components/command-file-update.d.mts +1 -2
  68. package/dist/providers/local/components/command-file-update.mjs +3 -4
  69. package/dist/providers/local/components/command-file-upload.d.mts +1 -2
  70. package/dist/providers/local/components/command-file-upload.mjs +1 -2
  71. package/dist/providers/local/components/command-folder-create.d.mts +1 -2
  72. package/dist/providers/local/components/command-folder-create.mjs +3 -4
  73. package/dist/providers/local/components/command-folder-update.d.mts +1 -2
  74. package/dist/providers/local/components/command-folder-update.mjs +3 -4
  75. package/dist/providers/local/components/content.client.d.mts +1 -2
  76. package/dist/providers/local/components/content.client.mjs +1 -2
  77. package/dist/providers/local/components/navigation.client.d.mts +1 -2
  78. package/dist/providers/local/components/navigation.client.mjs +1 -2
  79. package/dist/providers/local/components/provider.client.d.mts +1 -2
  80. package/dist/providers/local/components/provider.client.mjs +1 -2
  81. package/dist/providers/local/components/upload-zone-context.client.d.mts +1 -2
  82. package/dist/providers/local/components/upload-zone-context.client.mjs +1 -2
  83. package/dist/providers/local/components/upload-zone.client.d.mts +1 -2
  84. package/dist/providers/local/components/upload-zone.client.mjs +2 -3
  85. package/dist/providers/local/components/view.client.d.mts +1 -2
  86. package/dist/providers/local/components/view.client.mjs +1 -2
  87. package/dist/providers/local/config/columns-data.d.mts +1 -2
  88. package/dist/providers/local/config/columns-data.mjs +1 -2
  89. package/dist/providers/local/config/filters.d.mts +1 -2
  90. package/dist/providers/local/config/filters.mjs +1 -2
  91. package/dist/providers/local/lib/constants.d.mts +1 -2
  92. package/dist/providers/local/lib/constants.mjs +1 -2
  93. package/dist/providers/local/lib/helpers.d.mts +1 -2
  94. package/dist/providers/local/lib/helpers.mjs +1 -2
  95. package/dist/providers/local/lib/route-handler.server.d.mts +1 -2
  96. package/dist/providers/local/lib/route-handler.server.mjs +1 -2
  97. package/dist/providers/local/lib/router.server.d.mts +25 -26
  98. package/dist/providers/local/lib/router.server.mjs +1 -2
  99. package/dist/providers/local/lib/schema.d.mts +1 -2
  100. package/dist/providers/local/lib/schema.mjs +1 -2
  101. package/dist/providers/local/lib/search-params.d.mts +1 -2
  102. package/dist/providers/local/lib/search-params.mjs +1 -2
  103. package/dist/providers/local/lib/service.server.d.mts +13 -14
  104. package/dist/providers/local/lib/service.server.mjs +1 -2
  105. package/dist/providers/local/lib/upload.client.d.mts +1 -2
  106. package/dist/providers/local/lib/upload.client.mjs +1 -2
  107. package/dist/providers/local/lib/validators.d.mts +1 -2
  108. package/dist/providers/local/lib/validators.mjs +1 -2
  109. package/package.json +44 -46
  110. package/src/components/grid-card.client.tsx +17 -12
  111. package/src/components/selection.client.tsx +1 -2
  112. package/src/config/types.tsx +1 -1
  113. package/src/providers/google/components/command-file-update.tsx +2 -2
  114. package/src/providers/google/components/command-folder-create.tsx +2 -2
  115. package/src/providers/google/components/command-folder-update.tsx +2 -2
  116. package/src/providers/google/components/view.client.tsx +1 -7
  117. package/src/providers/google/lib/helpers.ts +0 -9
  118. package/src/providers/google/lib/service.server.ts +1 -3
  119. package/src/providers/local/components/command-file-update.tsx +2 -2
  120. package/src/providers/local/components/command-folder-create.tsx +2 -2
  121. package/src/providers/local/components/command-folder-update.tsx +2 -2
  122. package/src/providers/local/components/upload-zone.client.tsx +1 -1
  123. package/dist/components/content.d.mts.map +0 -1
  124. package/dist/components/content.mjs.map +0 -1
  125. package/dist/components/context.client.d.mts.map +0 -1
  126. package/dist/components/dnd.client.d.mts.map +0 -1
  127. package/dist/components/dnd.client.mjs.map +0 -1
  128. package/dist/components/grid-card.client.d.mts.map +0 -1
  129. package/dist/components/grid-card.client.mjs.map +0 -1
  130. package/dist/components/grid.client.d.mts.map +0 -1
  131. package/dist/components/grid.client.mjs.map +0 -1
  132. package/dist/components/navigation/breadcrumbs.client.d.mts.map +0 -1
  133. package/dist/components/navigation/breadcrumbs.client.mjs.map +0 -1
  134. package/dist/components/navigation/header.client.d.mts.map +0 -1
  135. package/dist/components/navigation/header.client.mjs.map +0 -1
  136. package/dist/components/navigation/toolbar.client.d.mts.map +0 -1
  137. package/dist/components/navigation/toolbar.client.mjs.map +0 -1
  138. package/dist/components/navigation/view-switcher.client.d.mts.map +0 -1
  139. package/dist/components/navigation/view-switcher.client.mjs.map +0 -1
  140. package/dist/components/selection.client.d.mts.map +0 -1
  141. package/dist/components/selection.client.mjs.map +0 -1
  142. package/dist/components/view.client.d.mts.map +0 -1
  143. package/dist/components/view.client.mjs.map +0 -1
  144. package/dist/config/filters.mjs.map +0 -1
  145. package/dist/config/types.mjs.map +0 -1
  146. package/dist/lib/constants.d.mts.map +0 -1
  147. package/dist/lib/constants.mjs.map +0 -1
  148. package/dist/lib/contracts.d.mts.map +0 -1
  149. package/dist/lib/dto.d.mts.map +0 -1
  150. package/dist/lib/dto.mjs.map +0 -1
  151. package/dist/lib/helpers.d.mts.map +0 -1
  152. package/dist/lib/helpers.mjs.map +0 -1
  153. package/dist/lib/helpers.server.d.mts.map +0 -1
  154. package/dist/lib/helpers.server.mjs.map +0 -1
  155. package/dist/lib/search-params.d.mts.map +0 -1
  156. package/dist/lib/search-params.mjs.map +0 -1
  157. package/dist/lib/validators.d.mts.map +0 -1
  158. package/dist/lib/validators.mjs.map +0 -1
  159. package/dist/providers/google/components/command-file-update.d.mts.map +0 -1
  160. package/dist/providers/google/components/command-file-update.mjs.map +0 -1
  161. package/dist/providers/google/components/command-folder-create.d.mts.map +0 -1
  162. package/dist/providers/google/components/command-folder-create.mjs.map +0 -1
  163. package/dist/providers/google/components/command-folder-update.d.mts.map +0 -1
  164. package/dist/providers/google/components/command-folder-update.mjs.map +0 -1
  165. package/dist/providers/google/components/content.client.d.mts.map +0 -1
  166. package/dist/providers/google/components/content.client.mjs.map +0 -1
  167. package/dist/providers/google/components/navigation.client.d.mts.map +0 -1
  168. package/dist/providers/google/components/navigation.client.mjs.map +0 -1
  169. package/dist/providers/google/components/provider.client.d.mts.map +0 -1
  170. package/dist/providers/google/components/provider.client.mjs.map +0 -1
  171. package/dist/providers/google/components/view.client.d.mts.map +0 -1
  172. package/dist/providers/google/components/view.client.mjs.map +0 -1
  173. package/dist/providers/google/config/columns-data.d.mts.map +0 -1
  174. package/dist/providers/google/config/columns-data.mjs.map +0 -1
  175. package/dist/providers/google/config/filters.d.mts.map +0 -1
  176. package/dist/providers/google/config/filters.mjs.map +0 -1
  177. package/dist/providers/google/lib/constants.mjs.map +0 -1
  178. package/dist/providers/google/lib/dto.d.mts.map +0 -1
  179. package/dist/providers/google/lib/dto.mjs.map +0 -1
  180. package/dist/providers/google/lib/helpers.mjs.map +0 -1
  181. package/dist/providers/google/lib/router.server.d.mts.map +0 -1
  182. package/dist/providers/google/lib/router.server.mjs.map +0 -1
  183. package/dist/providers/google/lib/search-params.d.mts.map +0 -1
  184. package/dist/providers/google/lib/search-params.mjs.map +0 -1
  185. package/dist/providers/google/lib/service.server.d.mts.map +0 -1
  186. package/dist/providers/google/lib/service.server.mjs.map +0 -1
  187. package/dist/providers/google/lib/validators.d.mts.map +0 -1
  188. package/dist/providers/google/lib/validators.mjs.map +0 -1
  189. package/dist/providers/local/components/command-file-update.d.mts.map +0 -1
  190. package/dist/providers/local/components/command-file-update.mjs.map +0 -1
  191. package/dist/providers/local/components/command-file-upload.d.mts.map +0 -1
  192. package/dist/providers/local/components/command-file-upload.mjs.map +0 -1
  193. package/dist/providers/local/components/command-folder-create.d.mts.map +0 -1
  194. package/dist/providers/local/components/command-folder-create.mjs.map +0 -1
  195. package/dist/providers/local/components/command-folder-update.d.mts.map +0 -1
  196. package/dist/providers/local/components/command-folder-update.mjs.map +0 -1
  197. package/dist/providers/local/components/content.client.d.mts.map +0 -1
  198. package/dist/providers/local/components/content.client.mjs.map +0 -1
  199. package/dist/providers/local/components/navigation.client.d.mts.map +0 -1
  200. package/dist/providers/local/components/navigation.client.mjs.map +0 -1
  201. package/dist/providers/local/components/provider.client.d.mts.map +0 -1
  202. package/dist/providers/local/components/provider.client.mjs.map +0 -1
  203. package/dist/providers/local/components/upload-zone-context.client.d.mts.map +0 -1
  204. package/dist/providers/local/components/upload-zone-context.client.mjs.map +0 -1
  205. package/dist/providers/local/components/upload-zone.client.d.mts.map +0 -1
  206. package/dist/providers/local/components/upload-zone.client.mjs.map +0 -1
  207. package/dist/providers/local/components/view.client.d.mts.map +0 -1
  208. package/dist/providers/local/components/view.client.mjs.map +0 -1
  209. package/dist/providers/local/config/columns-data.d.mts.map +0 -1
  210. package/dist/providers/local/config/columns-data.mjs.map +0 -1
  211. package/dist/providers/local/config/filters.d.mts.map +0 -1
  212. package/dist/providers/local/config/filters.mjs.map +0 -1
  213. package/dist/providers/local/lib/constants.d.mts.map +0 -1
  214. package/dist/providers/local/lib/constants.mjs.map +0 -1
  215. package/dist/providers/local/lib/helpers.d.mts.map +0 -1
  216. package/dist/providers/local/lib/helpers.mjs.map +0 -1
  217. package/dist/providers/local/lib/route-handler.server.d.mts.map +0 -1
  218. package/dist/providers/local/lib/route-handler.server.mjs.map +0 -1
  219. package/dist/providers/local/lib/router.server.d.mts.map +0 -1
  220. package/dist/providers/local/lib/router.server.mjs.map +0 -1
  221. package/dist/providers/local/lib/schema.d.mts.map +0 -1
  222. package/dist/providers/local/lib/schema.mjs.map +0 -1
  223. package/dist/providers/local/lib/search-params.d.mts.map +0 -1
  224. package/dist/providers/local/lib/search-params.mjs.map +0 -1
  225. package/dist/providers/local/lib/service.server.d.mts.map +0 -1
  226. package/dist/providers/local/lib/service.server.mjs.map +0 -1
  227. package/dist/providers/local/lib/upload.client.d.mts.map +0 -1
  228. package/dist/providers/local/lib/upload.client.mjs.map +0 -1
  229. package/dist/providers/local/lib/validators.d.mts.map +0 -1
  230. package/dist/providers/local/lib/validators.mjs.map +0 -1
@@ -104,21 +104,21 @@ declare class LocalDrive<TSchema extends TDatabaseSchema> implements DriveReader
104
104
  id: string | null;
105
105
  namespace: string;
106
106
  }): Promise<(Pick<{
107
+ id: string;
108
+ createdAt: Date;
109
+ updatedAt: Date;
107
110
  name: string;
108
- namespace: string;
109
- parentId: string | null;
110
- contentType: string | null;
111
- size: number | null;
112
111
  type: "file" | "folder" | null;
113
112
  readonly: boolean | null;
114
- id: string;
113
+ size: number | null;
114
+ contentType: string | null;
115
+ namespace: string;
115
116
  subtype: "image" | "document" | "spreadsheet" | "video" | "audio" | "archive" | "other";
116
- createdAt: Date;
117
- updatedAt: Date;
118
117
  hidden: boolean | null;
119
118
  archivedAt: Date | null;
119
+ parentId: string | null;
120
120
  assetId: string | null;
121
- }, "name" | "parentId" | "id"> & {
121
+ }, "id" | "name" | "parentId"> & {
122
122
  depth: number;
123
123
  })[]>;
124
124
  /**
@@ -247,19 +247,19 @@ declare class LocalDrive<TSchema extends TDatabaseSchema> implements DriveReader
247
247
  presignedUrl: string;
248
248
  node: LocalDriveFileNode;
249
249
  asset: {
250
- name: string | null;
251
- status: "pending" | "error" | "ready";
252
- metadata: unknown;
253
250
  id: string;
254
251
  createdAt: Date;
255
252
  updatedAt: Date;
253
+ name: string | null;
256
254
  key: string;
255
+ metadata: unknown;
257
256
  provider: "s3";
258
- size: number | null;
259
257
  uploadId: string;
260
258
  visibility: "private" | "public";
259
+ size: number | null;
261
260
  contentType: string | null;
262
261
  bucket: string;
262
+ status: "error" | "pending" | "ready";
263
263
  etag: string | null;
264
264
  uploadedAt: Date;
265
265
  deletedAt: Date | null;
@@ -485,5 +485,4 @@ declare class LocalDrive<TSchema extends TDatabaseSchema> implements DriveReader
485
485
  deleteNodes(ids: string[]): Promise<void>;
486
486
  }
487
487
  //#endregion
488
- export { LocalDrive, LocalDriveConfig };
489
- //# sourceMappingURL=service.server.d.mts.map
488
+ export { LocalDrive, LocalDriveConfig };
@@ -664,5 +664,4 @@ var LocalDrive = class {
664
664
  };
665
665
 
666
666
  //#endregion
667
- export { LocalDrive };
668
- //# sourceMappingURL=service.server.mjs.map
667
+ export { LocalDrive };
@@ -58,5 +58,4 @@ type CreateLocalDriveUploadClientProps = {
58
58
  };
59
59
  declare function createLocalDriveUploadClient(props: CreateLocalDriveUploadClientProps): LocalDriveUploadClient;
60
60
  //#endregion
61
- export { LocalDriveUploadClient, LocalDriveUploadFileRequest, LocalDriveUploadHooks, PrepareLocalDriveUploadInput, createLocalDriveUploadClient };
62
- //# sourceMappingURL=upload.client.d.mts.map
61
+ export { LocalDriveUploadClient, LocalDriveUploadFileRequest, LocalDriveUploadHooks, PrepareLocalDriveUploadInput, createLocalDriveUploadClient };
@@ -96,5 +96,4 @@ function createLocalDriveUploadClient(props) {
96
96
  }
97
97
 
98
98
  //#endregion
99
- export { createLocalDriveUploadClient };
100
- //# sourceMappingURL=upload.client.mjs.map
99
+ export { createLocalDriveUploadClient };
@@ -450,5 +450,4 @@ declare const getLocalDriveNodesByParentIdInputSchema: z.ZodObject<{
450
450
  }, z.core.$strip>;
451
451
  type GetLocalDriveNodesByParentIdInput = z.input<typeof getLocalDriveNodesByParentIdInputSchema>;
452
452
  //#endregion
453
- export { CreateLocalDriveFolderInput, CreateLocalDriveFolderSchema, GetLocalDriveNodesByParentIdInput, GetLocalFileURLSchema, ListLocalDriveFlatSchema, ListLocalDriveTreeInput, ListLocalDriveTreeSchema, LocalDriveFileNode, LocalDriveFolderNode, LocalDriveNode, LocalDriveNodeChild, LocalDriveNodeWithAsset, LocalDriveNodeWithChildren, LocalDriveTableFilters, LocalNode, PresignLocalDriveFileInput, UpdateLocalDriveNodeInput, UploadLocalDriveFileSchema, createLocalDriveFolderInputSchema, getLocalDriveNodesByParentIdInputSchema, getLocalFileURLSchema, getLocalFileURLSchemaDefaults, listLocalDriveFlatInputSchema, listLocalDriveTreeInputSchema, localDriveFlatFiltersSchema, localDriveNodeSchema, localDriveNodeWithChildrenSchema, localDriveTreeFiltersSchema, presignLocalDriveFileInputSchema, updateLocalDriveNodeInputSchema, uploadLocalDriveFileInputSchema };
454
- //# sourceMappingURL=validators.d.mts.map
453
+ export { CreateLocalDriveFolderInput, CreateLocalDriveFolderSchema, GetLocalDriveNodesByParentIdInput, GetLocalFileURLSchema, ListLocalDriveFlatSchema, ListLocalDriveTreeInput, ListLocalDriveTreeSchema, LocalDriveFileNode, LocalDriveFolderNode, LocalDriveNode, LocalDriveNodeChild, LocalDriveNodeWithAsset, LocalDriveNodeWithChildren, LocalDriveTableFilters, LocalNode, PresignLocalDriveFileInput, UpdateLocalDriveNodeInput, UploadLocalDriveFileSchema, createLocalDriveFolderInputSchema, getLocalDriveNodesByParentIdInputSchema, getLocalFileURLSchema, getLocalFileURLSchemaDefaults, listLocalDriveFlatInputSchema, listLocalDriveTreeInputSchema, localDriveFlatFiltersSchema, localDriveNodeSchema, localDriveNodeWithChildrenSchema, localDriveTreeFiltersSchema, presignLocalDriveFileInputSchema, updateLocalDriveNodeInputSchema, uploadLocalDriveFileInputSchema };
@@ -92,5 +92,4 @@ const getLocalDriveNodesByParentIdInputSchema = tableQuerySchema.pick({
92
92
  }).extend({ filters: localDriveTreeFiltersSchema });
93
93
 
94
94
  //#endregion
95
- export { createLocalDriveFolderInputSchema, getLocalDriveNodesByParentIdInputSchema, getLocalFileURLSchema, getLocalFileURLSchemaDefaults, listLocalDriveFlatInputSchema, listLocalDriveTreeInputSchema, localDriveFlatFiltersSchema, localDriveNodeSchema, localDriveNodeWithChildrenSchema, localDriveTreeFiltersSchema, presignLocalDriveFileInputSchema, updateLocalDriveNodeInputSchema, uploadLocalDriveFileInputSchema };
96
- //# sourceMappingURL=validators.mjs.map
95
+ export { createLocalDriveFolderInputSchema, getLocalDriveNodesByParentIdInputSchema, getLocalFileURLSchema, getLocalFileURLSchemaDefaults, listLocalDriveFlatInputSchema, listLocalDriveTreeInputSchema, localDriveFlatFiltersSchema, localDriveNodeSchema, localDriveNodeWithChildrenSchema, localDriveTreeFiltersSchema, presignLocalDriveFileInputSchema, updateLocalDriveNodeInputSchema, uploadLocalDriveFileInputSchema };
package/package.json CHANGED
@@ -1,82 +1,79 @@
1
1
  {
2
2
  "name": "@tulip-systems/drive",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "license": "AGPL-3.0",
7
7
  "devDependencies": {
8
- "@types/pg": "^8.16.0",
8
+ "@arethetypeswrong/core": "^0.18.2",
9
+ "@types/pg": "^8.20.0",
9
10
  "@types/react": "19.2.14",
10
11
  "@types/react-dom": "19.2.3",
11
12
  "aws-sdk-client-mock": "^4.1.0",
12
13
  "aws-sdk-client-mock-vitest": "^7.0.1",
13
- "tailwindcss": "^4.2.0",
14
+ "publint": "^0.3.20",
15
+ "tailwindcss": "^4.3.0",
14
16
  "tsdown": "^0.20.3",
15
17
  "typescript": "5.9.3",
16
- "vite": "^7.3.1",
17
- "vitest": "^4.1.0",
18
+ "unrun": "^0.3.0",
19
+ "vitest": "^4.1.5",
18
20
  "@tulip-systems/typescript-config": "0.0.0"
19
21
  },
20
22
  "dependencies": {
21
- "@dnd-kit/collision": "^0.3.2",
22
- "@dnd-kit/dom": "^0.3.2",
23
- "@dnd-kit/helpers": "^0.3.2",
24
- "@dnd-kit/react": "^0.3.2",
23
+ "@dnd-kit/collision": "^0.4.0",
24
+ "@dnd-kit/dom": "^0.4.0",
25
+ "@dnd-kit/helpers": "^0.4.0",
26
+ "@dnd-kit/react": "^0.4.0",
25
27
  "@dnd-kit/sortable": "^10.0.0",
26
28
  "@dnd-kit/utilities": "^3.2.2",
27
- "@google-cloud/local-auth": "2.1.0",
28
29
  "@hookform/resolvers": "^5.2.2",
29
- "@orpc/client": "^1.13.5",
30
- "@orpc/contract": "^1.13.5",
31
- "@orpc/server": "^1.13.5",
32
- "@orpc/tanstack-query": "^1.13.5",
33
- "@react-email/components": "^1.0.8",
34
- "@tanstack/react-query": "^5.90.21",
35
- "@tanstack/react-query-devtools": "^5.91.3",
30
+ "@orpc/client": "^1.14.2",
31
+ "@orpc/contract": "^1.14.2",
32
+ "@orpc/server": "^1.14.2",
33
+ "@orpc/tanstack-query": "^1.14.2",
34
+ "@tanstack/react-query": "^5.100.9",
35
+ "@tanstack/react-query-devtools": "^5.100.9",
36
36
  "@tanstack/react-table": "^8.21.3",
37
- "@tanstack/react-virtual": "^3.13.18",
37
+ "@tanstack/react-virtual": "^3.13.24",
38
38
  "class-variance-authority": "^0.7.1",
39
39
  "client-only": "^0.0.1",
40
40
  "clsx": "^2.1.1",
41
41
  "cmdk": "1.1.1",
42
42
  "date-fns": "^4.1.0",
43
43
  "deepmerge": "^4.3.1",
44
- "drizzle-orm": "^0.45.1",
44
+ "drizzle-orm": "^0.45.2",
45
45
  "drizzle-zod": "^0.8.3",
46
46
  "embla-carousel-react": "^8.6.0",
47
- "googleapis": "105",
48
- "lucide-react": "^0.575.0",
49
- "motion": "^12.34.3",
47
+ "googleapis": "^171.4.0",
48
+ "lucide-react": "^1.14.0",
49
+ "motion": "^12.38.0",
50
50
  "next-themes": "^0.4.6",
51
51
  "radix-ui": "^1.4.3",
52
- "react-colorful": "^5.6.1",
53
- "react-day-picker": "9.13.2",
52
+ "react-colorful": "^5.7.0",
53
+ "react-day-picker": "10.0.0",
54
54
  "react-dropzone": "^15.0.0",
55
- "react-email": "^5.2.8",
56
- "react-hook-form": "^7.71.2",
57
- "react-hotkeys-hook": "^5.2.4",
58
- "react-resizable-panels": "^4.6.4",
59
- "resend": "^6.9.2",
55
+ "react-email": "^6.1.1",
56
+ "react-hook-form": "^7.75.0",
57
+ "react-hotkeys-hook": "^5.3.2",
58
+ "react-resizable-panels": "^4.11.0",
59
+ "resend": "^6.12.3",
60
60
  "server-cli-only": "^0.3.2",
61
61
  "server-only": "^0.0.1",
62
62
  "sonner": "^2.0.7",
63
- "tailwind-merge": "^3.5.0",
64
- "use-debounce": "^10.1.0",
65
- "uuid": "^13.0.0",
63
+ "tailwind-merge": "^3.6.0",
64
+ "use-debounce": "^10.1.1",
65
+ "uuid": "^14.0.0",
66
66
  "vaul": "^1.1.2",
67
- "zod": "^4.3.6",
68
- "@tulip-systems/core": "0.8.2"
67
+ "zod": "^4.4.3",
68
+ "@tulip-systems/core": "0.8.3"
69
69
  },
70
70
  "peerDependencies": {
71
- "@better-auth/passkey": "^1.5.5",
72
71
  "@tailwindcss/typography": "^0.5.19",
73
- "better-auth": "^1.5.5",
74
- "next": "16.1.6",
75
- "nuqs": "2.8.8",
76
- "pg": "8.18.0",
77
- "react": "19.2.4",
78
- "react-dom": "19.2.4",
79
- "recharts": "2.15.4",
72
+ "next": "16.2.6",
73
+ "nuqs": "2.8.9",
74
+ "pg": "8.20.0",
75
+ "react": "19.2.6",
76
+ "react-dom": "19.2.6",
80
77
  "sharp": "^0.34.5"
81
78
  },
82
79
  "publishConfig": {
@@ -103,12 +100,13 @@
103
100
  "./styles.css": "./src/styles.css"
104
101
  },
105
102
  "scripts": {
106
- "dev": "tsdown --config-loader tsdown.config.ts --watch",
107
- "build": "tsdown --config-loader tsdown.config.ts",
103
+ "dev": "tsdown --config tsdown.config.ts --config-loader unrun --watch",
104
+ "build": "tsdown --config tsdown.config.ts --config-loader unrun",
108
105
  "release:build": "pnpm run build",
109
106
  "lint": "biome check",
110
107
  "format": "biome format --write",
111
- "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
112
- "test": "vitest"
108
+ "typecheck": "tsc --noEmit",
109
+ "test": "vitest",
110
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
113
111
  }
114
112
  }
@@ -31,6 +31,7 @@ type DriveGridCardProps<TData extends DriveNode> = ComponentProps<"div"> & {
31
31
  node: TData;
32
32
  commands?: CommandDef<TData>[];
33
33
  imageLoader?: (props: ImageLoaderProps) => string;
34
+ unoptimized?: boolean;
34
35
  };
35
36
 
36
37
  export function DriveGridCard<TData extends DriveNode>(props: DriveGridCardProps<TData>) {
@@ -56,6 +57,8 @@ export function DriveGridFolderCard<TData extends DriveNode>({
56
57
  node,
57
58
  commands,
58
59
  onDoubleClick,
60
+ imageLoader,
61
+ unoptimized,
59
62
  className,
60
63
  ...props
61
64
  }: DriveGridCardProps<TData>) {
@@ -63,7 +66,7 @@ export function DriveGridFolderCard<TData extends DriveNode>({
63
66
 
64
67
  const router = useRouter();
65
68
 
66
- const { selection, selectionConditions } = useDriveSelectionContext();
69
+ const selectionContext = useDriveSelectionContext();
67
70
 
68
71
  const droppable = useDroppable({ id: node.id });
69
72
  const draggable = useDraggable({ id: node.id });
@@ -77,11 +80,11 @@ export function DriveGridFolderCard<TData extends DriveNode>({
77
80
  {...props}
78
81
  key={id}
79
82
  ref={draggable.ref}
80
- data-selected={selection?.rowSelection?.[id]}
83
+ data-selected={selectionContext?.selection?.rowSelection?.[id]}
81
84
  data-dragging={draggable.isDragging}
82
85
  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"
83
86
  onClick={() => {
84
- const conditions = selectionConditions?.(node);
87
+ const conditions = selectionContext?.selectionConditions?.(node);
85
88
 
86
89
  if (conditions !== undefined) {
87
90
  const canSelect = Array.isArray(conditions)
@@ -91,12 +94,12 @@ export function DriveGridFolderCard<TData extends DriveNode>({
91
94
  if (!canSelect) return;
92
95
  }
93
96
 
94
- const isSelected = selection?.rowSelection?.[id];
97
+ const isSelected = selectionContext?.selection?.rowSelection?.[id];
95
98
 
96
99
  if (!isSelected) {
97
- selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
100
+ selectionContext?.selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
98
101
  } else {
99
- selection?.setRowSelection?.((old) => {
102
+ selectionContext?.selection?.setRowSelection?.((old) => {
100
103
  const newSelection = { ...old };
101
104
  delete newSelection[id];
102
105
  return newSelection;
@@ -144,13 +147,14 @@ export function DriveGridFileCard<TData extends DriveNode>({
144
147
  node,
145
148
  commands,
146
149
  imageLoader,
150
+ unoptimized = false,
147
151
  className,
148
152
  ...props
149
153
  }: DriveGridCardProps<TData>) {
150
154
  const { id } = node;
151
155
 
152
156
  const { ref, isDragging } = useDraggable({ id });
153
- const { selection, selectionConditions } = useDriveSelectionContext();
157
+ const selectionContext = useDriveSelectionContext();
154
158
 
155
159
  const subtype = findStatus(nodeSubtypeConfig, node.subtype);
156
160
  const Icon = subtype?.icon;
@@ -165,11 +169,11 @@ export function DriveGridFileCard<TData extends DriveNode>({
165
169
  {...props}
166
170
  key={id}
167
171
  ref={ref}
168
- data-selected={selection?.rowSelection?.[id]}
172
+ data-selected={selectionContext?.selection?.rowSelection?.[id]}
169
173
  data-dragging={isDragging}
170
174
  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"
171
175
  onClick={() => {
172
- const conditions = selectionConditions?.(node);
176
+ const conditions = selectionContext?.selectionConditions?.(node);
173
177
 
174
178
  if (conditions !== undefined) {
175
179
  const canSelect = Array.isArray(conditions)
@@ -179,12 +183,12 @@ export function DriveGridFileCard<TData extends DriveNode>({
179
183
  if (!canSelect) return;
180
184
  }
181
185
 
182
- const isSelected = selection?.rowSelection?.[id];
186
+ const isSelected = selectionContext?.selection?.rowSelection?.[id];
183
187
 
184
188
  if (!isSelected) {
185
- selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
189
+ selectionContext?.selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
186
190
  } else {
187
- selection?.setRowSelection?.((old) => {
191
+ selectionContext?.selection?.setRowSelection?.((old) => {
188
192
  const newSelection = { ...old };
189
193
  delete newSelection[id];
190
194
  return newSelection;
@@ -222,6 +226,7 @@ export function DriveGridFileCard<TData extends DriveNode>({
222
226
  height={200}
223
227
  loader={imageLoader}
224
228
  className="h-full w-full object-cover"
229
+ unoptimized={unoptimized}
225
230
  />
226
231
  ) : (
227
232
  <div className="flex h-full w-full items-center justify-center">
@@ -19,8 +19,7 @@ const DriveSelectionContext = createContext<DriveSelectionContextValue | null>(n
19
19
  */
20
20
  export function useDriveSelectionContext() {
21
21
  const context = use(DriveSelectionContext);
22
- if (!context) throw new Error("DriveSelectionContext not found!");
23
- return context;
22
+ return context ?? null;
24
23
  }
25
24
 
26
25
  /**
@@ -14,7 +14,7 @@ import {
14
14
  FileTextIcon,
15
15
  FileVideoIcon,
16
16
  } from "lucide-react";
17
- import type { DriveNodeSubtype } from "@/lib/validators";
17
+ import type { DriveNodeSubtype } from "@/lib/dto";
18
18
 
19
19
  /**
20
20
  * Node subtype config
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -56,7 +56,7 @@ export function GoogleDriveFileUpdateCommand<
56
56
  mutation,
57
57
  }: GoogleDriveFileUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
58
58
  const form = useForm<UpdateGoogleDriveNodeInput>({
59
- resolver: zodResolver(updateGoogleDriveNodeInputSchema),
59
+ resolver: standardSchemaResolver(updateGoogleDriveNodeInputSchema),
60
60
  defaultValues,
61
61
  });
62
62
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -60,7 +60,7 @@ export function GoogleDriveFoldersCreateCommand<
60
60
  const [{ parentId }] = useQueryStates(driveTreeSearchParams);
61
61
 
62
62
  const form = useForm<CreateGoogleDriveFolderInput>({
63
- resolver: zodResolver(createGoogleDriveFolderInputSchema),
63
+ resolver: standardSchemaResolver(createGoogleDriveFolderInputSchema),
64
64
  defaultValues: { ...defaultValues, parentId },
65
65
  });
66
66
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -56,7 +56,7 @@ export function GoogleDriveFoldersUpdateCommand<
56
56
  mutation,
57
57
  }: GoogleDriveFoldersUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
58
58
  const form = useForm<UpdateGoogleDriveNodeInput>({
59
- resolver: zodResolver(updateGoogleDriveNodeInputSchema),
59
+ resolver: standardSchemaResolver(updateGoogleDriveNodeInputSchema),
60
60
  defaultValues,
61
61
  });
62
62
 
@@ -23,7 +23,6 @@ import { DriveGridCard, DriveGridCardSkeleton } from "@/components/grid-card.cli
23
23
  import { useDriveSelectionContext } from "@/components/selection.client";
24
24
  import { useDriveViewContext } from "@/components/view.client";
25
25
  import { googleDriveColumns } from "../config/columns-data";
26
- import { googleDriveImageLoader } from "../lib/helpers";
27
26
  import type { GoogleDriveNode } from "../lib/validators";
28
27
  import { useGoogleDriveContext } from "./provider.client";
29
28
 
@@ -108,12 +107,7 @@ function GoogleDriveGrid(props: ComponentProps<"div">) {
108
107
  <DriveGrid {...props}>
109
108
  {queryData.length > 0 ? (
110
109
  queryData.map((node) => (
111
- <DriveGridCard
112
- key={node.id}
113
- node={node}
114
- commands={commands}
115
- imageLoader={googleDriveImageLoader}
116
- />
110
+ <DriveGridCard key={node.id} node={node} commands={commands} unoptimized />
117
111
  ))
118
112
  ) : (
119
113
  <DriveGridEmpty title="Geen resultaten gevonden" />
@@ -1,6 +1,5 @@
1
1
  import { Readable } from "node:stream";
2
2
  import type { ObjectBodyInput } from "@tulip-systems/core/storage";
3
- import type { ImageLoaderProps } from "next/image";
4
3
 
5
4
  /**
6
5
  * Escapes dynamic values before interpolating them into Google Drive `q` strings.
@@ -36,11 +35,3 @@ export function toGoogleDriveReadable(body: ObjectBodyInput) {
36
35
  if (typeof body === "string") return Readable.from([body]);
37
36
  return Readable.from([body]);
38
37
  }
39
-
40
- /**
41
- * Use Google-provided thumbnail URLs directly instead of routing them through
42
- * the Next.js optimizer.
43
- */
44
- export function googleDriveImageLoader({ src }: ImageLoaderProps) {
45
- return src;
46
- }
@@ -514,9 +514,7 @@ export class GoogleDrive<TSchema extends TDatabaseSchema>
514
514
 
515
515
  const nextSeen = new Set([...seen, node.id]);
516
516
  const currentChild = {
517
- id: node.id,
518
- type: node.type,
519
- parentId: node.parentId,
517
+ ...node,
520
518
  depth: current.depth,
521
519
  } satisfies GoogleDriveNodeChild;
522
520
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -49,7 +49,7 @@ export function LocalDriveFileUpdateCommand<
49
49
  mutation,
50
50
  }: LocalDriveFileUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
51
51
  const form = useForm<UpdateLocalDriveNodeInput>({
52
- resolver: zodResolver(updateLocalDriveNodeInputSchema),
52
+ resolver: standardSchemaResolver(updateLocalDriveNodeInputSchema),
53
53
  defaultValues,
54
54
  });
55
55
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -56,7 +56,7 @@ export function LocalDriveFoldersCreateCommand<
56
56
  const [{ parentId }] = useQueryStates(driveTreeSearchParams);
57
57
 
58
58
  const form = useForm<CreateLocalDriveFolderInput>({
59
- resolver: zodResolver(createLocalDriveFolderInputSchema),
59
+ resolver: standardSchemaResolver(createLocalDriveFolderInputSchema),
60
60
  defaultValues: { ...defaultValues, parentId },
61
61
  });
62
62
 
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { zodResolver } from "@hookform/resolvers/zod";
3
+ import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
4
4
  import type { DefaultError, MutationOptions } from "@tanstack/react-query";
5
5
  import {
6
6
  CommandFormDialog,
@@ -49,7 +49,7 @@ export function LocalDriveFoldersUpdateCommand<
49
49
  mutation,
50
50
  }: LocalDriveFoldersUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
51
51
  const form = useForm<UpdateLocalDriveNodeInput>({
52
- resolver: zodResolver(updateLocalDriveNodeInputSchema),
52
+ resolver: standardSchemaResolver(updateLocalDriveNodeInputSchema),
53
53
  defaultValues,
54
54
  });
55
55
 
@@ -111,7 +111,7 @@ export function LocalDriveUploadZone({
111
111
  },
112
112
  onSuccess: async (data, variables) => {
113
113
  await optimistic?.replace?.({
114
- id: variables.uploadId,
114
+ id: variables.uploadId ?? "",
115
115
  newValue: {
116
116
  ...data,
117
117
  asset: {
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
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"}