convex-cms 0.0.1 → 0.0.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 (267) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +99 -0
  3. package/admin-dist/nitro.json +15 -0
  4. package/admin-dist/public/assets/CmsEmptyState-CRswfTzk.js +5 -0
  5. package/admin-dist/public/assets/CmsPageHeader-CirpXndm.js +1 -0
  6. package/admin-dist/public/assets/CmsStatusBadge-CbEUpQu-.js +1 -0
  7. package/admin-dist/public/assets/CmsToolbar-BI2nZOXp.js +1 -0
  8. package/admin-dist/public/assets/ContentEntryEditor-CBeCyK_m.js +4 -0
  9. package/admin-dist/public/assets/ErrorState-BIVaWmom.js +1 -0
  10. package/admin-dist/public/assets/TaxonomyFilter-ChaY6Y_x.js +1 -0
  11. package/admin-dist/public/assets/_contentTypeId-DQ8k_Rvw.js +1 -0
  12. package/admin-dist/public/assets/_entryId-CKU_glsK.js +1 -0
  13. package/admin-dist/public/assets/alert-BXjTqrwQ.js +1 -0
  14. package/admin-dist/public/assets/badge-hvUOzpVZ.js +1 -0
  15. package/admin-dist/public/assets/circle-check-big-CF_pR17r.js +1 -0
  16. package/admin-dist/public/assets/command-DU82cJlt.js +1 -0
  17. package/admin-dist/public/assets/content-_LXl3pp7.js +1 -0
  18. package/admin-dist/public/assets/content-types-KjxaXGxY.js +2 -0
  19. package/admin-dist/public/assets/globals-CS6BZ0zp.css +1 -0
  20. package/admin-dist/public/assets/index-DNGIZHL-.js +1 -0
  21. package/admin-dist/public/assets/label-KNtpL71g.js +1 -0
  22. package/admin-dist/public/assets/link-2-Bw2aI4V4.js +1 -0
  23. package/admin-dist/public/assets/list-sYepHjt_.js +1 -0
  24. package/admin-dist/public/assets/main-CKj5yfEi.js +97 -0
  25. package/admin-dist/public/assets/media-Bkrkffm7.js +1 -0
  26. package/admin-dist/public/assets/new._contentTypeId-C3LstjNs.js +1 -0
  27. package/admin-dist/public/assets/plus-DUn8v_Xf.js +1 -0
  28. package/admin-dist/public/assets/rotate-ccw-DJEoHcRI.js +1 -0
  29. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +1 -0
  30. package/admin-dist/public/assets/search-MuAUDJKR.js +1 -0
  31. package/admin-dist/public/assets/select-BD29IXCI.js +1 -0
  32. package/admin-dist/public/assets/settings-DmMyn_6A.js +1 -0
  33. package/admin-dist/public/assets/switch-h3Rrnl5i.js +1 -0
  34. package/admin-dist/public/assets/tabs-imc8h-Dp.js +1 -0
  35. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +1 -0
  36. package/admin-dist/public/assets/textarea-BTy7nwzR.js +1 -0
  37. package/admin-dist/public/assets/trash-SAWKZZHv.js +1 -0
  38. package/admin-dist/public/assets/triangle-alert-E52Vfeuh.js +1 -0
  39. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +1 -0
  40. package/admin-dist/public/assets/usePermissions-Basjs9BT.js +1 -0
  41. package/admin-dist/public/favicon.ico +0 -0
  42. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +217 -0
  43. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +719 -0
  44. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +622 -0
  45. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +292 -0
  46. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +320 -0
  47. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +6 -0
  48. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +11 -0
  49. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +23 -0
  50. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +119 -0
  51. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +270 -0
  52. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +69 -0
  53. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +39 -0
  54. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +137 -0
  55. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +325 -0
  56. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +9 -0
  57. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +210 -0
  58. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +253 -0
  59. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +29 -0
  60. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +206 -0
  61. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +14 -0
  62. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +23 -0
  63. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +812 -0
  64. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +300 -0
  65. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +286 -0
  66. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +16 -0
  67. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +128 -0
  68. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +141 -0
  69. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +224 -0
  70. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +721 -0
  71. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1163 -0
  72. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +28 -0
  73. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +601 -0
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +152 -0
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +189 -0
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +11 -0
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +69 -0
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +1 -0
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +17 -0
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +15 -0
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +6 -0
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +14 -0
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +39 -0
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +33 -0
  85. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +409 -0
  86. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +1711 -0
  87. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +56 -0
  88. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +4829 -0
  89. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +134 -0
  90. package/admin-dist/server/_chunks/_libs/react-dom.mjs +10781 -0
  91. package/admin-dist/server/_chunks/_libs/react.mjs +513 -0
  92. package/admin-dist/server/_libs/aria-hidden.mjs +122 -0
  93. package/admin-dist/server/_libs/class-variance-authority.mjs +44 -0
  94. package/admin-dist/server/_libs/clsx.mjs +16 -0
  95. package/admin-dist/server/_libs/cmdk.mjs +315 -0
  96. package/admin-dist/server/_libs/convex.mjs +4841 -0
  97. package/admin-dist/server/_libs/cookie-es.mjs +58 -0
  98. package/admin-dist/server/_libs/croner.mjs +1 -0
  99. package/admin-dist/server/_libs/crossws.mjs +1 -0
  100. package/admin-dist/server/_libs/date-fns.mjs +1716 -0
  101. package/admin-dist/server/_libs/detect-node-es.mjs +1 -0
  102. package/admin-dist/server/_libs/get-nonce.mjs +9 -0
  103. package/admin-dist/server/_libs/h3-v2.mjs +277 -0
  104. package/admin-dist/server/_libs/h3.mjs +401 -0
  105. package/admin-dist/server/_libs/hookable.mjs +1 -0
  106. package/admin-dist/server/_libs/isbot.mjs +20 -0
  107. package/admin-dist/server/_libs/lucide-react.mjs +850 -0
  108. package/admin-dist/server/_libs/ohash.mjs +1 -0
  109. package/admin-dist/server/_libs/react-day-picker.mjs +2201 -0
  110. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +82 -0
  111. package/admin-dist/server/_libs/react-remove-scroll.mjs +328 -0
  112. package/admin-dist/server/_libs/react-style-singleton.mjs +69 -0
  113. package/admin-dist/server/_libs/rou3.mjs +8 -0
  114. package/admin-dist/server/_libs/seroval-plugins.mjs +58 -0
  115. package/admin-dist/server/_libs/seroval.mjs +1765 -0
  116. package/admin-dist/server/_libs/srvx.mjs +719 -0
  117. package/admin-dist/server/_libs/tailwind-merge.mjs +3010 -0
  118. package/admin-dist/server/_libs/tiny-invariant.mjs +12 -0
  119. package/admin-dist/server/_libs/tiny-warning.mjs +5 -0
  120. package/admin-dist/server/_libs/tslib.mjs +39 -0
  121. package/admin-dist/server/_libs/ufo.mjs +54 -0
  122. package/admin-dist/server/_libs/unctx.mjs +1 -0
  123. package/admin-dist/server/_libs/unstorage.mjs +1 -0
  124. package/admin-dist/server/_libs/use-callback-ref.mjs +66 -0
  125. package/admin-dist/server/_libs/use-sidecar.mjs +106 -0
  126. package/admin-dist/server/_libs/use-sync-external-store.mjs +139 -0
  127. package/admin-dist/server/_libs/zod.mjs +4223 -0
  128. package/admin-dist/server/_ssr/CmsEmptyState-DU7-7-mV.mjs +290 -0
  129. package/admin-dist/server/_ssr/CmsPageHeader-CseW0AHm.mjs +24 -0
  130. package/admin-dist/server/_ssr/CmsStatusBadge-B_pi4KCp.mjs +127 -0
  131. package/admin-dist/server/_ssr/CmsToolbar-X75ex6ek.mjs +49 -0
  132. package/admin-dist/server/_ssr/ContentEntryEditor-CepusRsA.mjs +3720 -0
  133. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +89 -0
  134. package/admin-dist/server/_ssr/TaxonomyFilter-Bwrq0-cz.mjs +188 -0
  135. package/admin-dist/server/_ssr/_contentTypeId-BqYKEcLr.mjs +379 -0
  136. package/admin-dist/server/_ssr/_entryId-CRfnqeDf.mjs +161 -0
  137. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +4 -0
  138. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +92 -0
  139. package/admin-dist/server/_ssr/badge-6BsP37vG.mjs +125 -0
  140. package/admin-dist/server/_ssr/command-fy8epIKf.mjs +128 -0
  141. package/admin-dist/server/_ssr/config.server-D7JHDcDv.mjs +117 -0
  142. package/admin-dist/server/_ssr/content-B5RhL7uW.mjs +532 -0
  143. package/admin-dist/server/_ssr/content-types-BIOqCQYN.mjs +1166 -0
  144. package/admin-dist/server/_ssr/index-DHSHDPt1.mjs +193 -0
  145. package/admin-dist/server/_ssr/index.mjs +1275 -0
  146. package/admin-dist/server/_ssr/label-C8Dko1j7.mjs +22 -0
  147. package/admin-dist/server/_ssr/media-CSx3XttC.mjs +1832 -0
  148. package/admin-dist/server/_ssr/new._contentTypeId-DzanEZQM.mjs +144 -0
  149. package/admin-dist/server/_ssr/router-DDWcF-kt.mjs +1556 -0
  150. package/admin-dist/server/_ssr/scroll-area-bjPYwhXN.mjs +59 -0
  151. package/admin-dist/server/_ssr/select-BUhDDf4T.mjs +142 -0
  152. package/admin-dist/server/_ssr/settings-DAsxnw2q.mjs +348 -0
  153. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  154. package/admin-dist/server/_ssr/switch-BgyRtQ1Z.mjs +31 -0
  155. package/admin-dist/server/_ssr/tabs-DzMdRB1A.mjs +628 -0
  156. package/admin-dist/server/_ssr/taxonomies-C8j8g5Q5.mjs +915 -0
  157. package/admin-dist/server/_ssr/textarea-9jNeYJSc.mjs +18 -0
  158. package/admin-dist/server/_ssr/trash-DYMxwhZB.mjs +291 -0
  159. package/admin-dist/server/_ssr/useBreadcrumbLabel-FNSAr2Ha.mjs +16 -0
  160. package/admin-dist/server/_ssr/usePermissions-BJGGahrJ.mjs +68 -0
  161. package/admin-dist/server/favicon.ico +0 -0
  162. package/admin-dist/server/index.mjs +627 -0
  163. package/dist/cli/index.js +0 -0
  164. package/dist/client/admin-config.d.ts +0 -1
  165. package/dist/client/admin-config.d.ts.map +1 -1
  166. package/dist/client/admin-config.js +0 -1
  167. package/dist/client/admin-config.js.map +1 -1
  168. package/dist/client/adminApi.d.ts.map +1 -1
  169. package/dist/client/agentTools.d.ts +1237 -135
  170. package/dist/client/agentTools.d.ts.map +1 -1
  171. package/dist/client/agentTools.js +33 -9
  172. package/dist/client/agentTools.js.map +1 -1
  173. package/dist/client/index.d.ts +1 -1
  174. package/dist/client/index.d.ts.map +1 -1
  175. package/dist/client/index.js.map +1 -1
  176. package/dist/component/_generated/component.d.ts +9 -0
  177. package/dist/component/_generated/component.d.ts.map +1 -1
  178. package/dist/component/mediaAssets.d.ts +35 -0
  179. package/dist/component/mediaAssets.d.ts.map +1 -1
  180. package/dist/component/mediaAssets.js +81 -0
  181. package/dist/component/mediaAssets.js.map +1 -1
  182. package/dist/test.d.ts.map +1 -1
  183. package/dist/test.js +2 -1
  184. package/dist/test.js.map +1 -1
  185. package/package.json +24 -9
  186. package/dist/component/auditLog.d.ts +0 -410
  187. package/dist/component/auditLog.d.ts.map +0 -1
  188. package/dist/component/auditLog.js +0 -607
  189. package/dist/component/auditLog.js.map +0 -1
  190. package/dist/component/types.d.ts +0 -4
  191. package/dist/component/types.d.ts.map +0 -1
  192. package/dist/component/types.js +0 -2
  193. package/dist/component/types.js.map +0 -1
  194. package/src/cli/commands/admin.ts +0 -104
  195. package/src/cli/index.ts +0 -21
  196. package/src/cli/utils/detectConvexUrl.ts +0 -54
  197. package/src/cli/utils/openBrowser.ts +0 -16
  198. package/src/client/admin-config.ts +0 -138
  199. package/src/client/adminApi.ts +0 -942
  200. package/src/client/agentTools.ts +0 -1311
  201. package/src/client/argTypes.ts +0 -316
  202. package/src/client/field-types.ts +0 -187
  203. package/src/client/index.ts +0 -1301
  204. package/src/client/queryBuilder.ts +0 -1100
  205. package/src/client/schema/codegen.ts +0 -500
  206. package/src/client/schema/defineContentType.ts +0 -501
  207. package/src/client/schema/index.ts +0 -169
  208. package/src/client/schema/schemaDrift.ts +0 -574
  209. package/src/client/schema/typedClient.ts +0 -688
  210. package/src/client/schema/types.ts +0 -666
  211. package/src/client/types.ts +0 -723
  212. package/src/client/workflows.ts +0 -141
  213. package/src/client/wrapper.ts +0 -4304
  214. package/src/component/_generated/api.ts +0 -140
  215. package/src/component/_generated/component.ts +0 -5029
  216. package/src/component/_generated/dataModel.ts +0 -60
  217. package/src/component/_generated/server.ts +0 -156
  218. package/src/component/authorization.ts +0 -647
  219. package/src/component/authorizationHooks.ts +0 -668
  220. package/src/component/bulkOperations.ts +0 -687
  221. package/src/component/contentEntries.ts +0 -1976
  222. package/src/component/contentEntryMutations.ts +0 -1223
  223. package/src/component/contentEntryValidation.ts +0 -707
  224. package/src/component/contentLock.ts +0 -550
  225. package/src/component/contentTypeMigration.ts +0 -1064
  226. package/src/component/contentTypeMutations.ts +0 -969
  227. package/src/component/contentTypes.ts +0 -346
  228. package/src/component/convex.config.ts +0 -44
  229. package/src/component/documentTypes.ts +0 -240
  230. package/src/component/eventEmitter.ts +0 -485
  231. package/src/component/exportImport.ts +0 -1169
  232. package/src/component/index.ts +0 -491
  233. package/src/component/lib/deepReferenceResolver.ts +0 -999
  234. package/src/component/lib/errors.ts +0 -816
  235. package/src/component/lib/index.ts +0 -145
  236. package/src/component/lib/mediaReferenceResolver.ts +0 -495
  237. package/src/component/lib/metadataExtractor.ts +0 -792
  238. package/src/component/lib/mutationAuth.ts +0 -199
  239. package/src/component/lib/queries.ts +0 -79
  240. package/src/component/lib/ragContentChunker.ts +0 -1371
  241. package/src/component/lib/referenceResolver.ts +0 -430
  242. package/src/component/lib/slugGenerator.ts +0 -262
  243. package/src/component/lib/slugUniqueness.ts +0 -333
  244. package/src/component/lib/softDelete.ts +0 -44
  245. package/src/component/localeFallbackChain.ts +0 -673
  246. package/src/component/localeFields.ts +0 -896
  247. package/src/component/mediaAssetMutations.ts +0 -725
  248. package/src/component/mediaAssets.ts +0 -932
  249. package/src/component/mediaFolderMutations.ts +0 -1046
  250. package/src/component/mediaUploadMutations.ts +0 -224
  251. package/src/component/mediaVariantMutations.ts +0 -900
  252. package/src/component/mediaVariants.ts +0 -793
  253. package/src/component/ragContentIndexer.ts +0 -1067
  254. package/src/component/rateLimitHooks.ts +0 -572
  255. package/src/component/roles.ts +0 -1360
  256. package/src/component/scheduledPublish.ts +0 -358
  257. package/src/component/schema.ts +0 -617
  258. package/src/component/taxonomies.ts +0 -949
  259. package/src/component/taxonomyMutations.ts +0 -1210
  260. package/src/component/trash.ts +0 -724
  261. package/src/component/userContext.ts +0 -898
  262. package/src/component/validation.ts +0 -1388
  263. package/src/component/validators.ts +0 -949
  264. package/src/component/versionMutations.ts +0 -392
  265. package/src/component/webhookTrigger.ts +0 -1922
  266. package/src/react/index.ts +0 -898
  267. package/src/test.ts +0 -1580
