@strapi/upload 5.51.1 → 5.52.0

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 (369) hide show
  1. package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
  2. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  3. package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
  4. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  5. package/dist/admin/components/TableList/TableList.js +1 -1
  6. package/dist/admin/components/TableList/TableList.js.map +1 -1
  7. package/dist/admin/components/TableList/TableList.mjs +1 -1
  8. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  9. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
  10. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  11. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
  12. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  13. package/dist/admin/future/App.js +3 -3
  14. package/dist/admin/future/App.js.map +1 -1
  15. package/dist/admin/future/App.mjs +4 -4
  16. package/dist/admin/future/App.mjs.map +1 -1
  17. package/dist/admin/future/components/BetaNotice.js +72 -0
  18. package/dist/admin/future/components/BetaNotice.js.map +1 -0
  19. package/dist/admin/future/components/BetaNotice.mjs +70 -0
  20. package/dist/admin/future/components/BetaNotice.mjs.map +1 -0
  21. package/dist/admin/future/components/Drawer.js +18 -3
  22. package/dist/admin/future/components/Drawer.js.map +1 -1
  23. package/dist/admin/future/components/Drawer.mjs +18 -3
  24. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  25. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  26. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  27. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  28. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  29. package/dist/admin/future/hooks/useAIMetadataEnabled.js +39 -0
  30. package/dist/admin/future/hooks/useAIMetadataEnabled.js.map +1 -0
  31. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs +37 -0
  32. package/dist/admin/future/hooks/useAIMetadataEnabled.mjs.map +1 -0
  33. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  34. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  35. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  36. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  37. package/dist/admin/future/pages/Assets/AssetsPage.js +453 -170
  38. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/AssetsPage.mjs +454 -171
  40. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js +46 -0
  42. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs +44 -0
  44. package/dist/admin/future/pages/Assets/components/ActionsMenuContent.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +325 -0
  46. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -0
  47. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +323 -0
  48. package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -0
  49. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +110 -46
  50. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +110 -46
  52. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +95 -67
  54. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  55. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +95 -68
  56. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  57. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +94 -26
  58. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +96 -28
  60. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +112 -0
  62. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  63. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +110 -0
  64. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  65. package/dist/admin/future/pages/Assets/components/AssetsTable.js +172 -56
  66. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +175 -59
  68. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +188 -138
  70. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  71. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +191 -141
  72. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  73. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js +123 -76
  74. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.js.map +1 -1
  75. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs +126 -79
  76. package/dist/admin/future/pages/Assets/components/BulkMoveDialog.mjs.map +1 -1
  77. package/dist/admin/future/pages/Assets/components/BusyOverlay.js +36 -0
  78. package/dist/admin/future/pages/Assets/components/BusyOverlay.js.map +1 -0
  79. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs +34 -0
  80. package/dist/admin/future/pages/Assets/components/BusyOverlay.mjs.map +1 -0
  81. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  82. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  84. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  85. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js +131 -0
  86. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.js.map +1 -0
  87. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs +129 -0
  88. package/dist/admin/future/pages/Assets/components/DeleteItemsDialog.mjs.map +1 -0
  89. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +45 -18
  90. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  91. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +46 -19
  92. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  93. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js +28 -31
  94. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs +28 -31
  96. package/dist/admin/future/pages/Assets/components/Dnd/buildDragSet.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js +10 -15
  98. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  99. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs +10 -15
  100. package/dist/admin/future/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  101. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  102. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  104. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  106. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  107. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  108. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  109. package/dist/admin/future/pages/Assets/components/FilterBadges.js +417 -0
  110. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +415 -0
  112. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/components/FilterMenu.js +453 -0
  114. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  115. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +447 -0
  116. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  117. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js +144 -0
  118. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.js.map +1 -0
  119. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs +142 -0
  120. package/dist/admin/future/pages/Assets/components/FolderActionsMenu.mjs.map +1 -0
  121. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.js → FolderFormDialog.js} +50 -16
  122. package/dist/admin/future/pages/Assets/components/FolderFormDialog.js.map +1 -0
  123. package/dist/admin/future/pages/Assets/components/{CreateFolderDialog.mjs → FolderFormDialog.mjs} +52 -18
  124. package/dist/admin/future/pages/Assets/components/FolderFormDialog.mjs.map +1 -0
  125. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +125 -148
  126. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  127. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +127 -150
  128. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  129. package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
  130. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  131. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
  132. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  133. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  134. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  135. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  136. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  137. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
  138. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  139. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
  140. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  141. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js +47 -0
  142. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.js.map +1 -0
  143. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs +44 -0
  144. package/dist/admin/future/pages/Assets/hooks/useBusyAssets.mjs.map +1 -0
  145. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  146. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  147. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  148. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  149. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +222 -45
  150. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  151. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +223 -46
  152. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  153. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js +75 -0
  154. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.js.map +1 -0
  155. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs +73 -0
  156. package/dist/admin/future/pages/Assets/hooks/useInfiniteScrollSentinel.mjs.map +1 -0
  157. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  158. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  159. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  160. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  161. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  162. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  163. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  164. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  165. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
  166. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
  167. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
  168. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
  169. package/dist/admin/future/services/api.js +187 -28
  170. package/dist/admin/future/services/api.js.map +1 -1
  171. package/dist/admin/future/services/api.mjs +187 -30
  172. package/dist/admin/future/services/api.mjs.map +1 -1
  173. package/dist/admin/future/services/assets.js +40 -17
  174. package/dist/admin/future/services/assets.js.map +1 -1
  175. package/dist/admin/future/services/assets.mjs +40 -17
  176. package/dist/admin/future/services/assets.mjs.map +1 -1
  177. package/dist/admin/future/services/folders.js +66 -19
  178. package/dist/admin/future/services/folders.js.map +1 -1
  179. package/dist/admin/future/services/folders.mjs +66 -20
  180. package/dist/admin/future/services/folders.mjs.map +1 -1
  181. package/dist/admin/future/services/settings.js +10 -3
  182. package/dist/admin/future/services/settings.js.map +1 -1
  183. package/dist/admin/future/services/settings.mjs +10 -3
  184. package/dist/admin/future/services/settings.mjs.map +1 -1
  185. package/dist/admin/future/store/uploadProgress.js +109 -2
  186. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  187. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  188. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  189. package/dist/admin/future/utils/buildDragSetFromSelection.js +7 -5
  190. package/dist/admin/future/utils/buildDragSetFromSelection.js.map +1 -1
  191. package/dist/admin/future/utils/buildDragSetFromSelection.mjs +7 -5
  192. package/dist/admin/future/utils/buildDragSetFromSelection.mjs.map +1 -1
  193. package/dist/admin/future/utils/formatMoveSuccessMessage.js +12 -1
  194. package/dist/admin/future/utils/formatMoveSuccessMessage.js.map +1 -1
  195. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs +12 -1
  196. package/dist/admin/future/utils/formatMoveSuccessMessage.mjs.map +1 -1
  197. package/dist/admin/future/utils/getRelationId.js +24 -0
  198. package/dist/admin/future/utils/getRelationId.js.map +1 -0
  199. package/dist/admin/future/utils/getRelationId.mjs +22 -0
  200. package/dist/admin/future/utils/getRelationId.mjs.map +1 -0
  201. package/dist/admin/future/utils/isEventFromWithin.js +14 -0
  202. package/dist/admin/future/utils/isEventFromWithin.js.map +1 -0
  203. package/dist/admin/future/utils/isEventFromWithin.mjs +12 -0
  204. package/dist/admin/future/utils/isEventFromWithin.mjs.map +1 -0
  205. package/dist/admin/future/utils/itemLocations.js +40 -0
  206. package/dist/admin/future/utils/itemLocations.js.map +1 -0
  207. package/dist/admin/future/utils/itemLocations.mjs +36 -0
  208. package/dist/admin/future/utils/itemLocations.mjs.map +1 -0
  209. package/dist/admin/future/utils/itemSource.js +36 -0
  210. package/dist/admin/future/utils/itemSource.js.map +1 -0
  211. package/dist/admin/future/utils/itemSource.mjs +32 -0
  212. package/dist/admin/future/utils/itemSource.mjs.map +1 -0
  213. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  214. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  215. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  216. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  217. package/dist/admin/hooks/useSelectionState.js +2 -4
  218. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  219. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  220. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  221. package/dist/admin/index.js +11 -17
  222. package/dist/admin/index.js.map +1 -1
  223. package/dist/admin/index.mjs +12 -18
  224. package/dist/admin/index.mjs.map +1 -1
  225. package/dist/admin/shared/constants.js +43 -0
  226. package/dist/admin/shared/constants.js.map +1 -0
  227. package/dist/admin/shared/constants.mjs +38 -0
  228. package/dist/admin/shared/constants.mjs.map +1 -0
  229. package/dist/admin/src/future/App.d.ts +1 -1
  230. package/dist/admin/src/future/components/BetaNotice.d.ts +11 -0
  231. package/dist/admin/src/future/components/Drawer.d.ts +5 -1
  232. package/dist/admin/src/future/hooks/useAIMetadataEnabled.d.ts +26 -0
  233. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  234. package/dist/admin/src/future/pages/Assets/components/ActionsMenuContent.d.ts +33 -0
  235. package/dist/admin/src/future/pages/Assets/components/AssetActionsMenu.d.ts +24 -0
  236. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  237. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.d.ts +16 -0
  238. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  239. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +21 -1
  240. package/dist/admin/src/future/pages/Assets/components/BulkMoveDialog.d.ts +17 -6
  241. package/dist/admin/src/future/pages/Assets/components/BusyOverlay.d.ts +9 -0
  242. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  243. package/dist/admin/src/future/pages/Assets/components/DeleteItemsDialog.d.ts +27 -0
  244. package/dist/admin/src/future/pages/Assets/components/Dnd/AssetsDndProvider.d.ts +8 -1
  245. package/dist/admin/src/future/pages/Assets/components/Dnd/buildDragSet.d.ts +18 -3
  246. package/dist/admin/src/future/pages/Assets/components/Dnd/useAssetDnd.d.ts +2 -1
  247. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  248. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  249. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +8 -0
  250. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +26 -0
  251. package/dist/admin/src/future/pages/Assets/components/FolderActionsMenu.d.ts +20 -0
  252. package/dist/admin/src/future/pages/Assets/components/FolderFormDialog.d.ts +16 -0
  253. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  254. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
  255. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  256. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
  257. package/dist/admin/src/future/pages/Assets/hooks/useBusyAssets.d.ts +38 -0
  258. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +27 -3
  259. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteScrollSentinel.d.ts +41 -0
  260. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  261. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  262. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
  263. package/dist/admin/src/future/services/api.d.ts +53 -5
  264. package/dist/admin/src/future/services/assets.d.ts +9 -1
  265. package/dist/admin/src/future/services/folders.d.ts +9 -1
  266. package/dist/admin/src/future/services/settings.d.ts +2 -2
  267. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  268. package/dist/admin/src/future/utils/buildDragSetFromSelection.d.ts +4 -3
  269. package/dist/admin/src/future/utils/formatMoveSuccessMessage.d.ts +7 -1
  270. package/dist/admin/src/future/utils/getRelationId.d.ts +11 -0
  271. package/dist/admin/src/future/utils/isEventFromWithin.d.ts +11 -0
  272. package/dist/admin/src/future/utils/itemLocations.d.ts +31 -0
  273. package/dist/admin/src/future/utils/itemSource.d.ts +22 -0
  274. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  275. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  276. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  277. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  278. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  279. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  280. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  281. package/dist/admin/translations/en.json.js +73 -2
  282. package/dist/admin/translations/en.json.js.map +1 -1
  283. package/dist/admin/translations/en.json.mjs +73 -2
  284. package/dist/admin/translations/en.json.mjs.map +1 -1
  285. package/dist/admin/utils/urlYupSchema.js +33 -9
  286. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  287. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  288. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  289. package/dist/server/config.js +13 -5
  290. package/dist/server/config.js.map +1 -1
  291. package/dist/server/config.mjs +13 -5
  292. package/dist/server/config.mjs.map +1 -1
  293. package/dist/server/constants.js.map +1 -1
  294. package/dist/server/constants.mjs.map +1 -1
  295. package/dist/server/controllers/admin-file.js +30 -0
  296. package/dist/server/controllers/admin-file.js.map +1 -1
  297. package/dist/server/controllers/admin-file.mjs +30 -0
  298. package/dist/server/controllers/admin-file.mjs.map +1 -1
  299. package/dist/server/controllers/admin-settings.js +20 -2
  300. package/dist/server/controllers/admin-settings.js.map +1 -1
  301. package/dist/server/controllers/admin-settings.mjs +21 -3
  302. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  303. package/dist/server/controllers/content-api.js +1 -2
  304. package/dist/server/controllers/content-api.js.map +1 -1
  305. package/dist/server/controllers/content-api.mjs +2 -2
  306. package/dist/server/controllers/content-api.mjs.map +1 -1
  307. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  308. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  309. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  310. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  311. package/dist/server/controllers/validation/admin/settings.js +4 -1
  312. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  313. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  314. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  315. package/dist/server/routes/admin.js +18 -0
  316. package/dist/server/routes/admin.js.map +1 -1
  317. package/dist/server/routes/admin.mjs +18 -0
  318. package/dist/server/routes/admin.mjs.map +1 -1
  319. package/dist/server/services/ai-metadata.js +108 -11
  320. package/dist/server/services/ai-metadata.js.map +1 -1
  321. package/dist/server/services/ai-metadata.mjs +108 -11
  322. package/dist/server/services/ai-metadata.mjs.map +1 -1
  323. package/dist/server/services/file.js +86 -13
  324. package/dist/server/services/file.js.map +1 -1
  325. package/dist/server/services/file.mjs +87 -14
  326. package/dist/server/services/file.mjs.map +1 -1
  327. package/dist/server/services/image-manipulation.js +4 -4
  328. package/dist/server/services/image-manipulation.js.map +1 -1
  329. package/dist/server/services/image-manipulation.mjs +4 -4
  330. package/dist/server/services/image-manipulation.mjs.map +1 -1
  331. package/dist/server/shared/constants.js +43 -0
  332. package/dist/server/shared/constants.js.map +1 -0
  333. package/dist/server/shared/constants.mjs +38 -0
  334. package/dist/server/shared/constants.mjs.map +1 -0
  335. package/dist/server/src/config.d.ts +2 -0
  336. package/dist/server/src/config.d.ts.map +1 -1
  337. package/dist/server/src/constants.d.ts +2 -1
  338. package/dist/server/src/constants.d.ts.map +1 -1
  339. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  340. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  341. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  342. package/dist/server/src/controllers/index.d.ts +1 -0
  343. package/dist/server/src/controllers/index.d.ts.map +1 -1
  344. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  345. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  346. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  347. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  348. package/dist/server/src/index.d.ts +7 -1
  349. package/dist/server/src/index.d.ts.map +1 -1
  350. package/dist/server/src/routes/admin.d.ts.map +1 -1
  351. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  352. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  353. package/dist/server/src/services/file.d.ts +12 -2
  354. package/dist/server/src/services/file.d.ts.map +1 -1
  355. package/dist/server/src/services/image-manipulation.d.ts +0 -5
  356. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  357. package/dist/server/src/services/index.d.ts +4 -1
  358. package/dist/server/src/services/index.d.ts.map +1 -1
  359. package/dist/server/src/types.d.ts +3 -0
  360. package/dist/server/src/types.d.ts.map +1 -1
  361. package/dist/shared/constants.d.ts +35 -0
  362. package/dist/shared/constants.d.ts.map +1 -0
  363. package/dist/shared/contracts/files.d.ts +25 -0
  364. package/dist/shared/contracts/files.d.ts.map +1 -1
  365. package/dist/shared/contracts/settings.d.ts +7 -0
  366. package/package.json +10 -10
  367. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.js.map +0 -1
  368. package/dist/admin/future/pages/Assets/components/CreateFolderDialog.mjs.map +0 -1
  369. package/dist/admin/src/future/pages/Assets/components/CreateFolderDialog.d.ts +0 -8
