convex-cms 0.0.2 → 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 (265) hide show
  1. package/admin-dist/nitro.json +15 -0
  2. package/admin-dist/public/assets/CmsEmptyState-CRswfTzk.js +5 -0
  3. package/admin-dist/public/assets/CmsPageHeader-CirpXndm.js +1 -0
  4. package/admin-dist/public/assets/CmsStatusBadge-CbEUpQu-.js +1 -0
  5. package/admin-dist/public/assets/CmsToolbar-BI2nZOXp.js +1 -0
  6. package/admin-dist/public/assets/ContentEntryEditor-CBeCyK_m.js +4 -0
  7. package/admin-dist/public/assets/ErrorState-BIVaWmom.js +1 -0
  8. package/admin-dist/public/assets/TaxonomyFilter-ChaY6Y_x.js +1 -0
  9. package/admin-dist/public/assets/_contentTypeId-DQ8k_Rvw.js +1 -0
  10. package/admin-dist/public/assets/_entryId-CKU_glsK.js +1 -0
  11. package/admin-dist/public/assets/alert-BXjTqrwQ.js +1 -0
  12. package/admin-dist/public/assets/badge-hvUOzpVZ.js +1 -0
  13. package/admin-dist/public/assets/circle-check-big-CF_pR17r.js +1 -0
  14. package/admin-dist/public/assets/command-DU82cJlt.js +1 -0
  15. package/admin-dist/public/assets/content-_LXl3pp7.js +1 -0
  16. package/admin-dist/public/assets/content-types-KjxaXGxY.js +2 -0
  17. package/admin-dist/public/assets/globals-CS6BZ0zp.css +1 -0
  18. package/admin-dist/public/assets/index-DNGIZHL-.js +1 -0
  19. package/admin-dist/public/assets/label-KNtpL71g.js +1 -0
  20. package/admin-dist/public/assets/link-2-Bw2aI4V4.js +1 -0
  21. package/admin-dist/public/assets/list-sYepHjt_.js +1 -0
  22. package/admin-dist/public/assets/main-CKj5yfEi.js +97 -0
  23. package/admin-dist/public/assets/media-Bkrkffm7.js +1 -0
  24. package/admin-dist/public/assets/new._contentTypeId-C3LstjNs.js +1 -0
  25. package/admin-dist/public/assets/plus-DUn8v_Xf.js +1 -0
  26. package/admin-dist/public/assets/rotate-ccw-DJEoHcRI.js +1 -0
  27. package/admin-dist/public/assets/scroll-area-DfIlT0in.js +1 -0
  28. package/admin-dist/public/assets/search-MuAUDJKR.js +1 -0
  29. package/admin-dist/public/assets/select-BD29IXCI.js +1 -0
  30. package/admin-dist/public/assets/settings-DmMyn_6A.js +1 -0
  31. package/admin-dist/public/assets/switch-h3Rrnl5i.js +1 -0
  32. package/admin-dist/public/assets/tabs-imc8h-Dp.js +1 -0
  33. package/admin-dist/public/assets/taxonomies-dAsrT65H.js +1 -0
  34. package/admin-dist/public/assets/textarea-BTy7nwzR.js +1 -0
  35. package/admin-dist/public/assets/trash-SAWKZZHv.js +1 -0
  36. package/admin-dist/public/assets/triangle-alert-E52Vfeuh.js +1 -0
  37. package/admin-dist/public/assets/useBreadcrumbLabel-BECBMCzM.js +1 -0
  38. package/admin-dist/public/assets/usePermissions-Basjs9BT.js +1 -0
  39. package/admin-dist/public/favicon.ico +0 -0
  40. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +217 -0
  41. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +719 -0
  42. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +622 -0
  43. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +292 -0
  44. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +320 -0
  45. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +6 -0
  46. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +11 -0
  47. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +23 -0
  48. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +119 -0
  49. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +270 -0
  50. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +69 -0
  51. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +39 -0
  52. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +137 -0
  53. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +325 -0
  54. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +9 -0
  55. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +210 -0
  56. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +253 -0
  57. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +29 -0
  58. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +206 -0
  59. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +14 -0
  60. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +23 -0
  61. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +812 -0
  62. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +300 -0
  63. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +286 -0
  64. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +16 -0
  65. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +128 -0
  66. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +141 -0
  67. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +224 -0
  68. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +721 -0
  69. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1163 -0
  70. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +28 -0
  71. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +601 -0
  72. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +152 -0
  73. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +189 -0
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +11 -0
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +69 -0
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +1 -0
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +17 -0
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +15 -0
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +6 -0
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +14 -0
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +39 -0
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +33 -0
  83. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +409 -0
  84. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +1711 -0
  85. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +56 -0
  86. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +4829 -0
  87. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +134 -0
  88. package/admin-dist/server/_chunks/_libs/react-dom.mjs +10781 -0
  89. package/admin-dist/server/_chunks/_libs/react.mjs +513 -0
  90. package/admin-dist/server/_libs/aria-hidden.mjs +122 -0
  91. package/admin-dist/server/_libs/class-variance-authority.mjs +44 -0
  92. package/admin-dist/server/_libs/clsx.mjs +16 -0
  93. package/admin-dist/server/_libs/cmdk.mjs +315 -0
  94. package/admin-dist/server/_libs/convex.mjs +4841 -0
  95. package/admin-dist/server/_libs/cookie-es.mjs +58 -0
  96. package/admin-dist/server/_libs/croner.mjs +1 -0
  97. package/admin-dist/server/_libs/crossws.mjs +1 -0
  98. package/admin-dist/server/_libs/date-fns.mjs +1716 -0
  99. package/admin-dist/server/_libs/detect-node-es.mjs +1 -0
  100. package/admin-dist/server/_libs/get-nonce.mjs +9 -0
  101. package/admin-dist/server/_libs/h3-v2.mjs +277 -0
  102. package/admin-dist/server/_libs/h3.mjs +401 -0
  103. package/admin-dist/server/_libs/hookable.mjs +1 -0
  104. package/admin-dist/server/_libs/isbot.mjs +20 -0
  105. package/admin-dist/server/_libs/lucide-react.mjs +850 -0
  106. package/admin-dist/server/_libs/ohash.mjs +1 -0
  107. package/admin-dist/server/_libs/react-day-picker.mjs +2201 -0
  108. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +82 -0
  109. package/admin-dist/server/_libs/react-remove-scroll.mjs +328 -0
  110. package/admin-dist/server/_libs/react-style-singleton.mjs +69 -0
  111. package/admin-dist/server/_libs/rou3.mjs +8 -0
  112. package/admin-dist/server/_libs/seroval-plugins.mjs +58 -0
  113. package/admin-dist/server/_libs/seroval.mjs +1765 -0
  114. package/admin-dist/server/_libs/srvx.mjs +719 -0
  115. package/admin-dist/server/_libs/tailwind-merge.mjs +3010 -0
  116. package/admin-dist/server/_libs/tiny-invariant.mjs +12 -0
  117. package/admin-dist/server/_libs/tiny-warning.mjs +5 -0
  118. package/admin-dist/server/_libs/tslib.mjs +39 -0
  119. package/admin-dist/server/_libs/ufo.mjs +54 -0
  120. package/admin-dist/server/_libs/unctx.mjs +1 -0
  121. package/admin-dist/server/_libs/unstorage.mjs +1 -0
  122. package/admin-dist/server/_libs/use-callback-ref.mjs +66 -0
  123. package/admin-dist/server/_libs/use-sidecar.mjs +106 -0
  124. package/admin-dist/server/_libs/use-sync-external-store.mjs +139 -0
  125. package/admin-dist/server/_libs/zod.mjs +4223 -0
  126. package/admin-dist/server/_ssr/CmsEmptyState-DU7-7-mV.mjs +290 -0
  127. package/admin-dist/server/_ssr/CmsPageHeader-CseW0AHm.mjs +24 -0
  128. package/admin-dist/server/_ssr/CmsStatusBadge-B_pi4KCp.mjs +127 -0
  129. package/admin-dist/server/_ssr/CmsToolbar-X75ex6ek.mjs +49 -0
  130. package/admin-dist/server/_ssr/ContentEntryEditor-CepusRsA.mjs +3720 -0
  131. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +89 -0
  132. package/admin-dist/server/_ssr/TaxonomyFilter-Bwrq0-cz.mjs +188 -0
  133. package/admin-dist/server/_ssr/_contentTypeId-BqYKEcLr.mjs +379 -0
  134. package/admin-dist/server/_ssr/_entryId-CRfnqeDf.mjs +161 -0
  135. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BwDlABVk.mjs +4 -0
  136. package/admin-dist/server/_ssr/alert-CVt45UUP.mjs +92 -0
  137. package/admin-dist/server/_ssr/badge-6BsP37vG.mjs +125 -0
  138. package/admin-dist/server/_ssr/command-fy8epIKf.mjs +128 -0
  139. package/admin-dist/server/_ssr/config.server-D7JHDcDv.mjs +117 -0
  140. package/admin-dist/server/_ssr/content-B5RhL7uW.mjs +532 -0
  141. package/admin-dist/server/_ssr/content-types-BIOqCQYN.mjs +1166 -0
  142. package/admin-dist/server/_ssr/index-DHSHDPt1.mjs +193 -0
  143. package/admin-dist/server/_ssr/index.mjs +1275 -0
  144. package/admin-dist/server/_ssr/label-C8Dko1j7.mjs +22 -0
  145. package/admin-dist/server/_ssr/media-CSx3XttC.mjs +1832 -0
  146. package/admin-dist/server/_ssr/new._contentTypeId-DzanEZQM.mjs +144 -0
  147. package/admin-dist/server/_ssr/router-DDWcF-kt.mjs +1556 -0
  148. package/admin-dist/server/_ssr/scroll-area-bjPYwhXN.mjs +59 -0
  149. package/admin-dist/server/_ssr/select-BUhDDf4T.mjs +142 -0
  150. package/admin-dist/server/_ssr/settings-DAsxnw2q.mjs +348 -0
  151. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +4 -0
  152. package/admin-dist/server/_ssr/switch-BgyRtQ1Z.mjs +31 -0
  153. package/admin-dist/server/_ssr/tabs-DzMdRB1A.mjs +628 -0
  154. package/admin-dist/server/_ssr/taxonomies-C8j8g5Q5.mjs +915 -0
  155. package/admin-dist/server/_ssr/textarea-9jNeYJSc.mjs +18 -0
  156. package/admin-dist/server/_ssr/trash-DYMxwhZB.mjs +291 -0
  157. package/admin-dist/server/_ssr/useBreadcrumbLabel-FNSAr2Ha.mjs +16 -0
  158. package/admin-dist/server/_ssr/usePermissions-BJGGahrJ.mjs +68 -0
  159. package/admin-dist/server/favicon.ico +0 -0
  160. package/admin-dist/server/index.mjs +627 -0
  161. package/dist/cli/index.js +0 -0
  162. package/dist/client/admin-config.d.ts +0 -1
  163. package/dist/client/admin-config.d.ts.map +1 -1
  164. package/dist/client/admin-config.js +0 -1
  165. package/dist/client/admin-config.js.map +1 -1
  166. package/dist/client/adminApi.d.ts.map +1 -1
  167. package/dist/client/agentTools.d.ts +1237 -135
  168. package/dist/client/agentTools.d.ts.map +1 -1
  169. package/dist/client/agentTools.js +33 -9
  170. package/dist/client/agentTools.js.map +1 -1
  171. package/dist/client/index.d.ts +1 -1
  172. package/dist/client/index.d.ts.map +1 -1
  173. package/dist/client/index.js.map +1 -1
  174. package/dist/component/_generated/component.d.ts +9 -0
  175. package/dist/component/_generated/component.d.ts.map +1 -1
  176. package/dist/component/mediaAssets.d.ts +35 -0
  177. package/dist/component/mediaAssets.d.ts.map +1 -1
  178. package/dist/component/mediaAssets.js +81 -0
  179. package/dist/component/mediaAssets.js.map +1 -1
  180. package/dist/test.d.ts.map +1 -1
  181. package/dist/test.js +2 -1
  182. package/dist/test.js.map +1 -1
  183. package/package.json +9 -5
  184. package/dist/component/auditLog.d.ts +0 -410
  185. package/dist/component/auditLog.d.ts.map +0 -1
  186. package/dist/component/auditLog.js +0 -607
  187. package/dist/component/auditLog.js.map +0 -1
  188. package/dist/component/types.d.ts +0 -4
  189. package/dist/component/types.d.ts.map +0 -1
  190. package/dist/component/types.js +0 -2
  191. package/dist/component/types.js.map +0 -1
  192. package/src/cli/commands/admin.ts +0 -104
  193. package/src/cli/index.ts +0 -21
  194. package/src/cli/utils/detectConvexUrl.ts +0 -54
  195. package/src/cli/utils/openBrowser.ts +0 -16
  196. package/src/client/admin-config.ts +0 -138
  197. package/src/client/adminApi.ts +0 -942
  198. package/src/client/agentTools.ts +0 -1311
  199. package/src/client/argTypes.ts +0 -316
  200. package/src/client/field-types.ts +0 -187
  201. package/src/client/index.ts +0 -1301
  202. package/src/client/queryBuilder.ts +0 -1100
  203. package/src/client/schema/codegen.ts +0 -500
  204. package/src/client/schema/defineContentType.ts +0 -501
  205. package/src/client/schema/index.ts +0 -169
  206. package/src/client/schema/schemaDrift.ts +0 -574
  207. package/src/client/schema/typedClient.ts +0 -688
  208. package/src/client/schema/types.ts +0 -666
  209. package/src/client/types.ts +0 -723
  210. package/src/client/workflows.ts +0 -141
  211. package/src/client/wrapper.ts +0 -4304
  212. package/src/component/_generated/api.ts +0 -140
  213. package/src/component/_generated/component.ts +0 -5029
  214. package/src/component/_generated/dataModel.ts +0 -60
  215. package/src/component/_generated/server.ts +0 -156
  216. package/src/component/authorization.ts +0 -647
  217. package/src/component/authorizationHooks.ts +0 -668
  218. package/src/component/bulkOperations.ts +0 -687
  219. package/src/component/contentEntries.ts +0 -1976
  220. package/src/component/contentEntryMutations.ts +0 -1223
  221. package/src/component/contentEntryValidation.ts +0 -707
  222. package/src/component/contentLock.ts +0 -550
  223. package/src/component/contentTypeMigration.ts +0 -1064
  224. package/src/component/contentTypeMutations.ts +0 -969
  225. package/src/component/contentTypes.ts +0 -346
  226. package/src/component/convex.config.ts +0 -44
  227. package/src/component/documentTypes.ts +0 -240
  228. package/src/component/eventEmitter.ts +0 -485
  229. package/src/component/exportImport.ts +0 -1169
  230. package/src/component/index.ts +0 -491
  231. package/src/component/lib/deepReferenceResolver.ts +0 -999
  232. package/src/component/lib/errors.ts +0 -816
  233. package/src/component/lib/index.ts +0 -145
  234. package/src/component/lib/mediaReferenceResolver.ts +0 -495
  235. package/src/component/lib/metadataExtractor.ts +0 -792
  236. package/src/component/lib/mutationAuth.ts +0 -199
  237. package/src/component/lib/queries.ts +0 -79
  238. package/src/component/lib/ragContentChunker.ts +0 -1371
  239. package/src/component/lib/referenceResolver.ts +0 -430
  240. package/src/component/lib/slugGenerator.ts +0 -262
  241. package/src/component/lib/slugUniqueness.ts +0 -333
  242. package/src/component/lib/softDelete.ts +0 -44
  243. package/src/component/localeFallbackChain.ts +0 -673
  244. package/src/component/localeFields.ts +0 -896
  245. package/src/component/mediaAssetMutations.ts +0 -725
  246. package/src/component/mediaAssets.ts +0 -932
  247. package/src/component/mediaFolderMutations.ts +0 -1046
  248. package/src/component/mediaUploadMutations.ts +0 -224
  249. package/src/component/mediaVariantMutations.ts +0 -900
  250. package/src/component/mediaVariants.ts +0 -793
  251. package/src/component/ragContentIndexer.ts +0 -1067
  252. package/src/component/rateLimitHooks.ts +0 -572
  253. package/src/component/roles.ts +0 -1360
  254. package/src/component/scheduledPublish.ts +0 -358
  255. package/src/component/schema.ts +0 -617
  256. package/src/component/taxonomies.ts +0 -949
  257. package/src/component/taxonomyMutations.ts +0 -1210
  258. package/src/component/trash.ts +0 -724
  259. package/src/component/userContext.ts +0 -898
  260. package/src/component/validation.ts +0 -1388
  261. package/src/component/validators.ts +0 -949
  262. package/src/component/versionMutations.ts +0 -392
  263. package/src/component/webhookTrigger.ts +0 -1922
  264. package/src/react/index.ts +0 -898
  265. 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
+ };