@@ -0,0 +1,628 @@
1
+ import { j as jsxRuntimeExports, r as reactExports } from "../_chunks/_libs/react.mjs";
2
+ import { C as CmsButton } from "./badge-6BsP37vG.mjs";
3
+ import { c as cn } from "./router-DDWcF-kt.mjs";
4
+ import { R as Root2, L as List, T as Trigger, C as Content } from "../_chunks/_libs/@radix-ui/react-tabs.mjs";
5
+ import { g as CircleAlert, a3 as Upload, X, am as RefreshCw, Z as Check } from "../_libs/lucide-react.mjs";
6
+ import { d as useMutation } from "../_libs/convex.mjs";
7
+ function generateUploadId() {
8
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
9
+ }
10
+ function getImageDimensions(file, timeoutMs = 5e3) {
11
+ if (!file.type.startsWith("image/")) return Promise.resolve(void 0);
12
+ return new Promise((resolve) => {
13
+ const img = new Image();
14
+ let objectUrl = null;
15
+ const timeoutId = setTimeout(() => {
16
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
17
+ resolve(void 0);
18
+ }, timeoutMs);
19
+ img.onload = () => {
20
+ clearTimeout(timeoutId);
21
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
22
+ resolve({ width: img.naturalWidth, height: img.naturalHeight });
23
+ };
24
+ img.onerror = () => {
25
+ clearTimeout(timeoutId);
26
+ if (objectUrl) URL.revokeObjectURL(objectUrl);
27
+ resolve(void 0);
28
+ };
29
+ objectUrl = URL.createObjectURL(file);
30
+ img.src = objectUrl;
31
+ });
32
+ }
33
+ function uploadWithXHR(url, file, signal, onProgress) {
34
+ return new Promise((resolve, reject) => {
35
+ const xhr = new XMLHttpRequest();
36
+ const abortHandler = () => {
37
+ xhr.abort();
38
+ reject(new DOMException("Upload aborted", "AbortError"));
39
+ };
40
+ signal.addEventListener("abort", abortHandler);
41
+ xhr.upload.onprogress = (event) => {
42
+ if (event.lengthComputable) {
43
+ const percent = Math.round(event.loaded / event.total * 80);
44
+ onProgress(10 + percent);
45
+ }
46
+ };
47
+ xhr.onload = () => {
48
+ signal.removeEventListener("abort", abortHandler);
49
+ if (xhr.status >= 200 && xhr.status < 300) {
50
+ try {
51
+ const response = JSON.parse(xhr.responseText);
52
+ resolve(response.storageId);
53
+ } catch {
54
+ reject(new Error("Invalid response from upload server"));
55
+ }
56
+ } else {
57
+ reject(new Error(`Upload failed: ${xhr.statusText || `HTTP ${xhr.status}`}`));
58
+ }
59
+ };
60
+ xhr.onerror = () => {
61
+ signal.removeEventListener("abort", abortHandler);
62
+ reject(new Error("Network error during upload"));
63
+ };
64
+ xhr.ontimeout = () => {
65
+ signal.removeEventListener("abort", abortHandler);
66
+ reject(new Error("Upload timed out"));
67
+ };
68
+ xhr.open("POST", url);
69
+ xhr.setRequestHeader("Content-Type", file.type);
70
+ xhr.send(file);
71
+ });
72
+ }
73
+ function queueReducer(state, action) {
74
+ switch (action.type) {
75
+ case "ADD_FILES": {
76
+ const newFiles = action.files.map((file) => ({
77
+ id: generateUploadId(),
78
+ file,
79
+ status: "pending",
80
+ progress: 0
81
+ }));
82
+ return [...state, ...newFiles];
83
+ }
84
+ case "UPDATE_FILE":
85
+ return state.map(
86
+ (f) => f.id === action.id ? { ...f, ...action.updates } : f
87
+ );
88
+ case "RETRY_FILE":
89
+ return state.map(
90
+ (f) => f.id === action.id ? { ...f, status: "pending", progress: 0, error: void 0 } : f
91
+ );
92
+ case "REMOVE_FILE":
93
+ return state.filter((f) => f.id !== action.id);
94
+ case "CLEAR_COMPLETED":
95
+ return state.filter(
96
+ (f) => f.status === "pending" || f.status === "uploading"
97
+ );
98
+ case "CLEAR_ALL":
99
+ return [];
100
+ case "CANCEL_FILE":
101
+ return state.map(
102
+ (f) => f.id === action.id && (f.status === "pending" || f.status === "uploading") ? { ...f, status: "cancelled", error: "Upload cancelled" } : f
103
+ );
104
+ case "CANCEL_ALL":
105
+ return state.map(
106
+ (f) => f.status === "pending" || f.status === "uploading" ? { ...f, status: "cancelled", error: "Upload cancelled" } : f
107
+ );
108
+ default:
109
+ return state;
110
+ }
111
+ }
112
+ function useMediaUploadQueue(options) {
113
+ const { maxConcurrent = 3, metadata, onComplete, onError } = options;
114
+ const [files, dispatch] = reactExports.useReducer(queueReducer, []);
115
+ const generateUrl = useMutation(options.getUploadUrl);
116
+ const create = useMutation(options.createAsset);
117
+ const activeUploadsRef = reactExports.useRef(0);
118
+ const abortControllersRef = reactExports.useRef(/* @__PURE__ */ new Map());
119
+ const processingRef = reactExports.useRef(false);
120
+ const uploadFile = reactExports.useCallback(
121
+ async (queueFile) => {
122
+ const abortController = new AbortController();
123
+ abortControllersRef.current.set(queueFile.id, abortController);
124
+ dispatch({
125
+ type: "UPDATE_FILE",
126
+ id: queueFile.id,
127
+ updates: { status: "uploading", progress: 0 }
128
+ });
129
+ try {
130
+ const uploadUrl = await generateUrl({});
131
+ dispatch({
132
+ type: "UPDATE_FILE",
133
+ id: queueFile.id,
134
+ updates: { progress: 5 }
135
+ });
136
+ const storageId = await uploadWithXHR(
137
+ uploadUrl,
138
+ queueFile.file,
139
+ abortController.signal,
140
+ (progress) => {
141
+ dispatch({
142
+ type: "UPDATE_FILE",
143
+ id: queueFile.id,
144
+ updates: { progress }
145
+ });
146
+ }
147
+ );
148
+ dispatch({
149
+ type: "UPDATE_FILE",
150
+ id: queueFile.id,
151
+ updates: { progress: 90 }
152
+ });
153
+ const dimensions = await getImageDimensions(queueFile.file);
154
+ const result = await create({
155
+ storageId,
156
+ name: queueFile.file.name,
157
+ mimeType: queueFile.file.type,
158
+ size: queueFile.file.size,
159
+ ...dimensions,
160
+ ...metadata
161
+ });
162
+ dispatch({
163
+ type: "UPDATE_FILE",
164
+ id: queueFile.id,
165
+ updates: { status: "complete", progress: 100, result }
166
+ });
167
+ } catch (e) {
168
+ const err = e instanceof Error ? e : new Error(String(e));
169
+ if (err.name === "AbortError") {
170
+ dispatch({
171
+ type: "UPDATE_FILE",
172
+ id: queueFile.id,
173
+ updates: { status: "cancelled", error: "Upload cancelled" }
174
+ });
175
+ } else {
176
+ const updatedFile = {
177
+ ...queueFile,
178
+ status: "error",
179
+ error: err.message
180
+ };
181
+ dispatch({
182
+ type: "UPDATE_FILE",
183
+ id: queueFile.id,
184
+ updates: { status: "error", error: err.message }
185
+ });
186
+ onError?.(updatedFile);
187
+ }
188
+ } finally {
189
+ abortControllersRef.current.delete(queueFile.id);
190
+ activeUploadsRef.current--;
191
+ }
192
+ },
193
+ [generateUrl, create, metadata, onError]
194
+ );
195
+ const processQueue = reactExports.useCallback(() => {
196
+ if (processingRef.current) return;
197
+ processingRef.current = true;
198
+ const pending = files.filter((f) => f.status === "pending");
199
+ while (activeUploadsRef.current < maxConcurrent && pending.length > 0) {
200
+ const next = pending.shift();
201
+ activeUploadsRef.current++;
202
+ uploadFile(next);
203
+ }
204
+ processingRef.current = false;
205
+ if (activeUploadsRef.current === 0 && files.length > 0 && files.every((f) => f.status !== "pending" && f.status !== "uploading")) {
206
+ onComplete?.(files);
207
+ }
208
+ }, [files, maxConcurrent, uploadFile, onComplete]);
209
+ reactExports.useEffect(() => {
210
+ if (files.some((f) => f.status === "pending") && activeUploadsRef.current < maxConcurrent) {
211
+ processQueue();
212
+ }
213
+ }, [files, maxConcurrent, processQueue]);
214
+ const addFiles = reactExports.useCallback((newFiles) => {
215
+ dispatch({ type: "ADD_FILES", files: newFiles });
216
+ }, []);
217
+ const cancelFile = reactExports.useCallback((id) => {
218
+ const controller = abortControllersRef.current.get(id);
219
+ if (controller) {
220
+ controller.abort();
221
+ }
222
+ dispatch({ type: "CANCEL_FILE", id });
223
+ }, []);
224
+ const cancelAll = reactExports.useCallback(() => {
225
+ abortControllersRef.current.forEach((controller) => controller.abort());
226
+ dispatch({ type: "CANCEL_ALL" });
227
+ }, []);
228
+ const retryFile = reactExports.useCallback((id) => {
229
+ dispatch({ type: "RETRY_FILE", id });
230
+ }, []);
231
+ const clearCompleted = reactExports.useCallback(() => {
232
+ dispatch({ type: "CLEAR_COMPLETED" });
233
+ }, []);
234
+ const clearAll = reactExports.useCallback(() => {
235
+ abortControllersRef.current.forEach((controller) => controller.abort());
236
+ dispatch({ type: "CLEAR_ALL" });
237
+ }, []);
238
+ const isUploading = files.some((f) => f.status === "uploading");
239
+ const overallProgress = files.length > 0 ? Math.round(files.reduce((sum, f) => sum + f.progress, 0) / files.length) : 0;
240
+ return {
241
+ files,
242
+ addFiles,
243
+ cancelFile,
244
+ cancelAll,
245
+ retryFile,
246
+ clearCompleted,
247
+ clearAll,
248
+ isUploading,
249
+ overallProgress
250
+ };
251
+ }
252
+ function formatFileSize(bytes) {
253
+ if (bytes === 0) return "0 B";
254
+ const k = 1024;
255
+ const sizes = ["B", "KB", "MB", "GB"];
256
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
257
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
258
+ }
259
+ function isMimeTypeAllowed(mimeType, allowedTypes) {
260
+ if (allowedTypes.length === 0) return true;
261
+ return allowedTypes.some((allowed) => {
262
+ if (allowed.endsWith("/*")) {
263
+ const category = allowed.slice(0, -2);
264
+ return mimeType.startsWith(category + "/");
265
+ }
266
+ return mimeType === allowed;
267
+ });
268
+ }
269
+ function UploadDropzone({
270
+ onUploadComplete,
271
+ currentFolderId,
272
+ generateUploadUrl,
273
+ createAsset,
274
+ maxFileSize,
275
+ allowedMimeTypes = [],
276
+ maxConcurrentUploads = 3,
277
+ onError
278
+ }) {
279
+ const [isDragActive, setIsDragActive] = reactExports.useState(false);
280
+ const [validationErrors, setValidationErrors] = reactExports.useState(/* @__PURE__ */ new Map());
281
+ const fileInputRef = reactExports.useRef(null);
282
+ const queue = useMediaUploadQueue({
283
+ getUploadUrl: generateUploadUrl,
284
+ createAsset,
285
+ maxConcurrent: maxConcurrentUploads,
286
+ metadata: currentFolderId ? { parentId: currentFolderId } : void 0,
287
+ onComplete: (results) => {
288
+ const uploadedFiles = results.map((f) => ({
289
+ filename: f.file.name,
290
+ storageId: f.result ? String(f.result._id || "") : "",
291
+ success: f.status === "complete",
292
+ error: f.error
293
+ }));
294
+ onUploadComplete(uploadedFiles);
295
+ },
296
+ onError: (file) => {
297
+ onError?.(file.error || "Upload failed", file.file.name);
298
+ }
299
+ });
300
+ const validateFile = reactExports.useCallback(
301
+ (file) => {
302
+ if (maxFileSize && file.size > maxFileSize) {
303
+ return `File exceeds maximum size of ${formatFileSize(maxFileSize)}`;
304
+ }
305
+ if (allowedMimeTypes.length > 0 && !isMimeTypeAllowed(file.type, allowedMimeTypes)) {
306
+ return `File type ${file.type || "unknown"} is not allowed`;
307
+ }
308
+ return null;
309
+ },
310
+ [maxFileSize, allowedMimeTypes]
311
+ );
312
+ const addFiles = reactExports.useCallback(
313
+ (files) => {
314
+ const fileArray = Array.from(files);
315
+ const errors = /* @__PURE__ */ new Map();
316
+ const validFiles = [];
317
+ for (const file of fileArray) {
318
+ const error = validateFile(file);
319
+ if (error) {
320
+ errors.set(file.name, error);
321
+ } else {
322
+ validFiles.push(file);
323
+ }
324
+ }
325
+ setValidationErrors(errors);
326
+ if (validFiles.length > 0) {
327
+ queue.addFiles(validFiles);
328
+ }
329
+ },
330
+ [validateFile, queue]
331
+ );
332
+ const handleDragEnter = reactExports.useCallback((e) => {
333
+ e.preventDefault();
334
+ e.stopPropagation();
335
+ setIsDragActive(true);
336
+ }, []);
337
+ const handleDragLeave = reactExports.useCallback((e) => {
338
+ e.preventDefault();
339
+ e.stopPropagation();
340
+ setIsDragActive(false);
341
+ }, []);
342
+ const handleDragOver = reactExports.useCallback((e) => {
343
+ e.preventDefault();
344
+ e.stopPropagation();
345
+ }, []);
346
+ const handleDrop = reactExports.useCallback(
347
+ (e) => {
348
+ e.preventDefault();
349
+ e.stopPropagation();
350
+ setIsDragActive(false);
351
+ if (e.dataTransfer.files?.length) {
352
+ addFiles(e.dataTransfer.files);
353
+ }
354
+ },
355
+ [addFiles]
356
+ );
357
+ const handleFileChange = reactExports.useCallback(
358
+ (e) => {
359
+ if (e.target.files?.length) {
360
+ addFiles(e.target.files);
361
+ e.target.value = "";
362
+ }
363
+ },
364
+ [addFiles]
365
+ );
366
+ const getStatusIcon = (status) => {
367
+ switch (status) {
368
+ case "complete":
369
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-4 text-emerald-500" });
370
+ case "error":
371
+ case "cancelled":
372
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-4 text-red-500" });
373
+ case "uploading":
374
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-4 animate-spin rounded-full border-2 border-muted border-t-primary" });
375
+ default:
376
+ return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "size-4 rounded-full border-2 border-muted" });
377
+ }
378
+ };
379
+ const completedCount = queue.files.filter((f) => f.status === "complete").length;
380
+ const errorCount = queue.files.filter(
381
+ (f) => f.status === "error" || f.status === "cancelled"
382
+ ).length;
383
+ const hasCompletedOrFailed = completedCount > 0 || errorCount > 0;
384
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [
385
+ validationErrors.size > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-md border border-destructive/50 bg-destructive/10 p-3", children: [
386
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2", children: [
387
+ /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "mt-0.5 size-4 shrink-0 text-destructive" }),
388
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-1 space-y-1", children: Array.from(validationErrors.entries()).map(([filename, error]) => /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-destructive", children: [
389
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium", children: [
390
+ filename,
391
+ ":"
392
+ ] }),
393
+ " ",
394
+ error
395
+ ] }, filename)) })
396
+ ] }),
397
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
398
+ CmsButton,
399
+ {
400
+ variant: "ghost",
401
+ size: "sm",
402
+ className: "mt-2",
403
+ onClick: () => setValidationErrors(/* @__PURE__ */ new Map()),
404
+ children: "Dismiss"
405
+ }
406
+ )
407
+ ] }),
408
+ !queue.isUploading && queue.files.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(
409
+ "div",
410
+ {
411
+ className: cn(
412
+ "flex cursor-pointer flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed p-8 text-center transition-colors",
413
+ isDragActive ? "border-primary bg-primary/5" : "border-muted-foreground/25 hover:border-primary/50 hover:bg-muted/50"
414
+ ),
415
+ onClick: () => fileInputRef.current?.click(),
416
+ onDragEnter: handleDragEnter,
417
+ onDragLeave: handleDragLeave,
418
+ onDragOver: handleDragOver,
419
+ onDrop: handleDrop,
420
+ children: [
421
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Upload, { className: "size-6 text-muted-foreground" }) }),
422
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
423
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-foreground", children: isDragActive ? "Drop files here" : "Drag and drop files here" }),
424
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "or click to browse" })
425
+ ] }),
426
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground", children: [
427
+ "Supports images, videos, documents, and more",
428
+ maxFileSize && ` (max ${formatFileSize(maxFileSize)} per file)`
429
+ ] })
430
+ ]
431
+ }
432
+ ),
433
+ queue.files.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [
434
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [
435
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
436
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium", children: [
437
+ queue.files.length,
438
+ " file",
439
+ queue.files.length !== 1 ? "s" : ""
440
+ ] }),
441
+ queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-muted-foreground", children: [
442
+ queue.overallProgress,
443
+ "% complete"
444
+ ] }),
445
+ !queue.isUploading && hasCompletedOrFailed && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
446
+ completedCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-emerald-600", children: [
447
+ completedCount,
448
+ " completed"
449
+ ] }),
450
+ errorCount > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-red-500", children: [
451
+ errorCount,
452
+ " failed"
453
+ ] })
454
+ ] })
455
+ ] }),
456
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
457
+ !queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(
458
+ CmsButton,
459
+ {
460
+ variant: "outline",
461
+ size: "sm",
462
+ onClick: () => fileInputRef.current?.click(),
463
+ children: "Add More"
464
+ }
465
+ ),
466
+ queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(CmsButton, { variant: "outline", size: "sm", onClick: queue.cancelAll, children: "Cancel All" }),
467
+ hasCompletedOrFailed && !queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(CmsButton, { variant: "ghost", size: "sm", onClick: queue.clearCompleted, children: "Clear Done" })
468
+ ] })
469
+ ] }),
470
+ queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1.5 overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
471
+ "div",
472
+ {
473
+ className: "h-full bg-primary transition-all duration-300",
474
+ style: { width: `${queue.overallProgress}%` }
475
+ }
476
+ ) }),
477
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-2", children: queue.files.map((uploadFile) => /* @__PURE__ */ jsxRuntimeExports.jsxs(
478
+ "div",
479
+ {
480
+ className: cn(
481
+ "flex items-center gap-3 rounded-lg border bg-card p-3",
482
+ uploadFile.status === "error" && "border-red-200 bg-red-50 dark:border-red-900 dark:bg-red-950/20",
483
+ uploadFile.status === "complete" && "border-emerald-200 bg-emerald-50 dark:border-emerald-900 dark:bg-emerald-950/20"
484
+ ),
485
+ children: [
486
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "shrink-0", children: getStatusIcon(uploadFile.status) }),
487
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-w-0 flex-1", children: [
488
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
489
+ "p",
490
+ {
491
+ className: "truncate text-sm font-medium",
492
+ title: uploadFile.file.name,
493
+ children: uploadFile.file.name
494
+ }
495
+ ),
496
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
497
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-muted-foreground", children: formatFileSize(uploadFile.file.size) }),
498
+ uploadFile.error && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs text-red-500", children: uploadFile.error })
499
+ ] })
500
+ ] }),
501
+ uploadFile.status === "uploading" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex w-20 items-center gap-2", children: [
502
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1.5 flex-1 overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntimeExports.jsx(
503
+ "div",
504
+ {
505
+ className: "h-full bg-primary transition-all",
506
+ style: { width: `${uploadFile.progress}%` }
507
+ }
508
+ ) }),
509
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xs text-muted-foreground", children: [
510
+ uploadFile.progress,
511
+ "%"
512
+ ] })
513
+ ] }),
514
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "shrink-0", children: [
515
+ uploadFile.status === "pending" && !queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(
516
+ CmsButton,
517
+ {
518
+ variant: "ghost",
519
+ size: "icon-sm",
520
+ onClick: () => queue.cancelFile(uploadFile.id),
521
+ title: "Remove",
522
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-4" })
523
+ }
524
+ ),
525
+ (uploadFile.status === "uploading" || uploadFile.status === "pending") && queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(
526
+ CmsButton,
527
+ {
528
+ variant: "ghost",
529
+ size: "icon-sm",
530
+ onClick: () => queue.cancelFile(uploadFile.id),
531
+ title: "Cancel",
532
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "size-4" })
533
+ }
534
+ ),
535
+ (uploadFile.status === "error" || uploadFile.status === "cancelled") && !queue.isUploading && /* @__PURE__ */ jsxRuntimeExports.jsx(
536
+ CmsButton,
537
+ {
538
+ variant: "ghost",
539
+ size: "icon-sm",
540
+ onClick: () => queue.retryFile(uploadFile.id),
541
+ title: "Retry",
542
+ children: /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "size-4" })
543
+ }
544
+ )
545
+ ] })
546
+ ]
547
+ },
548
+ uploadFile.id
549
+ )) })
550
+ ] }),
551
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
552
+ "input",
553
+ {
554
+ ref: fileInputRef,
555
+ type: "file",
556
+ multiple: true,
557
+ onChange: handleFileChange,
558
+ className: "hidden",
559
+ accept: allowedMimeTypes.length > 0 ? allowedMimeTypes.join(",") : void 0
560
+ }
561
+ )
562
+ ] });
563
+ }
564
+ function Tabs({
565
+ className,
566
+ ...props
567
+ }) {
568
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
569
+ Root2,
570
+ {
571
+ "data-slot": "tabs",
572
+ className: cn("flex flex-col gap-2", className),
573
+ ...props
574
+ }
575
+ );
576
+ }
577
+ function TabsList({
578
+ className,
579
+ ...props
580
+ }) {
581
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
582
+ List,
583
+ {
584
+ "data-slot": "tabs-list",
585
+ className: cn(
586
+ "bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]",
587
+ className
588
+ ),
589
+ ...props
590
+ }
591
+ );
592
+ }
593
+ function TabsTrigger({
594
+ className,
595
+ ...props
596
+ }) {
597
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
598
+ Trigger,
599
+ {
600
+ "data-slot": "tabs-trigger",
601
+ className: cn(
602
+ "data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
603
+ className
604
+ ),
605
+ ...props
606
+ }
607
+ );
608
+ }
609
+ function TabsContent({
610
+ className,
611
+ ...props
612
+ }) {
613
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
614
+ Content,
615
+ {
616
+ "data-slot": "tabs-content",
617
+ className: cn("flex-1 outline-none", className),
618
+ ...props
619
+ }
620
+ );
621
+ }
622
+ export {
623
+ Tabs as T,
624
+ UploadDropzone as U,
625
+ TabsList as a,
626
+ TabsTrigger as b,
627
+ TabsContent as c
628
+ };