@@ -1,97 +1,119 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useState, useEffect, useMemo } from 'react';
2
+ import { useMemo, useState, useEffect } from 'react';
3
3
  import { useNotification } from '@strapi/admin/strapi-admin';
4
- import { Modal, Field, SingleSelect, SingleSelectOption, Flex, Button } from '@strapi/design-system';
4
+ import { Modal, Flex, Button, Typography, Field, SingleSelect, SingleSelectOption } from '@strapi/design-system';
5
5
  import { useIntl } from 'react-intl';
6
6
  import { styled } from 'styled-components';
7
- import { useGetFolderStructureQuery, useGetFolderQuery, useBulkMoveMutation } from '../../../services/folders.mjs';
8
- import { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection.mjs';
7
+ import { useGetFolderStructureQuery, useBulkMoveMutation, useGetFolderQuery } from '../../../services/folders.mjs';
9
8
  import { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder.mjs';
10
9
  import { flattenFolderStructure } from '../../../utils/flattenFolderStructure.mjs';
10
+ import { formatMoveSuccessMessage } from '../../../utils/formatMoveSuccessMessage.mjs';
11
11
  import { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage.mjs';
12
+ import { hasUniformSource, uniformSourceFolderId } from '../../../utils/itemSource.mjs';
12
13
  import { getTranslationKey } from '../../../utils/translations.mjs';
13
- import { useAssetSelection } from '../hooks/useAssetSelection.mjs';
14
- import { useFolderNavigation } from '../hooks/useFolderNavigation.mjs';
15
14
 
16
15
  const StyledModalContent = styled(Modal.Content)`
17
16
  max-width: 51.6rem;
18
17
  `;
19
18
  /**
20
- * "Move elements to" modal for the bulk actions bar. Moves the current
21
- * selection (assets and/or folders) into the picked destination folder via
22
- * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,
23
- * folder list and the sidebar folder-structure, so both panes refresh on
24
- * success. On failure the modal stays open so the user can retry or cancel.
25
- */ const BulkMoveDialog = ({ open, onClose })=>{
19
+ * "Move elements to" modal. Moves the given items (assets and/or folders) into
20
+ * the picked destination folder via `POST /upload/actions/bulk-move`. The
21
+ * mutation invalidates the asset list, folder list and the sidebar
22
+ * folder-structure, so both panes refresh on success. On failure the modal stays
23
+ * open so the user can retry or cancel.
24
+ *
25
+ * Used both by the bulk actions bar (the whole selection) and by a folder's
26
+ * actions menu (that one folder).
27
+ */ const BulkMoveDialog = ({ open, onClose, items, onSuccess })=>{
26
28
  const { formatMessage } = useIntl();
27
29
  const { toggleNotification } = useNotification();
28
- const { selectedIds, selectedFolderIds, clear } = useAssetSelection();
29
- const { currentFolderId } = useFolderNavigation();
30
- const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, {
30
+ const { data: folderStructure = [], isUninitialized: isStructureUninitialized, isLoading: isLoadingStructure, isError: isStructureError } = useGetFolderStructureQuery(undefined, {
31
31
  skip: !open
32
32
  });
33
- const { data: currentFolder } = useGetFolderQuery({
34
- id: currentFolderId
33
+ const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
34
+ const fileIds = useMemo(()=>items.filter((item)=>item.kind === 'file').map((item)=>item.id), [
35
+ items
36
+ ]);
37
+ const folderIds = useMemo(()=>items.filter((item)=>item.kind === 'folder').map((item)=>item.id), [
38
+ items
39
+ ]);
40
+ // A selection made under a global search can span folders, so the source is
41
+ // nameable only when every item agrees on it — `null` otherwise, and the toast
42
+ // then omits the source rather than crediting one item's folder to all of them.
43
+ // The bar can also hand over an empty set, which is likewise unnameable.
44
+ const isSourceUniform = hasUniformSource(items);
45
+ const sourceFolderId = uniformSourceFolderId(items);
46
+ const { data: sourceFolder } = useGetFolderQuery({
47
+ id: sourceFolderId
35
48
  }, {
36
- skip: currentFolderId === null
49
+ skip: sourceFolderId === null
37
50
  });
38
- const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();
39
51
  // '' is the DOM-only sentinel for the Media Library root (null everywhere else).
40
52
  const [destination, setDestination] = useState('');
41
- useEffect(()=>{
42
- if (open) {
43
- setDestination('');
44
- }
45
- }, [
46
- open
47
- ]);
48
53
  const rootLabel = formatMessage({
49
54
  id: getTranslationKey('plugin.name'),
50
55
  defaultMessage: 'Media Library'
51
56
  });
52
- // Reconstruct the selection as a drag set so the dialog validates destinations
53
- // through the exact same canonical predicate as the DnD highlight.
54
- const dragSet = useMemo(()=>buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId), [
55
- selectedIds,
56
- selectedFolderIds,
57
- currentFolderId
58
- ]);
59
57
  // Options carry the full ancestry ("About / Images" vs "Tech / Images") so
60
58
  // same-named folders stay distinguishable, listed depth-first under their
61
- // parent. Selected folders and their descendants are pruned during the same
59
+ // parent. The moved folders and their descendants are pruned during the same
62
60
  // single walk — an item can't be moved into itself or below itself (the
63
- // server would reject it). The current folder (where the items already live)
64
- // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op
65
- // move. Memoized: large libraries shouldn't re-walk the tree on every render.
66
- const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure, selectedFolderIds).filter((option)=>canDropItemOnFolder({
67
- items: dragSet,
61
+ // server would reject it). The folder the items already live in is filtered
62
+ // out too via `canDropItemOnFolder`, so we never offer a no-op move.
63
+ // Memoized: large libraries shouldn't re-walk the tree on every render.
64
+ const destinationOptions = useMemo(()=>flattenFolderStructure(folderStructure, new Set(folderIds)).filter((option)=>canDropItemOnFolder({
65
+ items,
68
66
  targetFolderId: option.id,
69
67
  folderStructure
70
68
  })), [
71
69
  folderStructure,
72
- selectedFolderIds,
73
- dragSet
70
+ folderIds,
71
+ items
74
72
  ]);
75
73
  // Hide the root option when the items already live at root — dropping there
76
74
  // would be a no-op. Uses the same predicate as the DnD highlight.
77
75
  const canMoveToRoot = useMemo(()=>canDropItemOnFolder({
78
- items: dragSet,
76
+ items,
79
77
  targetFolderId: null,
80
78
  folderStructure
81
79
  }), [
82
- dragSet,
80
+ items,
83
81
  folderStructure
84
82
  ]);
85
- const count = selectedIds.size + selectedFolderIds.size;
83
+ // The default has to be an option that is actually rendered, or the select
84
+ // shows blank: root is absent when the items already live there, and the
85
+ // folder options only exist once the structure query has resolved.
86
+ const defaultDestination = canMoveToRoot ? '' : destinationOptions[0]?.id.toString() ?? '';
87
+ // Re-derived rather than only reset on open, because the options arrive after
88
+ // the first render. It is a primitive, so a background refetch that produces
89
+ // the same default won't discard a destination the user already picked.
90
+ useEffect(()=>{
91
+ setDestination(defaultDestination);
92
+ }, [
93
+ open,
94
+ defaultDestination
95
+ ]);
96
+ // Until the structure resolves there are no options, so the default falls
97
+ // back to root ('') — which for a root-level item is the no-op destination
98
+ // that was deliberately filtered out. Nothing may be submitted before this.
99
+ const isStructureReady = !isStructureUninitialized && !isLoadingStructure && !isStructureError;
100
+ // Moving a single folder that already sits next to every other folder leaves
101
+ // nowhere to go; say so instead of showing an empty select. Only once the
102
+ // structure has arrived — an in-flight or failed fetch also has no options,
103
+ // and a failure is a different story to tell.
104
+ const hasNoDestination = isStructureReady && destinationOptions.length === 0 && !canMoveToRoot;
105
+ const count = items.length;
86
106
  const handleMove = async ()=>{
87
- if (isMoving) {
107
+ // The button is disabled in both cases; the dialog can also be submitted
108
+ // from the keyboard, so guard here too.
109
+ if (isMoving || !isStructureReady) {
88
110
  return;
89
111
  }
90
112
  const destinationFolderId = destination === '' ? null : Number(destination);
91
113
  try {
92
114
  await bulkMove({
93
- fileIds: Array.from(selectedIds),
94
- folderIds: Array.from(selectedFolderIds),
115
+ fileIds,
116
+ folderIds,
95
117
  destinationFolderId
96
118
  }).unwrap();
97
119
  } catch (error) {
@@ -108,22 +130,71 @@ const StyledModalContent = styled(Modal.Content)`
108
130
  });
109
131
  return;
110
132
  }
111
- const sourceName = currentFolderId === null ? rootLabel : currentFolder?.name ?? rootLabel;
133
+ // A uniform source with a `null` id is the Media Library root — a real name.
134
+ // Only a set that genuinely spans folders has no source to report.
135
+ const sourceName = !isSourceUniform ? null : sourceFolderId === null ? rootLabel : sourceFolder?.name ?? rootLabel;
112
136
  const destinationName = destinationFolderId === null ? rootLabel : destinationOptions.find((option)=>option.id === destinationFolderId)?.label ?? rootLabel;
113
137
  toggleNotification({
114
138
  type: 'success',
115
- message: formatMessage({
116
- id: getTranslationKey('list.bulk-actions.move.success'),
117
- defaultMessage: '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}'
118
- }, {
139
+ message: formatMoveSuccessMessage({
140
+ formatMessage,
119
141
  count,
120
142
  source: sourceName,
121
143
  destination: destinationName
122
144
  })
123
145
  });
124
- clear();
146
+ onSuccess?.();
125
147
  onClose();
126
148
  };
149
+ // Three states: a failed structure request, a genuine dead end, and the
150
+ // select — which also covers the loading window, so the hint and the error
151
+ // don't flash in ahead of the options.
152
+ const renderBody = ()=>{
153
+ if (isStructureError) {
154
+ return /*#__PURE__*/ jsx(Typography, {
155
+ textColor: "danger600",
156
+ children: formatMessage({
157
+ id: getTranslationKey('list.bulk-actions.move.load-error'),
158
+ defaultMessage: "Couldn't load the folder list. Please try again."
159
+ })
160
+ });
161
+ }
162
+ if (hasNoDestination) {
163
+ return /*#__PURE__*/ jsx(Typography, {
164
+ textColor: "neutral600",
165
+ children: formatMessage({
166
+ id: getTranslationKey('list.bulk-actions.move.no-destination'),
167
+ defaultMessage: 'There is no other folder to move this to.'
168
+ })
169
+ });
170
+ }
171
+ return /*#__PURE__*/ jsxs(Field.Root, {
172
+ name: "destination",
173
+ children: [
174
+ /*#__PURE__*/ jsx(Field.Label, {
175
+ children: formatMessage({
176
+ id: getTranslationKey('list.bulk-actions.move.location'),
177
+ defaultMessage: 'Location'
178
+ })
179
+ }),
180
+ /*#__PURE__*/ jsxs(SingleSelect, {
181
+ value: destination,
182
+ onChange: (value)=>setDestination(String(value)),
183
+ disabled: isMoving || !isStructureReady,
184
+ children: [
185
+ canMoveToRoot && /*#__PURE__*/ jsx(SingleSelectOption, {
186
+ value: "",
187
+ children: rootLabel
188
+ }),
189
+ destinationOptions.map((option)=>/*#__PURE__*/ jsx(SingleSelectOption, {
190
+ value: String(option.id),
191
+ children: option.label
192
+ }, option.id))
193
+ ]
194
+ })
195
+ ]
196
+ });
197
+ };
127
198
  return /*#__PURE__*/ jsx(Modal.Root, {
128
199
  open: open,
129
200
  onOpenChange: (nextOpen)=>{
@@ -144,32 +215,7 @@ const StyledModalContent = styled(Modal.Content)`
144
215
  })
145
216
  }),
146
217
  /*#__PURE__*/ jsx(Modal.Body, {
147
- children: /*#__PURE__*/ jsxs(Field.Root, {
148
- name: "destination",
149
- children: [
150
- /*#__PURE__*/ jsx(Field.Label, {
151
- children: formatMessage({
152
- id: getTranslationKey('list.bulk-actions.move.location'),
153
- defaultMessage: 'Location'
154
- })
155
- }),
156
- /*#__PURE__*/ jsxs(SingleSelect, {
157
- value: destination,
158
- onChange: (value)=>setDestination(String(value)),
159
- disabled: isMoving,
160
- children: [
161
- canMoveToRoot && /*#__PURE__*/ jsx(SingleSelectOption, {
162
- value: "",
163
- children: rootLabel
164
- }),
165
- destinationOptions.map((option)=>/*#__PURE__*/ jsx(SingleSelectOption, {
166
- value: String(option.id),
167
- children: option.label
168
- }, option.id))
169
- ]
170
- })
171
- ]
172
- })
218
+ children: renderBody()
173
219
  }),
174
220
  /*#__PURE__*/ jsx(Modal.Footer, {
175
221
  children: /*#__PURE__*/ jsxs(Flex, {
@@ -190,6 +236,7 @@ const StyledModalContent = styled(Modal.Content)`
190
236
  /*#__PURE__*/ jsx(Button, {
191
237
  onClick: handleMove,
192
238
  loading: isMoving,
239
+ disabled: !isStructureReady || hasNoDestination,
193
240
  children: formatMessage({
194
241
  id: getTranslationKey('list.bulk-actions.move.submit'),
195
242
  defaultMessage: 'Move'
@@ -1 +1 @@
1
- {"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { buildDragSetFromSelection } from '../../../utils/buildDragSetFromSelection';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useAssetSelection } from '../hooks/useAssetSelection';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n}\n\n/**\n * \"Move elements to\" modal for the bulk actions bar. Moves the current\n * selection (assets and/or folders) into the picked destination folder via\n * `POST /upload/actions/bulk-move`. The mutation invalidates the asset list,\n * folder list and the sidebar folder-structure, so both panes refresh on\n * success. On failure the modal stays open so the user can retry or cancel.\n */\nexport const BulkMoveDialog = ({ open, onClose }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { selectedIds, selectedFolderIds, clear } = useAssetSelection();\n const { currentFolderId } = useFolderNavigation();\n const { data: folderStructure = [] } = useGetFolderStructureQuery(undefined, { skip: !open });\n const { data: currentFolder } = useGetFolderQuery(\n { id: currentFolderId! },\n { skip: currentFolderId === null }\n );\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n useEffect(() => {\n if (open) {\n setDestination('');\n }\n }, [open]);\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Reconstruct the selection as a drag set so the dialog validates destinations\n // through the exact same canonical predicate as the DnD highlight.\n const dragSet = useMemo(\n () => buildDragSetFromSelection(selectedIds, selectedFolderIds, currentFolderId),\n [selectedIds, selectedFolderIds, currentFolderId]\n );\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. Selected folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The current folder (where the items already live)\n // is filtered out too via `canDropItemOnFolder`, so we never offer a no-op\n // move. Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, selectedFolderIds).filter((option) =>\n canDropItemOnFolder({ items: dragSet, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, selectedFolderIds, dragSet]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items: dragSet, targetFolderId: null, folderStructure }),\n [dragSet, folderStructure]\n );\n\n const count = selectedIds.size + selectedFolderIds.size;\n\n const handleMove = async () => {\n if (isMoving) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({\n fileIds: Array.from(selectedIds),\n folderIds: Array.from(selectedFolderIds),\n destinationFolderId,\n }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n const sourceName = currentFolderId === null ? rootLabel : (currentFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('list.bulk-actions.move.success'),\n defaultMessage:\n '{count, plural, =1 {# element has} other {# elements have}} been moved from {source} to {destination}',\n },\n { count, source: sourceName, destination: destinationName }\n ),\n });\n clear();\n onClose();\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n </Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button onClick={handleMove} loading={isMoving}>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","formatMessage","useIntl","toggleNotification","useNotification","selectedIds","selectedFolderIds","clear","useAssetSelection","currentFolderId","useFolderNavigation","data","folderStructure","useGetFolderStructureQuery","undefined","skip","currentFolder","useGetFolderQuery","id","bulkMove","isLoading","isMoving","useBulkMoveMutation","destination","setDestination","useState","useEffect","rootLabel","getTranslationKey","defaultMessage","dragSet","useMemo","buildDragSetFromSelection","destinationOptions","flattenFolderStructure","filter","option","canDropItemOnFolder","items","targetFolderId","canMoveToRoot","count","size","handleMove","destinationFolderId","Number","fileIds","Array","from","folderIds","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","source","_jsx","Root","onOpenChange","nextOpen","_jsxs","Header","Title","Body","Field","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","map","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":"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"}
1
+ {"version":3,"file":"BulkMoveDialog.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BulkMoveDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Field,\n Flex,\n Modal,\n SingleSelect,\n SingleSelectOption,\n Typography,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport {\n useBulkMoveMutation,\n useGetFolderQuery,\n useGetFolderStructureQuery,\n} from '../../../services/folders';\nimport { canDropItemOnFolder } from '../../../utils/canDropItemOnFolder';\nimport { flattenFolderStructure } from '../../../utils/flattenFolderStructure';\nimport { formatMoveSuccessMessage } from '../../../utils/formatMoveSuccessMessage';\nimport { getBulkMoveErrorMessage } from '../../../utils/getBulkMoveErrorMessage';\nimport { hasUniformSource, uniformSourceFolderId } from '../../../utils/itemSource';\nimport { getTranslationKey } from '../../../utils/translations';\n\nimport type { DragItemData } from '../../../types/dnd';\n\nconst StyledModalContent = styled(Modal.Content)`\n max-width: 51.6rem;\n`;\n\ninterface BulkMoveDialogProps {\n open: boolean;\n onClose: () => void;\n /**\n * Items to move, as drag data so destination validation sees each item's real\n * parent — the current folder is not a reliable stand-in once results come\n * from a global search.\n */\n items: DragItemData[];\n onSuccess?: () => void;\n}\n\n/**\n * \"Move elements to\" modal. Moves the given items (assets and/or folders) into\n * the picked destination folder via `POST /upload/actions/bulk-move`. The\n * mutation invalidates the asset list, folder list and the sidebar\n * folder-structure, so both panes refresh on success. On failure the modal stays\n * open so the user can retry or cancel.\n *\n * Used both by the bulk actions bar (the whole selection) and by a folder's\n * actions menu (that one folder).\n */\nexport const BulkMoveDialog = ({ open, onClose, items, onSuccess }: BulkMoveDialogProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const {\n data: folderStructure = [],\n isUninitialized: isStructureUninitialized,\n isLoading: isLoadingStructure,\n isError: isStructureError,\n } = useGetFolderStructureQuery(undefined, { skip: !open });\n const [bulkMove, { isLoading: isMoving }] = useBulkMoveMutation();\n\n const fileIds = useMemo(\n () => items.filter((item) => item.kind === 'file').map((item) => item.id),\n [items]\n );\n const folderIds = useMemo(\n () => items.filter((item) => item.kind === 'folder').map((item) => item.id),\n [items]\n );\n\n // A selection made under a global search can span folders, so the source is\n // nameable only when every item agrees on it — `null` otherwise, and the toast\n // then omits the source rather than crediting one item's folder to all of them.\n // The bar can also hand over an empty set, which is likewise unnameable.\n const isSourceUniform = hasUniformSource(items);\n const sourceFolderId = uniformSourceFolderId(items);\n const { data: sourceFolder } = useGetFolderQuery(\n { id: sourceFolderId! },\n { skip: sourceFolderId === null }\n );\n\n // '' is the DOM-only sentinel for the Media Library root (null everywhere else).\n const [destination, setDestination] = useState<string>('');\n\n const rootLabel = formatMessage({\n id: getTranslationKey('plugin.name'),\n defaultMessage: 'Media Library',\n });\n\n // Options carry the full ancestry (\"About / Images\" vs \"Tech / Images\") so\n // same-named folders stay distinguishable, listed depth-first under their\n // parent. The moved folders and their descendants are pruned during the same\n // single walk — an item can't be moved into itself or below itself (the\n // server would reject it). The folder the items already live in is filtered\n // out too via `canDropItemOnFolder`, so we never offer a no-op move.\n // Memoized: large libraries shouldn't re-walk the tree on every render.\n const destinationOptions = useMemo(\n () =>\n flattenFolderStructure(folderStructure, new Set(folderIds)).filter((option) =>\n canDropItemOnFolder({ items, targetFolderId: option.id, folderStructure })\n ),\n [folderStructure, folderIds, items]\n );\n\n // Hide the root option when the items already live at root — dropping there\n // would be a no-op. Uses the same predicate as the DnD highlight.\n const canMoveToRoot = useMemo(\n () => canDropItemOnFolder({ items, targetFolderId: null, folderStructure }),\n [items, folderStructure]\n );\n\n // The default has to be an option that is actually rendered, or the select\n // shows blank: root is absent when the items already live there, and the\n // folder options only exist once the structure query has resolved.\n const defaultDestination = canMoveToRoot ? '' : (destinationOptions[0]?.id.toString() ?? '');\n\n // Re-derived rather than only reset on open, because the options arrive after\n // the first render. It is a primitive, so a background refetch that produces\n // the same default won't discard a destination the user already picked.\n useEffect(() => {\n setDestination(defaultDestination);\n }, [open, defaultDestination]);\n\n // Until the structure resolves there are no options, so the default falls\n // back to root ('') — which for a root-level item is the no-op destination\n // that was deliberately filtered out. Nothing may be submitted before this.\n const isStructureReady = !isStructureUninitialized && !isLoadingStructure && !isStructureError;\n\n // Moving a single folder that already sits next to every other folder leaves\n // nowhere to go; say so instead of showing an empty select. Only once the\n // structure has arrived — an in-flight or failed fetch also has no options,\n // and a failure is a different story to tell.\n const hasNoDestination = isStructureReady && destinationOptions.length === 0 && !canMoveToRoot;\n\n const count = items.length;\n\n const handleMove = async () => {\n // The button is disabled in both cases; the dialog can also be submitted\n // from the keyboard, so guard here too.\n if (isMoving || !isStructureReady) {\n return;\n }\n\n const destinationFolderId = destination === '' ? null : Number(destination);\n\n try {\n await bulkMove({ fileIds, folderIds, destinationFolderId }).unwrap();\n } catch (error) {\n // Keep the modal open and the selection intact so the user can retry\n // (e.g. after picking a valid destination) or cancel. Surface the server\n // message when there is one — it carries actionable causes like moving a\n // folder into its own descendant or a name collision in the destination.\n toggleNotification({\n type: 'danger',\n message: getBulkMoveErrorMessage(\n error,\n formatMessage({\n id: getTranslationKey('list.bulk-actions.move.error'),\n defaultMessage: 'An error occurred while moving the items.',\n })\n ),\n });\n return;\n }\n\n // A uniform source with a `null` id is the Media Library root — a real name.\n // Only a set that genuinely spans folders has no source to report.\n const sourceName = !isSourceUniform\n ? null\n : sourceFolderId === null\n ? rootLabel\n : (sourceFolder?.name ?? rootLabel);\n const destinationName =\n destinationFolderId === null\n ? rootLabel\n : (destinationOptions.find((option) => option.id === destinationFolderId)?.label ??\n rootLabel);\n\n toggleNotification({\n type: 'success',\n message: formatMoveSuccessMessage({\n formatMessage,\n count,\n source: sourceName,\n destination: destinationName,\n }),\n });\n onSuccess?.();\n onClose();\n };\n\n // Three states: a failed structure request, a genuine dead end, and the\n // select — which also covers the loading window, so the hint and the error\n // don't flash in ahead of the options.\n const renderBody = () => {\n if (isStructureError) {\n return (\n <Typography textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.load-error'),\n defaultMessage: \"Couldn't load the folder list. Please try again.\",\n })}\n </Typography>\n );\n }\n\n if (hasNoDestination) {\n return (\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.no-destination'),\n defaultMessage: 'There is no other folder to move this to.',\n })}\n </Typography>\n );\n }\n\n return (\n <Field.Root name=\"destination\">\n <Field.Label>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.location'),\n defaultMessage: 'Location',\n })}\n </Field.Label>\n <SingleSelect\n value={destination}\n onChange={(value) => setDestination(String(value))}\n disabled={isMoving || !isStructureReady}\n >\n {canMoveToRoot && <SingleSelectOption value=\"\">{rootLabel}</SingleSelectOption>}\n {destinationOptions.map((option) => (\n <SingleSelectOption key={option.id} value={String(option.id)}>\n {option.label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n </Field.Root>\n );\n };\n\n return (\n <Modal.Root\n open={open}\n onOpenChange={(nextOpen: boolean) => {\n // The modal must stay open while the request runs — the loader on the\n // Move button is the source of truth for the pending state.\n if (!nextOpen && !isMoving) {\n onClose();\n }\n }}\n >\n <StyledModalContent>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.title'),\n defaultMessage: 'Move elements to',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>{renderBody()}</Modal.Body>\n <Modal.Footer>\n <Flex gap={2} justifyContent=\"space-between\" width=\"100%\">\n <Button variant=\"tertiary\" onClick={onClose} disabled={isMoving} type=\"button\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n <Button\n onClick={handleMove}\n loading={isMoving}\n disabled={!isStructureReady || hasNoDestination}\n >\n {formatMessage({\n id: getTranslationKey('list.bulk-actions.move.submit'),\n defaultMessage: 'Move',\n })}\n </Button>\n </Flex>\n </Modal.Footer>\n </StyledModalContent>\n </Modal.Root>\n );\n};\n"],"names":["StyledModalContent","styled","Modal","Content","BulkMoveDialog","open","onClose","items","onSuccess","formatMessage","useIntl","toggleNotification","useNotification","data","folderStructure","isUninitialized","isStructureUninitialized","isLoading","isLoadingStructure","isError","isStructureError","useGetFolderStructureQuery","undefined","skip","bulkMove","isMoving","useBulkMoveMutation","fileIds","useMemo","filter","item","kind","map","id","folderIds","isSourceUniform","hasUniformSource","sourceFolderId","uniformSourceFolderId","sourceFolder","useGetFolderQuery","destination","setDestination","useState","rootLabel","getTranslationKey","defaultMessage","destinationOptions","flattenFolderStructure","Set","option","canDropItemOnFolder","targetFolderId","canMoveToRoot","defaultDestination","toString","useEffect","isStructureReady","hasNoDestination","length","count","handleMove","destinationFolderId","Number","unwrap","error","type","message","getBulkMoveErrorMessage","sourceName","name","destinationName","find","label","formatMoveSuccessMessage","source","renderBody","_jsx","Typography","textColor","_jsxs","Field","Root","Label","SingleSelect","value","onChange","String","disabled","SingleSelectOption","onOpenChange","nextOpen","Header","Title","Body","Footer","Flex","gap","justifyContent","width","Button","variant","onClick","loading"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var styledComponents = require('styled-components');
6
+
7
+ /**
8
+ * Translucent overlay for a container with a long-running mutation in flight,
9
+ * covering it and centring a labelled loader.
10
+ *
11
+ * Used by the asset details drawer (over the whole form) and by the list's rows
12
+ * and cards (over the one item being replaced). It positions against the
13
+ * nearest positioned ancestor, so the container must be `position: relative`.
14
+ *
15
+ * `$zIndex` is a prop because the two callers stack differently: in the drawer
16
+ * it has to clear the in-drawer toast slot at 10, while in a row it only has to
17
+ * clear the row's own content.
18
+ */ const BusyOverlayRoot = styledComponents.styled(designSystem.Flex)`
19
+ position: absolute;
20
+ inset: 0;
21
+ z-index: ${({ $zIndex })=>$zIndex};
22
+ align-items: center;
23
+ justify-content: center;
24
+ background: ${({ theme })=>theme.colors.neutral0};
25
+ opacity: 0.7;
26
+ `;
27
+ const BusyOverlay = ({ children, zIndex = 20, hideLabel = false })=>/*#__PURE__*/ jsxRuntime.jsx(BusyOverlayRoot, {
28
+ $zIndex: zIndex,
29
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Loader, {
30
+ small: hideLabel,
31
+ children: children
32
+ })
33
+ });
34
+
35
+ exports.BusyOverlay = BusyOverlay;
36
+ //# sourceMappingURL=BusyOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BusyOverlay.js","sources":["../../../../../../admin/src/future/pages/Assets/components/BusyOverlay.tsx"],"sourcesContent":["import { Flex, Loader } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * Translucent overlay for a container with a long-running mutation in flight,\n * covering it and centring a labelled loader.\n *\n * Used by the asset details drawer (over the whole form) and by the list's rows\n * and cards (over the one item being replaced). It positions against the\n * nearest positioned ancestor, so the container must be `position: relative`.\n *\n * `$zIndex` is a prop because the two callers stack differently: in the drawer\n * it has to clear the in-drawer toast slot at 10, while in a row it only has to\n * clear the row's own content.\n */\nconst BusyOverlayRoot = styled(Flex)<{ $zIndex: number }>`\n position: absolute;\n inset: 0;\n z-index: ${({ $zIndex }) => $zIndex};\n align-items: center;\n justify-content: center;\n background: ${({ theme }) => theme.colors.neutral0};\n opacity: 0.7;\n`;\n\ninterface BusyOverlayProps {\n /** Shown next to the spinner, and read out as the loader's accessible label. */\n children: string;\n zIndex?: number;\n /** Hides the label, leaving the spinner — for containers too small to fit text. */\n hideLabel?: boolean;\n}\n\nexport const BusyOverlay = ({ children, zIndex = 20, hideLabel = false }: BusyOverlayProps) => (\n <BusyOverlayRoot $zIndex={zIndex}>\n <Loader small={hideLabel}>{children}</Loader>\n </BusyOverlayRoot>\n);\n"],"names":["BusyOverlayRoot","styled","Flex","$zIndex","theme","colors","neutral0","BusyOverlay","children","zIndex","hideLabel","_jsx","Loader","small"],"mappings":";;;;;;AAGA;;;;;;;;;;;AAWC,IACD,MAAMA,eAAAA,GAAkBC,uBAAAA,CAAOC,iBAAAA,CAA0B;;;AAG9C,WAAA,EAAE,CAAC,EAAEC,OAAO,EAAE,GAAKA,OAAAA,CAAQ;;;cAGxB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;;AAErD,CAAC;AAUM,MAAMC,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,MAAAA,GAAS,EAAE,EAAEC,SAAAA,GAAY,KAAK,EAAoB,iBACxFC,cAAA,CAACX,eAAAA,EAAAA;QAAgBG,OAAAA,EAASM,MAAAA;AACxB,QAAA,QAAA,gBAAAE,cAAA,CAACC,mBAAAA,EAAAA;YAAOC,KAAAA,EAAOH,SAAAA;AAAYF,YAAAA,QAAAA,EAAAA;;AAE7B,KAAA;;;;"}
@@ -0,0 +1,34 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Loader, Flex } from '@strapi/design-system';
3
+ import { styled } from 'styled-components';
4
+
5
+ /**
6
+ * Translucent overlay for a container with a long-running mutation in flight,
7
+ * covering it and centring a labelled loader.
8
+ *
9
+ * Used by the asset details drawer (over the whole form) and by the list's rows
10
+ * and cards (over the one item being replaced). It positions against the
11
+ * nearest positioned ancestor, so the container must be `position: relative`.
12
+ *
13
+ * `$zIndex` is a prop because the two callers stack differently: in the drawer
14
+ * it has to clear the in-drawer toast slot at 10, while in a row it only has to
15
+ * clear the row's own content.
16
+ */ const BusyOverlayRoot = styled(Flex)`
17
+ position: absolute;
18
+ inset: 0;
19
+ z-index: ${({ $zIndex })=>$zIndex};
20
+ align-items: center;
21
+ justify-content: center;
22
+ background: ${({ theme })=>theme.colors.neutral0};
23
+ opacity: 0.7;
24
+ `;
25
+ const BusyOverlay = ({ children, zIndex = 20, hideLabel = false })=>/*#__PURE__*/ jsx(BusyOverlayRoot, {
26
+ $zIndex: zIndex,
27
+ children: /*#__PURE__*/ jsx(Loader, {
28
+ small: hideLabel,
29
+ children: children
30
+ })
31
+ });
32
+
33
+ export { BusyOverlay };
34
+ //# sourceMappingURL=BusyOverlay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BusyOverlay.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/BusyOverlay.tsx"],"sourcesContent":["import { Flex, Loader } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\n/**\n * Translucent overlay for a container with a long-running mutation in flight,\n * covering it and centring a labelled loader.\n *\n * Used by the asset details drawer (over the whole form) and by the list's rows\n * and cards (over the one item being replaced). It positions against the\n * nearest positioned ancestor, so the container must be `position: relative`.\n *\n * `$zIndex` is a prop because the two callers stack differently: in the drawer\n * it has to clear the in-drawer toast slot at 10, while in a row it only has to\n * clear the row's own content.\n */\nconst BusyOverlayRoot = styled(Flex)<{ $zIndex: number }>`\n position: absolute;\n inset: 0;\n z-index: ${({ $zIndex }) => $zIndex};\n align-items: center;\n justify-content: center;\n background: ${({ theme }) => theme.colors.neutral0};\n opacity: 0.7;\n`;\n\ninterface BusyOverlayProps {\n /** Shown next to the spinner, and read out as the loader's accessible label. */\n children: string;\n zIndex?: number;\n /** Hides the label, leaving the spinner — for containers too small to fit text. */\n hideLabel?: boolean;\n}\n\nexport const BusyOverlay = ({ children, zIndex = 20, hideLabel = false }: BusyOverlayProps) => (\n <BusyOverlayRoot $zIndex={zIndex}>\n <Loader small={hideLabel}>{children}</Loader>\n </BusyOverlayRoot>\n);\n"],"names":["BusyOverlayRoot","styled","Flex","$zIndex","theme","colors","neutral0","BusyOverlay","children","zIndex","hideLabel","_jsx","Loader","small"],"mappings":";;;;AAGA;;;;;;;;;;;AAWC,IACD,MAAMA,eAAAA,GAAkBC,MAAAA,CAAOC,IAAAA,CAA0B;;;AAG9C,WAAA,EAAE,CAAC,EAAEC,OAAO,EAAE,GAAKA,OAAAA,CAAQ;;;cAGxB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;;AAErD,CAAC;AAUM,MAAMC,WAAAA,GAAc,CAAC,EAAEC,QAAQ,EAAEC,MAAAA,GAAS,EAAE,EAAEC,SAAAA,GAAY,KAAK,EAAoB,iBACxFC,GAAA,CAACX,eAAAA,EAAAA;QAAgBG,OAAAA,EAASM,MAAAA;AACxB,QAAA,QAAA,gBAAAE,GAAA,CAACC,MAAAA,EAAAA;YAAOC,KAAAA,EAAOH,SAAAA;AAAYF,YAAAA,QAAAA,EAAAA;;AAE7B,KAAA;;;;"}