@strapi/upload 5.58.0 → 5.60.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 (395) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  10. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  12. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  14. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  16. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  18. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  20. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  21. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +142 -0
  22. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -0
  23. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +140 -0
  24. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -0
  25. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  26. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  27. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  28. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  29. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  30. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  31. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  32. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +156 -0
  34. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -0
  35. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +154 -0
  36. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -0
  37. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetRow.js +211 -0
  42. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -0
  43. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +208 -0
  44. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -0
  45. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  46. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  47. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  48. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  49. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +439 -0
  50. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -0
  51. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +433 -0
  52. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -0
  53. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  54. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  55. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  56. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  57. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  58. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  60. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  61. package/dist/admin/components/UploadProgressDialog.js +2 -1
  62. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  63. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  64. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  65. package/dist/admin/hooks/useAIMetadataAvailability.js +5 -1
  66. package/dist/admin/hooks/useAIMetadataAvailability.js.map +1 -1
  67. package/dist/admin/hooks/useAIMetadataAvailability.mjs +5 -1
  68. package/dist/admin/hooks/useAIMetadataAvailability.mjs.map +1 -1
  69. package/dist/admin/hooks/useAIMetadataEnabled.js +7 -1
  70. package/dist/admin/hooks/useAIMetadataEnabled.js.map +1 -1
  71. package/dist/admin/hooks/useAIMetadataEnabled.mjs +7 -1
  72. package/dist/admin/hooks/useAIMetadataEnabled.mjs.map +1 -1
  73. package/dist/admin/hooks/useMediaLibraryPermissions.js +16 -2
  74. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  75. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +16 -2
  76. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  77. package/dist/admin/hooks/useTracking.js +5 -1
  78. package/dist/admin/hooks/useTracking.js.map +1 -1
  79. package/dist/admin/hooks/useTracking.mjs +5 -1
  80. package/dist/admin/hooks/useTracking.mjs.map +1 -1
  81. package/dist/admin/index.js +7 -2
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +7 -2
  84. package/dist/admin/index.mjs.map +1 -1
  85. package/dist/admin/legacy/components/AssetCard/AssetCardBase.js.map +1 -1
  86. package/dist/admin/legacy/components/AssetCard/AssetCardBase.mjs.map +1 -1
  87. package/dist/admin/legacy/components/AssetCard/VideoPreview.js +2 -1
  88. package/dist/admin/legacy/components/AssetCard/VideoPreview.js.map +1 -1
  89. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs +2 -1
  90. package/dist/admin/legacy/components/AssetCard/VideoPreview.mjs.map +1 -1
  91. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js +3 -1
  92. package/dist/admin/legacy/components/AssetDialog/AssetDialog.js.map +1 -1
  93. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs +3 -1
  94. package/dist/admin/legacy/components/AssetDialog/AssetDialog.mjs.map +1 -1
  95. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js +3 -1
  96. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.js.map +1 -1
  97. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs +3 -1
  98. package/dist/admin/legacy/components/AssetDialog/BrowseStep/BrowseStep.mjs.map +1 -1
  99. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  100. package/dist/admin/legacy/components/AssetDialog/BrowseStep/Filters.mjs.map +1 -1
  101. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js +7 -6
  102. package/dist/admin/legacy/components/AssetGridList/AssetGridList.js.map +1 -1
  103. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs +7 -6
  104. package/dist/admin/legacy/components/AssetGridList/AssetGridList.mjs.map +1 -1
  105. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js +2 -1
  106. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  107. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +2 -1
  108. package/dist/admin/legacy/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  109. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js +2 -1
  110. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  111. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs +2 -1
  112. package/dist/admin/legacy/components/BulkMoveDialog/BulkMoveDialog.mjs.map +1 -1
  113. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js +3 -1
  114. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  115. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs +3 -1
  116. package/dist/admin/legacy/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  117. package/dist/admin/legacy/components/FilterList/FilterList.js.map +1 -1
  118. package/dist/admin/legacy/components/FilterList/FilterList.mjs.map +1 -1
  119. package/dist/admin/legacy/components/FilterPopover/FilterPopover.js.map +1 -1
  120. package/dist/admin/legacy/components/FilterPopover/FilterPopover.mjs.map +1 -1
  121. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js +2 -1
  122. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.js.map +1 -1
  123. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs +2 -1
  124. package/dist/admin/legacy/components/FilterPopover/FilterValueInput.mjs.map +1 -1
  125. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js +4 -2
  126. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  127. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs +4 -2
  128. package/dist/admin/legacy/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  129. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js +2 -1
  130. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  131. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs +2 -1
  132. package/dist/admin/legacy/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  133. package/dist/admin/legacy/components/SelectTree/SelectTree.js +3 -1
  134. package/dist/admin/legacy/components/SelectTree/SelectTree.js.map +1 -1
  135. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs +3 -1
  136. package/dist/admin/legacy/components/SelectTree/SelectTree.mjs.map +1 -1
  137. package/dist/admin/legacy/components/TableList/TableList.js +3 -1
  138. package/dist/admin/legacy/components/TableList/TableList.js.map +1 -1
  139. package/dist/admin/legacy/components/TableList/TableList.mjs +3 -1
  140. package/dist/admin/legacy/components/TableList/TableList.mjs.map +1 -1
  141. package/dist/admin/legacy/components/TableList/TableRows.js +3 -1
  142. package/dist/admin/legacy/components/TableList/TableRows.js.map +1 -1
  143. package/dist/admin/legacy/components/TableList/TableRows.mjs +3 -1
  144. package/dist/admin/legacy/components/TableList/TableRows.mjs.map +1 -1
  145. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js +3 -1
  146. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  147. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs +3 -1
  148. package/dist/admin/legacy/components/UploadAssetDialog/UploadAssetDialog.mjs.map +1 -1
  149. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  150. package/dist/admin/legacy/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  151. package/dist/admin/legacy/pages/App/components/BulkActions.js +2 -1
  152. package/dist/admin/legacy/pages/App/components/BulkActions.js.map +1 -1
  153. package/dist/admin/legacy/pages/App/components/BulkActions.mjs +2 -1
  154. package/dist/admin/legacy/pages/App/components/BulkActions.mjs.map +1 -1
  155. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js +2 -1
  156. package/dist/admin/legacy/pages/App/components/BulkMoveButton.js.map +1 -1
  157. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs +2 -1
  158. package/dist/admin/legacy/pages/App/components/BulkMoveButton.mjs.map +1 -1
  159. package/dist/admin/pages/Assets/AssetsPage.js +13 -302
  160. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  161. package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
  162. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  163. package/dist/admin/pages/Assets/components/AssetsGrid.js +143 -31
  164. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  165. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +146 -34
  166. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  167. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  168. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  169. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  170. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  171. package/dist/admin/pages/Assets/components/AssetsTable.js +60 -35
  172. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  173. package/dist/admin/pages/Assets/components/AssetsTable.mjs +62 -37
  174. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  175. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  176. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  177. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  178. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  179. package/dist/admin/pages/Assets/components/BulkActionsBar.js +3 -1
  180. package/dist/admin/pages/Assets/components/BulkActionsBar.js.map +1 -1
  181. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +4 -2
  182. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  183. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  184. package/dist/admin/pages/Assets/components/DateRangeCalendar.js +10 -7
  185. package/dist/admin/pages/Assets/components/DateRangeCalendar.js.map +1 -1
  186. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs +10 -7
  187. package/dist/admin/pages/Assets/components/DateRangeCalendar.mjs.map +1 -1
  188. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  189. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  190. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  191. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  192. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  193. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  194. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  195. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  196. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  197. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  198. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  199. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  200. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  201. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  202. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  203. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  204. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  205. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js +4 -2
  206. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  207. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +5 -3
  208. package/dist/admin/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  209. package/dist/admin/pages/Assets/components/FilterBadges.js +32 -3
  210. package/dist/admin/pages/Assets/components/FilterBadges.js.map +1 -1
  211. package/dist/admin/pages/Assets/components/FilterBadges.mjs +35 -6
  212. package/dist/admin/pages/Assets/components/FilterBadges.mjs.map +1 -1
  213. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  214. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  215. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  216. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  217. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  218. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  219. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  220. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  221. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  222. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  223. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  224. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  225. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  226. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  227. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  228. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  229. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  230. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  231. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  232. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  233. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  234. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  235. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  236. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  237. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  238. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  239. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  240. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  241. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  242. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  243. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  244. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  245. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  246. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  247. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  248. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  249. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  250. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  251. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  252. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  253. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  254. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  255. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  256. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  257. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  258. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  259. package/dist/admin/services/api.js +106 -11
  260. package/dist/admin/services/api.js.map +1 -1
  261. package/dist/admin/services/api.mjs +105 -13
  262. package/dist/admin/services/api.mjs.map +1 -1
  263. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  264. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  265. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  266. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  267. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  268. package/dist/admin/src/components/MediaLibraryInput/AddAssetMenu.d.ts +19 -0
  269. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  270. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  271. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +21 -0
  272. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  273. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +25 -0
  274. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  275. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +28 -0
  276. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  277. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  278. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +3 -0
  279. package/dist/admin/src/legacy/components/BulkMoveDialog/BulkMoveDialog.d.ts +1 -1
  280. package/dist/admin/src/legacy/pages/App/components/BulkActions.d.ts +1 -1
  281. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  282. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  283. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  284. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  285. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  286. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  287. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  288. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  289. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  290. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  291. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  292. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  293. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  294. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  295. package/dist/admin/src/services/api.d.ts +30 -1
  296. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  297. package/dist/admin/src/utils/allowedMediaTypes.d.ts +16 -0
  298. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  299. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  300. package/dist/admin/store/uploadProgress.js +30 -3
  301. package/dist/admin/store/uploadProgress.js.map +1 -1
  302. package/dist/admin/store/uploadProgress.mjs +29 -4
  303. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  304. package/dist/admin/translations/ca.json.js +3 -3
  305. package/dist/admin/translations/ca.json.mjs +3 -3
  306. package/dist/admin/translations/da.json.js +1 -1
  307. package/dist/admin/translations/da.json.mjs +1 -1
  308. package/dist/admin/translations/de.json.js +1 -1
  309. package/dist/admin/translations/de.json.mjs +1 -1
  310. package/dist/admin/translations/en.json.js +29 -0
  311. package/dist/admin/translations/en.json.js.map +1 -1
  312. package/dist/admin/translations/en.json.mjs +29 -0
  313. package/dist/admin/translations/en.json.mjs.map +1 -1
  314. package/dist/admin/translations/es.json.js +1 -1
  315. package/dist/admin/translations/es.json.mjs +1 -1
  316. package/dist/admin/translations/sk.json.js +2 -2
  317. package/dist/admin/translations/sk.json.mjs +2 -2
  318. package/dist/admin/translations/tr.json.js +2 -2
  319. package/dist/admin/translations/tr.json.mjs +2 -2
  320. package/dist/admin/translations/zh-Hans.json.js +1 -1
  321. package/dist/admin/translations/zh-Hans.json.mjs +1 -1
  322. package/dist/admin/translations/zh.json.js +2 -2
  323. package/dist/admin/translations/zh.json.mjs +2 -2
  324. package/dist/admin/utils/allowedMediaTypes.js +42 -0
  325. package/dist/admin/utils/allowedMediaTypes.js.map +1 -0
  326. package/dist/admin/utils/allowedMediaTypes.mjs +39 -0
  327. package/dist/admin/utils/allowedMediaTypes.mjs.map +1 -0
  328. package/dist/admin/utils/findFolderPath.js +26 -0
  329. package/dist/admin/utils/findFolderPath.js.map +1 -0
  330. package/dist/admin/utils/findFolderPath.mjs +24 -0
  331. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  332. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  333. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  334. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  335. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  336. package/dist/server/config.js +6 -0
  337. package/dist/server/config.js.map +1 -1
  338. package/dist/server/config.mjs +6 -0
  339. package/dist/server/config.mjs.map +1 -1
  340. package/dist/server/controllers/admin-settings.js +5 -1
  341. package/dist/server/controllers/admin-settings.js.map +1 -1
  342. package/dist/server/controllers/admin-settings.mjs +5 -1
  343. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  344. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  345. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  346. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  347. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  348. package/dist/server/mcp/ambient-instance.js +7 -5
  349. package/dist/server/mcp/ambient-instance.js.map +1 -1
  350. package/dist/server/mcp/ambient-instance.mjs +7 -5
  351. package/dist/server/mcp/ambient-instance.mjs.map +1 -1
  352. package/dist/server/mcp/handlers/folder-handlers.js +4 -16
  353. package/dist/server/mcp/handlers/folder-handlers.js.map +1 -1
  354. package/dist/server/mcp/handlers/folder-handlers.mjs +5 -17
  355. package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -1
  356. package/dist/server/mcp/handlers/read-handlers.js +6 -14
  357. package/dist/server/mcp/handlers/read-handlers.js.map +1 -1
  358. package/dist/server/mcp/handlers/read-handlers.mjs +7 -15
  359. package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -1
  360. package/dist/server/mcp/handlers/write-handlers.js +3 -13
  361. package/dist/server/mcp/handlers/write-handlers.js.map +1 -1
  362. package/dist/server/mcp/handlers/write-handlers.mjs +3 -13
  363. package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -1
  364. package/dist/server/mcp/register-upload-mcp-tools.js +215 -195
  365. package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -1
  366. package/dist/server/mcp/register-upload-mcp-tools.mjs +215 -195
  367. package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -1
  368. package/dist/server/services/image-manipulation.js +35 -16
  369. package/dist/server/services/image-manipulation.js.map +1 -1
  370. package/dist/server/services/image-manipulation.mjs +35 -16
  371. package/dist/server/services/image-manipulation.mjs.map +1 -1
  372. package/dist/server/services/upload.js.map +1 -1
  373. package/dist/server/services/upload.mjs.map +1 -1
  374. package/dist/server/src/config.d.ts +3 -0
  375. package/dist/server/src/config.d.ts.map +1 -1
  376. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  377. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  378. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  379. package/dist/server/src/index.d.ts +4 -1
  380. package/dist/server/src/index.d.ts.map +1 -1
  381. package/dist/server/src/mcp/ambient-instance.d.ts +7 -5
  382. package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -1
  383. package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -1
  384. package/dist/server/src/mcp/handlers/read-handlers.d.ts +3 -2
  385. package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -1
  386. package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -1
  387. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +9 -14
  388. package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -1
  389. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  390. package/dist/server/src/services/image-manipulation.d.ts +1 -1
  391. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  392. package/dist/server/src/services/index.d.ts +1 -1
  393. package/dist/server/src/types.d.ts +64 -12
  394. package/dist/server/src/types.d.ts.map +1 -1
  395. package/package.json +8 -6
@@ -0,0 +1,161 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var designSystem = require('@strapi/design-system');
7
+ var icons = require('@strapi/icons');
8
+ var reactIntl = require('react-intl');
9
+ var styledComponents = require('styled-components');
10
+ var translations = require('../../utils/translations.js');
11
+
12
+ /** Narrowest a card and the tile get side by side before stacking, in px. */ const MIN_CARD_WIDTH = 130;
13
+ /**
14
+ * Narrowest a card gets when two share the row, in px. Wider than the single
15
+ * card's, so the row drops to one card before names are cut to a few letters.
16
+ */ const MIN_CARD_WIDTH_FOR_TWO = 180;
17
+ const GAP = 16;
18
+ const MAX_CARDS = 2;
19
+ const Container = styledComponents.styled(designSystem.Box)`
20
+ background: ${({ theme })=>theme.colors.neutral100};
21
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
22
+ border-radius: ${({ theme })=>theme.borderRadius};
23
+ `;
24
+ const Track = styledComponents.styled.div`
25
+ display: grid;
26
+ grid-template-columns: repeat(${({ $columns })=>$columns}, minmax(0, 1fr));
27
+ gap: ${GAP}px;
28
+ `;
29
+ const Cards = styledComponents.styled.div`
30
+ position: relative;
31
+ display: grid;
32
+ grid-column: span ${({ $columns })=>$columns};
33
+ grid-template-columns: repeat(${({ $columns })=>$columns}, minmax(0, 1fr));
34
+ gap: ${GAP}px;
35
+ `;
36
+ const Arrow = styledComponents.styled(designSystem.Box)`
37
+ position: absolute;
38
+ top: 50%;
39
+ transform: translateY(-50%);
40
+ z-index: 1;
41
+ ${({ $side })=>$side === 'start' ? 'left: -1.6rem;' : 'right: -1.6rem;'}
42
+
43
+ button {
44
+ border-radius: 50%;
45
+ box-shadow: ${({ theme })=>theme.shadows.filterShadow};
46
+ }
47
+ `;
48
+ /**
49
+ * How the row fits the field. The edit layout's size sets it: a third of the
50
+ * form stacks one card over the drop zone, a full-width field shows two cards
51
+ * beside it, anything in between one. Mobile always shows one card, stacked on
52
+ * a phone. The measured width can only take cards away, for a field squeezed
53
+ * by a narrow component.
54
+ */ const getRowLayout = ({ width, layoutSize, isMobile, isPhone })=>{
55
+ const isNarrowLayout = isPhone || layoutSize !== undefined && layoutSize <= 4;
56
+ const maxCards = isMobile || layoutSize !== undefined && layoutSize < 12 ? 1 : MAX_CARDS;
57
+ // Unmeasured: no layout yet, or no `ResizeObserver`.
58
+ const isMeasured = width > 0;
59
+ const fitsCardAndTile = !isMeasured || width >= 2 * MIN_CARD_WIDTH + GAP;
60
+ const fitsTwoCardsAndTile = !isMeasured || width >= 3 * MIN_CARD_WIDTH_FOR_TWO + 2 * GAP;
61
+ if (isNarrowLayout || !fitsCardAndTile) {
62
+ return {
63
+ cards: 1,
64
+ isStacked: true
65
+ };
66
+ }
67
+ return {
68
+ cards: fitsTwoCardsAndTile ? maxCards : 1,
69
+ isStacked: false
70
+ };
71
+ };
72
+ /**
73
+ * A single row of cards followed by the drop tile. When the field holds more
74
+ * than fit, arrows page through the cards and the tile stays put.
75
+ */ const AssetCarousel = ({ children, renderDropZone, layoutSize })=>{
76
+ const { formatMessage } = reactIntl.useIntl();
77
+ const theme = styledComponents.useTheme();
78
+ const isMobile = strapiAdmin.useIsMobile();
79
+ const isPhone = !strapiAdmin.useMediaQuery(theme.breakpoints.small);
80
+ const trackRef = React.useRef(null);
81
+ const [width, setWidth] = React.useState(0);
82
+ const [start, setStart] = React.useState(0);
83
+ const cards = React.Children.toArray(children);
84
+ const { cards: cardsPerRow, isStacked } = getRowLayout({
85
+ width,
86
+ layoutSize,
87
+ isMobile,
88
+ isPhone
89
+ });
90
+ const maxStart = Math.max(cards.length - cardsPerRow, 0);
91
+ const firstVisible = Math.min(start, maxStart);
92
+ // Fewer cards than fit leave the tile right after them, not at the far end.
93
+ const visibleCount = Math.min(cards.length, cardsPerRow);
94
+ React.useLayoutEffect(()=>{
95
+ const track = trackRef.current;
96
+ if (!track || typeof ResizeObserver === 'undefined') {
97
+ return undefined;
98
+ }
99
+ const observer = new ResizeObserver(([entry])=>setWidth(entry.contentRect.width));
100
+ observer.observe(track);
101
+ return ()=>observer.disconnect();
102
+ }, []);
103
+ // A card added at the end (a new upload) is scrolled into view.
104
+ const previousCount = React.useRef(cards.length);
105
+ React.useEffect(()=>{
106
+ if (cards.length > previousCount.current) {
107
+ setStart(maxStart);
108
+ }
109
+ previousCount.current = cards.length;
110
+ }, [
111
+ cards.length,
112
+ maxStart
113
+ ]);
114
+ return /*#__PURE__*/ jsxRuntime.jsxs(Container, {
115
+ padding: 4,
116
+ children: [
117
+ /*#__PURE__*/ jsxRuntime.jsxs(Track, {
118
+ ref: trackRef,
119
+ $columns: isStacked ? 1 : cardsPerRow + 1,
120
+ children: [
121
+ /*#__PURE__*/ jsxRuntime.jsxs(Cards, {
122
+ $columns: visibleCount,
123
+ children: [
124
+ cards.slice(firstVisible, firstVisible + cardsPerRow),
125
+ firstVisible > 0 && /*#__PURE__*/ jsxRuntime.jsx(Arrow, {
126
+ $side: "start",
127
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
128
+ onClick: ()=>setStart(firstVisible - 1),
129
+ label: formatMessage({
130
+ id: translations.getTranslationKey('mediaLibraryInput.actions.previousSlide'),
131
+ defaultMessage: 'Previous slide'
132
+ }),
133
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronLeft, {})
134
+ })
135
+ }),
136
+ firstVisible < maxStart && /*#__PURE__*/ jsxRuntime.jsx(Arrow, {
137
+ $side: "end",
138
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
139
+ onClick: ()=>setStart(firstVisible + 1),
140
+ label: formatMessage({
141
+ id: translations.getTranslationKey('mediaLibraryInput.actions.nextSlide'),
142
+ defaultMessage: 'Next slide'
143
+ }),
144
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronRight, {})
145
+ })
146
+ })
147
+ ]
148
+ }),
149
+ !isStacked && renderDropZone('tile')
150
+ ]
151
+ }),
152
+ isStacked && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
153
+ paddingTop: 4,
154
+ children: renderDropZone('stacked')
155
+ })
156
+ ]
157
+ });
158
+ };
159
+
160
+ exports.AssetCarousel = AssetCarousel;
161
+ //# sourceMappingURL=AssetCarousel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCarousel.js","sources":["../../../../admin/src/components/MediaLibraryInput/AssetCarousel.tsx"],"sourcesContent":["import { Children, useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { useIsMobile, useMediaQuery } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTranslationKey } from '../../utils/translations';\n\nimport type { ZoneVariant } from './AssetDropZone';\n\n/** Narrowest a card and the tile get side by side before stacking, in px. */\nconst MIN_CARD_WIDTH = 130;\n/**\n * Narrowest a card gets when two share the row, in px. Wider than the single\n * card's, so the row drops to one card before names are cut to a few letters.\n */\nconst MIN_CARD_WIDTH_FOR_TWO = 180;\nconst GAP = 16;\nconst MAX_CARDS = 2;\n\nconst Container = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral100};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst Track = styled.div<{ $columns: number }>`\n display: grid;\n grid-template-columns: repeat(${({ $columns }) => $columns}, minmax(0, 1fr));\n gap: ${GAP}px;\n`;\n\nconst Cards = styled.div<{ $columns: number }>`\n position: relative;\n display: grid;\n grid-column: span ${({ $columns }) => $columns};\n grid-template-columns: repeat(${({ $columns }) => $columns}, minmax(0, 1fr));\n gap: ${GAP}px;\n`;\n\nconst Arrow = styled(Box)<{ $side: 'start' | 'end' }>`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n ${({ $side }) => ($side === 'start' ? 'left: -1.6rem;' : 'right: -1.6rem;')}\n\n button {\n border-radius: 50%;\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n }\n`;\n\ninterface RowLayout {\n /** Cards per row, the drop zone not included. */\n cards: number;\n /** Too narrow for a card and the tile side by side: the drop zone goes below. */\n isStacked: boolean;\n}\n\n/**\n * How the row fits the field. The edit layout's size sets it: a third of the\n * form stacks one card over the drop zone, a full-width field shows two cards\n * beside it, anything in between one. Mobile always shows one card, stacked on\n * a phone. The measured width can only take cards away, for a field squeezed\n * by a narrow component.\n */\nconst getRowLayout = ({\n width,\n layoutSize,\n isMobile,\n isPhone,\n}: {\n width: number;\n layoutSize?: number;\n /** Below the tablet breakpoint: one card, whatever the layout says. */\n isMobile: boolean;\n /** Below the small breakpoint: the drop zone goes under the card. */\n isPhone: boolean;\n}): RowLayout => {\n const isNarrowLayout = isPhone || (layoutSize !== undefined && layoutSize <= 4);\n const maxCards = isMobile || (layoutSize !== undefined && layoutSize < 12) ? 1 : MAX_CARDS;\n\n // Unmeasured: no layout yet, or no `ResizeObserver`.\n const isMeasured = width > 0;\n const fitsCardAndTile = !isMeasured || width >= 2 * MIN_CARD_WIDTH + GAP;\n const fitsTwoCardsAndTile = !isMeasured || width >= 3 * MIN_CARD_WIDTH_FOR_TWO + 2 * GAP;\n\n if (isNarrowLayout || !fitsCardAndTile) {\n return { cards: 1, isStacked: true };\n }\n\n return { cards: fitsTwoCardsAndTile ? maxCards : 1, isStacked: false };\n};\n\ninterface AssetCarouselProps {\n /** One card per asset or upload, in field order. */\n children: ReactNode;\n /** Always shown: after the cards, or below them on a narrow field. */\n renderDropZone: (variant: Exclude<ZoneVariant, 'bar'>) => ReactNode;\n /** The field's width in the edit layout, out of 12, when the host knows it. */\n layoutSize?: number;\n}\n\n/**\n * A single row of cards followed by the drop tile. When the field holds more\n * than fit, arrows page through the cards and the tile stays put.\n */\nexport const AssetCarousel = ({ children, renderDropZone, layoutSize }: AssetCarouselProps) => {\n const { formatMessage } = useIntl();\n const theme = useTheme();\n const isMobile = useIsMobile();\n const isPhone = !useMediaQuery(theme.breakpoints.small);\n const trackRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n const [start, setStart] = useState(0);\n\n const cards = Children.toArray(children);\n const { cards: cardsPerRow, isStacked } = getRowLayout({ width, layoutSize, isMobile, isPhone });\n const maxStart = Math.max(cards.length - cardsPerRow, 0);\n const firstVisible = Math.min(start, maxStart);\n // Fewer cards than fit leave the tile right after them, not at the far end.\n const visibleCount = Math.min(cards.length, cardsPerRow);\n\n useLayoutEffect(() => {\n const track = trackRef.current;\n\n if (!track || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(track);\n\n return () => observer.disconnect();\n }, []);\n\n // A card added at the end (a new upload) is scrolled into view.\n const previousCount = useRef(cards.length);\n useEffect(() => {\n if (cards.length > previousCount.current) {\n setStart(maxStart);\n }\n previousCount.current = cards.length;\n }, [cards.length, maxStart]);\n\n return (\n <Container padding={4}>\n <Track ref={trackRef} $columns={isStacked ? 1 : cardsPerRow + 1}>\n <Cards $columns={visibleCount}>\n {cards.slice(firstVisible, firstVisible + cardsPerRow)}\n\n {firstVisible > 0 && (\n <Arrow $side=\"start\">\n <IconButton\n onClick={() => setStart(firstVisible - 1)}\n label={formatMessage({\n id: getTranslationKey('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n >\n <ChevronLeft />\n </IconButton>\n </Arrow>\n )}\n\n {firstVisible < maxStart && (\n <Arrow $side=\"end\">\n <IconButton\n onClick={() => setStart(firstVisible + 1)}\n label={formatMessage({\n id: getTranslationKey('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n >\n <ChevronRight />\n </IconButton>\n </Arrow>\n )}\n </Cards>\n {!isStacked && renderDropZone('tile')}\n </Track>\n {isStacked && <Box paddingTop={4}>{renderDropZone('stacked')}</Box>}\n </Container>\n );\n};\n"],"names":["MIN_CARD_WIDTH","MIN_CARD_WIDTH_FOR_TWO","GAP","MAX_CARDS","Container","styled","Box","theme","colors","neutral100","neutral200","borderRadius","Track","div","$columns","Cards","Arrow","$side","shadows","filterShadow","getRowLayout","width","layoutSize","isMobile","isPhone","isNarrowLayout","undefined","maxCards","isMeasured","fitsCardAndTile","fitsTwoCardsAndTile","cards","isStacked","AssetCarousel","children","renderDropZone","formatMessage","useIntl","useTheme","useIsMobile","useMediaQuery","breakpoints","small","trackRef","useRef","setWidth","useState","start","setStart","Children","toArray","cardsPerRow","maxStart","Math","max","length","firstVisible","min","visibleCount","useLayoutEffect","track","current","ResizeObserver","observer","entry","contentRect","observe","disconnect","previousCount","useEffect","_jsxs","padding","ref","slice","_jsx","IconButton","onClick","label","id","getTranslationKey","defaultMessage","ChevronLeft","ChevronRight","paddingTop"],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useRef, useState, Children, useLayoutEffect, useEffect } from 'react';
3
+ import { useIsMobile, useMediaQuery } from '@strapi/admin/strapi-admin';
4
+ import { Box, IconButton } from '@strapi/design-system';
5
+ import { ChevronLeft, ChevronRight } from '@strapi/icons';
6
+ import { useIntl } from 'react-intl';
7
+ import { styled, useTheme } from 'styled-components';
8
+ import { getTranslationKey } from '../../utils/translations.mjs';
9
+
10
+ /** Narrowest a card and the tile get side by side before stacking, in px. */ const MIN_CARD_WIDTH = 130;
11
+ /**
12
+ * Narrowest a card gets when two share the row, in px. Wider than the single
13
+ * card's, so the row drops to one card before names are cut to a few letters.
14
+ */ const MIN_CARD_WIDTH_FOR_TWO = 180;
15
+ const GAP = 16;
16
+ const MAX_CARDS = 2;
17
+ const Container = styled(Box)`
18
+ background: ${({ theme })=>theme.colors.neutral100};
19
+ border: 1px solid ${({ theme })=>theme.colors.neutral200};
20
+ border-radius: ${({ theme })=>theme.borderRadius};
21
+ `;
22
+ const Track = styled.div`
23
+ display: grid;
24
+ grid-template-columns: repeat(${({ $columns })=>$columns}, minmax(0, 1fr));
25
+ gap: ${GAP}px;
26
+ `;
27
+ const Cards = styled.div`
28
+ position: relative;
29
+ display: grid;
30
+ grid-column: span ${({ $columns })=>$columns};
31
+ grid-template-columns: repeat(${({ $columns })=>$columns}, minmax(0, 1fr));
32
+ gap: ${GAP}px;
33
+ `;
34
+ const Arrow = styled(Box)`
35
+ position: absolute;
36
+ top: 50%;
37
+ transform: translateY(-50%);
38
+ z-index: 1;
39
+ ${({ $side })=>$side === 'start' ? 'left: -1.6rem;' : 'right: -1.6rem;'}
40
+
41
+ button {
42
+ border-radius: 50%;
43
+ box-shadow: ${({ theme })=>theme.shadows.filterShadow};
44
+ }
45
+ `;
46
+ /**
47
+ * How the row fits the field. The edit layout's size sets it: a third of the
48
+ * form stacks one card over the drop zone, a full-width field shows two cards
49
+ * beside it, anything in between one. Mobile always shows one card, stacked on
50
+ * a phone. The measured width can only take cards away, for a field squeezed
51
+ * by a narrow component.
52
+ */ const getRowLayout = ({ width, layoutSize, isMobile, isPhone })=>{
53
+ const isNarrowLayout = isPhone || layoutSize !== undefined && layoutSize <= 4;
54
+ const maxCards = isMobile || layoutSize !== undefined && layoutSize < 12 ? 1 : MAX_CARDS;
55
+ // Unmeasured: no layout yet, or no `ResizeObserver`.
56
+ const isMeasured = width > 0;
57
+ const fitsCardAndTile = !isMeasured || width >= 2 * MIN_CARD_WIDTH + GAP;
58
+ const fitsTwoCardsAndTile = !isMeasured || width >= 3 * MIN_CARD_WIDTH_FOR_TWO + 2 * GAP;
59
+ if (isNarrowLayout || !fitsCardAndTile) {
60
+ return {
61
+ cards: 1,
62
+ isStacked: true
63
+ };
64
+ }
65
+ return {
66
+ cards: fitsTwoCardsAndTile ? maxCards : 1,
67
+ isStacked: false
68
+ };
69
+ };
70
+ /**
71
+ * A single row of cards followed by the drop tile. When the field holds more
72
+ * than fit, arrows page through the cards and the tile stays put.
73
+ */ const AssetCarousel = ({ children, renderDropZone, layoutSize })=>{
74
+ const { formatMessage } = useIntl();
75
+ const theme = useTheme();
76
+ const isMobile = useIsMobile();
77
+ const isPhone = !useMediaQuery(theme.breakpoints.small);
78
+ const trackRef = useRef(null);
79
+ const [width, setWidth] = useState(0);
80
+ const [start, setStart] = useState(0);
81
+ const cards = Children.toArray(children);
82
+ const { cards: cardsPerRow, isStacked } = getRowLayout({
83
+ width,
84
+ layoutSize,
85
+ isMobile,
86
+ isPhone
87
+ });
88
+ const maxStart = Math.max(cards.length - cardsPerRow, 0);
89
+ const firstVisible = Math.min(start, maxStart);
90
+ // Fewer cards than fit leave the tile right after them, not at the far end.
91
+ const visibleCount = Math.min(cards.length, cardsPerRow);
92
+ useLayoutEffect(()=>{
93
+ const track = trackRef.current;
94
+ if (!track || typeof ResizeObserver === 'undefined') {
95
+ return undefined;
96
+ }
97
+ const observer = new ResizeObserver(([entry])=>setWidth(entry.contentRect.width));
98
+ observer.observe(track);
99
+ return ()=>observer.disconnect();
100
+ }, []);
101
+ // A card added at the end (a new upload) is scrolled into view.
102
+ const previousCount = useRef(cards.length);
103
+ useEffect(()=>{
104
+ if (cards.length > previousCount.current) {
105
+ setStart(maxStart);
106
+ }
107
+ previousCount.current = cards.length;
108
+ }, [
109
+ cards.length,
110
+ maxStart
111
+ ]);
112
+ return /*#__PURE__*/ jsxs(Container, {
113
+ padding: 4,
114
+ children: [
115
+ /*#__PURE__*/ jsxs(Track, {
116
+ ref: trackRef,
117
+ $columns: isStacked ? 1 : cardsPerRow + 1,
118
+ children: [
119
+ /*#__PURE__*/ jsxs(Cards, {
120
+ $columns: visibleCount,
121
+ children: [
122
+ cards.slice(firstVisible, firstVisible + cardsPerRow),
123
+ firstVisible > 0 && /*#__PURE__*/ jsx(Arrow, {
124
+ $side: "start",
125
+ children: /*#__PURE__*/ jsx(IconButton, {
126
+ onClick: ()=>setStart(firstVisible - 1),
127
+ label: formatMessage({
128
+ id: getTranslationKey('mediaLibraryInput.actions.previousSlide'),
129
+ defaultMessage: 'Previous slide'
130
+ }),
131
+ children: /*#__PURE__*/ jsx(ChevronLeft, {})
132
+ })
133
+ }),
134
+ firstVisible < maxStart && /*#__PURE__*/ jsx(Arrow, {
135
+ $side: "end",
136
+ children: /*#__PURE__*/ jsx(IconButton, {
137
+ onClick: ()=>setStart(firstVisible + 1),
138
+ label: formatMessage({
139
+ id: getTranslationKey('mediaLibraryInput.actions.nextSlide'),
140
+ defaultMessage: 'Next slide'
141
+ }),
142
+ children: /*#__PURE__*/ jsx(ChevronRight, {})
143
+ })
144
+ })
145
+ ]
146
+ }),
147
+ !isStacked && renderDropZone('tile')
148
+ ]
149
+ }),
150
+ isStacked && /*#__PURE__*/ jsx(Box, {
151
+ paddingTop: 4,
152
+ children: renderDropZone('stacked')
153
+ })
154
+ ]
155
+ });
156
+ };
157
+
158
+ export { AssetCarousel };
159
+ //# sourceMappingURL=AssetCarousel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetCarousel.mjs","sources":["../../../../admin/src/components/MediaLibraryInput/AssetCarousel.tsx"],"sourcesContent":["import { Children, useEffect, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { useIsMobile, useMediaQuery } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton } from '@strapi/design-system';\nimport { ChevronLeft, ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, useTheme } from 'styled-components';\n\nimport { getTranslationKey } from '../../utils/translations';\n\nimport type { ZoneVariant } from './AssetDropZone';\n\n/** Narrowest a card and the tile get side by side before stacking, in px. */\nconst MIN_CARD_WIDTH = 130;\n/**\n * Narrowest a card gets when two share the row, in px. Wider than the single\n * card's, so the row drops to one card before names are cut to a few letters.\n */\nconst MIN_CARD_WIDTH_FOR_TWO = 180;\nconst GAP = 16;\nconst MAX_CARDS = 2;\n\nconst Container = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral100};\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\nconst Track = styled.div<{ $columns: number }>`\n display: grid;\n grid-template-columns: repeat(${({ $columns }) => $columns}, minmax(0, 1fr));\n gap: ${GAP}px;\n`;\n\nconst Cards = styled.div<{ $columns: number }>`\n position: relative;\n display: grid;\n grid-column: span ${({ $columns }) => $columns};\n grid-template-columns: repeat(${({ $columns }) => $columns}, minmax(0, 1fr));\n gap: ${GAP}px;\n`;\n\nconst Arrow = styled(Box)<{ $side: 'start' | 'end' }>`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 1;\n ${({ $side }) => ($side === 'start' ? 'left: -1.6rem;' : 'right: -1.6rem;')}\n\n button {\n border-radius: 50%;\n box-shadow: ${({ theme }) => theme.shadows.filterShadow};\n }\n`;\n\ninterface RowLayout {\n /** Cards per row, the drop zone not included. */\n cards: number;\n /** Too narrow for a card and the tile side by side: the drop zone goes below. */\n isStacked: boolean;\n}\n\n/**\n * How the row fits the field. The edit layout's size sets it: a third of the\n * form stacks one card over the drop zone, a full-width field shows two cards\n * beside it, anything in between one. Mobile always shows one card, stacked on\n * a phone. The measured width can only take cards away, for a field squeezed\n * by a narrow component.\n */\nconst getRowLayout = ({\n width,\n layoutSize,\n isMobile,\n isPhone,\n}: {\n width: number;\n layoutSize?: number;\n /** Below the tablet breakpoint: one card, whatever the layout says. */\n isMobile: boolean;\n /** Below the small breakpoint: the drop zone goes under the card. */\n isPhone: boolean;\n}): RowLayout => {\n const isNarrowLayout = isPhone || (layoutSize !== undefined && layoutSize <= 4);\n const maxCards = isMobile || (layoutSize !== undefined && layoutSize < 12) ? 1 : MAX_CARDS;\n\n // Unmeasured: no layout yet, or no `ResizeObserver`.\n const isMeasured = width > 0;\n const fitsCardAndTile = !isMeasured || width >= 2 * MIN_CARD_WIDTH + GAP;\n const fitsTwoCardsAndTile = !isMeasured || width >= 3 * MIN_CARD_WIDTH_FOR_TWO + 2 * GAP;\n\n if (isNarrowLayout || !fitsCardAndTile) {\n return { cards: 1, isStacked: true };\n }\n\n return { cards: fitsTwoCardsAndTile ? maxCards : 1, isStacked: false };\n};\n\ninterface AssetCarouselProps {\n /** One card per asset or upload, in field order. */\n children: ReactNode;\n /** Always shown: after the cards, or below them on a narrow field. */\n renderDropZone: (variant: Exclude<ZoneVariant, 'bar'>) => ReactNode;\n /** The field's width in the edit layout, out of 12, when the host knows it. */\n layoutSize?: number;\n}\n\n/**\n * A single row of cards followed by the drop tile. When the field holds more\n * than fit, arrows page through the cards and the tile stays put.\n */\nexport const AssetCarousel = ({ children, renderDropZone, layoutSize }: AssetCarouselProps) => {\n const { formatMessage } = useIntl();\n const theme = useTheme();\n const isMobile = useIsMobile();\n const isPhone = !useMediaQuery(theme.breakpoints.small);\n const trackRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n const [start, setStart] = useState(0);\n\n const cards = Children.toArray(children);\n const { cards: cardsPerRow, isStacked } = getRowLayout({ width, layoutSize, isMobile, isPhone });\n const maxStart = Math.max(cards.length - cardsPerRow, 0);\n const firstVisible = Math.min(start, maxStart);\n // Fewer cards than fit leave the tile right after them, not at the far end.\n const visibleCount = Math.min(cards.length, cardsPerRow);\n\n useLayoutEffect(() => {\n const track = trackRef.current;\n\n if (!track || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(track);\n\n return () => observer.disconnect();\n }, []);\n\n // A card added at the end (a new upload) is scrolled into view.\n const previousCount = useRef(cards.length);\n useEffect(() => {\n if (cards.length > previousCount.current) {\n setStart(maxStart);\n }\n previousCount.current = cards.length;\n }, [cards.length, maxStart]);\n\n return (\n <Container padding={4}>\n <Track ref={trackRef} $columns={isStacked ? 1 : cardsPerRow + 1}>\n <Cards $columns={visibleCount}>\n {cards.slice(firstVisible, firstVisible + cardsPerRow)}\n\n {firstVisible > 0 && (\n <Arrow $side=\"start\">\n <IconButton\n onClick={() => setStart(firstVisible - 1)}\n label={formatMessage({\n id: getTranslationKey('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n >\n <ChevronLeft />\n </IconButton>\n </Arrow>\n )}\n\n {firstVisible < maxStart && (\n <Arrow $side=\"end\">\n <IconButton\n onClick={() => setStart(firstVisible + 1)}\n label={formatMessage({\n id: getTranslationKey('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n >\n <ChevronRight />\n </IconButton>\n </Arrow>\n )}\n </Cards>\n {!isStacked && renderDropZone('tile')}\n </Track>\n {isStacked && <Box paddingTop={4}>{renderDropZone('stacked')}</Box>}\n </Container>\n );\n};\n"],"names":["MIN_CARD_WIDTH","MIN_CARD_WIDTH_FOR_TWO","GAP","MAX_CARDS","Container","styled","Box","theme","colors","neutral100","neutral200","borderRadius","Track","div","$columns","Cards","Arrow","$side","shadows","filterShadow","getRowLayout","width","layoutSize","isMobile","isPhone","isNarrowLayout","undefined","maxCards","isMeasured","fitsCardAndTile","fitsTwoCardsAndTile","cards","isStacked","AssetCarousel","children","renderDropZone","formatMessage","useIntl","useTheme","useIsMobile","useMediaQuery","breakpoints","small","trackRef","useRef","setWidth","useState","start","setStart","Children","toArray","cardsPerRow","maxStart","Math","max","length","firstVisible","min","visibleCount","useLayoutEffect","track","current","ResizeObserver","observer","entry","contentRect","observe","disconnect","previousCount","useEffect","_jsxs","padding","ref","slice","_jsx","IconButton","onClick","label","id","getTranslationKey","defaultMessage","ChevronLeft","ChevronRight","paddingTop"],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var designSystem = require('@strapi/design-system');
6
+ var icons = require('@strapi/icons');
7
+ var reactIntl = require('react-intl');
8
+ var styledComponents = require('styled-components');
9
+ var translations = require('../../utils/translations.js');
10
+
11
+ const DRAG_FRAME_COLORS = {
12
+ accept: {
13
+ border: 'primary600',
14
+ background: 'primary100'
15
+ },
16
+ reject: {
17
+ border: 'neutral300',
18
+ background: 'neutral150'
19
+ }
20
+ };
21
+ const Zone = styledComponents.styled.div`
22
+ position: relative;
23
+ display: flex;
24
+ align-items: center;
25
+ gap: ${({ theme })=>theme.spaces[4]};
26
+ width: 100%;
27
+ border-radius: ${({ theme })=>theme.borderRadius};
28
+ text-align: ${({ $variant })=>$variant === 'bar' ? 'start' : 'center'};
29
+
30
+ ${({ $variant, theme })=>$variant !== 'bar' ? `
31
+ flex-direction: column;
32
+ justify-content: center;
33
+ height: 100%;
34
+ min-height: ${$variant === 'tile' ? '20.8rem' : 'auto'};
35
+ padding: ${theme.spaces[4]};
36
+ border: 1px dashed ${theme.colors.neutral300};
37
+ background: ${theme.colors.neutral0};
38
+ ` : `
39
+ min-height: 7.2rem;
40
+ padding: ${theme.spaces[4]};
41
+ border: 1px solid ${theme.colors.neutral200};
42
+ background: ${theme.colors.neutral100};
43
+ `}
44
+
45
+ // Only while a file is dragged over the zone: a solid frame inset from the
46
+ // zone's own border marks where the file will land, greyed out when it can't.
47
+ ${({ $dragState, theme })=>$dragState !== 'idle' && `
48
+ &::after {
49
+ content: '';
50
+ position: absolute;
51
+ inset: ${theme.spaces[2]};
52
+ border: 1px solid ${theme.colors[DRAG_FRAME_COLORS[$dragState].border]};
53
+ border-radius: ${theme.borderRadius};
54
+ background: ${theme.colors[DRAG_FRAME_COLORS[$dragState].background]};
55
+ pointer-events: none;
56
+ }
57
+
58
+ & > * {
59
+ z-index: 1;
60
+ }
61
+ `}
62
+
63
+ &[data-disabled='true'] {
64
+ cursor: not-allowed;
65
+ }
66
+ `;
67
+ const IconFrame = styledComponents.styled(designSystem.Flex)`
68
+ flex-shrink: 0;
69
+ width: 4rem;
70
+ height: 4rem;
71
+ border-radius: ${({ theme })=>theme.borderRadius};
72
+ background: ${({ theme })=>theme.colors.neutral200};
73
+ color: ${({ theme })=>theme.colors.neutral500};
74
+ `;
75
+ /**
76
+ * The field's own drop target. It only takes drops: browsing and picking files
77
+ * go through the "Add asset" menu, so the field has one way in, not two.
78
+ *
79
+ * Deliberately not the Media Library page's
80
+ * `UploadDropZoneProvider`: that one covers a whole route and paints a
81
+ * full-surface overlay, where this has to stay inside one field on a form that
82
+ * may hold several of them.
83
+ */ const AssetDropZone = ({ variant = 'bar', disabled = false, onDropFiles })=>{
84
+ const { formatMessage } = reactIntl.useIntl();
85
+ const [isDragging, setIsDragging] = React.useState(false);
86
+ // Drag events fire on descendants too, so a plain boolean flickers as the
87
+ // pointer crosses the icon or the label. Counting enter/leave pairs doesn't.
88
+ const dragDepth = React.useRef(0);
89
+ const handleDragEnter = React.useCallback((event)=>{
90
+ event.preventDefault();
91
+ if (!event.dataTransfer.types.includes('Files')) {
92
+ return;
93
+ }
94
+ dragDepth.current += 1;
95
+ setIsDragging(true);
96
+ }, []);
97
+ const handleDragLeave = React.useCallback((event)=>{
98
+ event.preventDefault();
99
+ dragDepth.current -= 1;
100
+ if (dragDepth.current <= 0) {
101
+ dragDepth.current = 0;
102
+ setIsDragging(false);
103
+ }
104
+ }, []);
105
+ const handleDragOver = React.useCallback((event)=>{
106
+ event.preventDefault();
107
+ // `none` shows the no-drop cursor, and the browser then fires no `drop`.
108
+ event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';
109
+ }, [
110
+ disabled
111
+ ]);
112
+ const handleDrop = React.useCallback((event)=>{
113
+ event.preventDefault();
114
+ dragDepth.current = 0;
115
+ setIsDragging(false);
116
+ if (disabled) {
117
+ return;
118
+ }
119
+ const files = Array.from(event.dataTransfer.files ?? []);
120
+ if (files.length > 0) {
121
+ onDropFiles(files);
122
+ }
123
+ }, [
124
+ disabled,
125
+ onDropFiles
126
+ ]);
127
+ return /*#__PURE__*/ jsxRuntime.jsxs(Zone, {
128
+ $dragState: isDragging ? disabled ? 'reject' : 'accept' : 'idle',
129
+ $variant: variant,
130
+ "data-disabled": disabled,
131
+ onDragEnter: handleDragEnter,
132
+ onDragLeave: handleDragLeave,
133
+ onDragOver: handleDragOver,
134
+ onDrop: handleDrop,
135
+ children: [
136
+ /*#__PURE__*/ jsxRuntime.jsx(IconFrame, {
137
+ justifyContent: "center",
138
+ alignItems: "center",
139
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Images, {
140
+ width: "2.4rem",
141
+ height: "2.4rem"
142
+ })
143
+ }),
144
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
145
+ textColor: "neutral600",
146
+ children: formatMessage({
147
+ id: translations.getTranslationKey('content-manager.input.placeholder'),
148
+ defaultMessage: 'Drag & drop an asset here'
149
+ })
150
+ })
151
+ ]
152
+ });
153
+ };
154
+
155
+ exports.AssetDropZone = AssetDropZone;
156
+ //# sourceMappingURL=AssetDropZone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssetDropZone.js","sources":["../../../../admin/src/components/MediaLibraryInput/AssetDropZone.tsx"],"sourcesContent":["import { useCallback, useRef, useState, type DragEvent } from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { Images } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../utils/translations';\n\n/**\n * `bar` on an empty field, `tile` after a multiple field's cards, `stacked`\n * below them when the field is too narrow for both on one row.\n */\nexport type ZoneVariant = 'bar' | 'tile' | 'stacked';\n\ntype DragState = 'idle' | 'accept' | 'reject';\n\nconst DRAG_FRAME_COLORS = {\n accept: { border: 'primary600', background: 'primary100' },\n reject: { border: 'neutral300', background: 'neutral150' },\n} as const;\n\nconst Zone = styled.div<{ $dragState: DragState; $variant: ZoneVariant }>`\n position: relative;\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[4]};\n width: 100%;\n border-radius: ${({ theme }) => theme.borderRadius};\n text-align: ${({ $variant }) => ($variant === 'bar' ? 'start' : 'center')};\n\n ${({ $variant, theme }) =>\n $variant !== 'bar'\n ? `\n flex-direction: column;\n justify-content: center;\n height: 100%;\n min-height: ${$variant === 'tile' ? '20.8rem' : 'auto'};\n padding: ${theme.spaces[4]};\n border: 1px dashed ${theme.colors.neutral300};\n background: ${theme.colors.neutral0};\n `\n : `\n min-height: 7.2rem;\n padding: ${theme.spaces[4]};\n border: 1px solid ${theme.colors.neutral200};\n background: ${theme.colors.neutral100};\n `}\n\n // Only while a file is dragged over the zone: a solid frame inset from the\n // zone's own border marks where the file will land, greyed out when it can't.\n ${({ $dragState, theme }) =>\n $dragState !== 'idle' &&\n `\n &::after {\n content: '';\n position: absolute;\n inset: ${theme.spaces[2]};\n border: 1px solid ${theme.colors[DRAG_FRAME_COLORS[$dragState].border]};\n border-radius: ${theme.borderRadius};\n background: ${theme.colors[DRAG_FRAME_COLORS[$dragState].background]};\n pointer-events: none;\n }\n\n & > * {\n z-index: 1;\n }\n `}\n\n &[data-disabled='true'] {\n cursor: not-allowed;\n }\n`;\n\nconst IconFrame = styled(Flex)`\n flex-shrink: 0;\n width: 4rem;\n height: 4rem;\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral200};\n color: ${({ theme }) => theme.colors.neutral500};\n`;\n\ninterface AssetDropZoneProps {\n variant?: ZoneVariant;\n disabled?: boolean;\n onDropFiles: (files: globalThis.File[]) => void;\n}\n\n/**\n * The field's own drop target. It only takes drops: browsing and picking files\n * go through the \"Add asset\" menu, so the field has one way in, not two.\n *\n * Deliberately not the Media Library page's\n * `UploadDropZoneProvider`: that one covers a whole route and paints a\n * full-surface overlay, where this has to stay inside one field on a form that\n * may hold several of them.\n */\nexport const AssetDropZone = ({\n variant = 'bar',\n disabled = false,\n onDropFiles,\n}: AssetDropZoneProps) => {\n const { formatMessage } = useIntl();\n const [isDragging, setIsDragging] = useState(false);\n // Drag events fire on descendants too, so a plain boolean flickers as the\n // pointer crosses the icon or the label. Counting enter/leave pairs doesn't.\n const dragDepth = useRef(0);\n\n const handleDragEnter = useCallback((event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n if (!event.dataTransfer.types.includes('Files')) {\n return;\n }\n dragDepth.current += 1;\n setIsDragging(true);\n }, []);\n\n const handleDragLeave = useCallback((event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n dragDepth.current -= 1;\n if (dragDepth.current <= 0) {\n dragDepth.current = 0;\n setIsDragging(false);\n }\n }, []);\n\n const handleDragOver = useCallback(\n (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n // `none` shows the no-drop cursor, and the browser then fires no `drop`.\n event.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n },\n [disabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n dragDepth.current = 0;\n setIsDragging(false);\n\n if (disabled) {\n return;\n }\n\n const files = Array.from(event.dataTransfer.files ?? []);\n if (files.length > 0) {\n onDropFiles(files);\n }\n },\n [disabled, onDropFiles]\n );\n\n return (\n <Zone\n $dragState={isDragging ? (disabled ? 'reject' : 'accept') : 'idle'}\n $variant={variant}\n data-disabled={disabled}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <IconFrame justifyContent=\"center\" alignItems=\"center\">\n <Images width=\"2.4rem\" height=\"2.4rem\" />\n </IconFrame>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: getTranslationKey('content-manager.input.placeholder'),\n defaultMessage: 'Drag & drop an asset here',\n })}\n </Typography>\n </Zone>\n );\n};\n"],"names":["DRAG_FRAME_COLORS","accept","border","background","reject","Zone","styled","div","theme","spaces","borderRadius","$variant","colors","neutral300","neutral0","neutral200","neutral100","$dragState","IconFrame","Flex","neutral500","AssetDropZone","variant","disabled","onDropFiles","formatMessage","useIntl","isDragging","setIsDragging","useState","dragDepth","useRef","handleDragEnter","useCallback","event","preventDefault","dataTransfer","types","includes","current","handleDragLeave","handleDragOver","dropEffect","handleDrop","files","Array","from","length","_jsxs","data-disabled","onDragEnter","onDragLeave","onDragOver","onDrop","_jsx","justifyContent","alignItems","Images","width","height","Typography","textColor","id","getTranslationKey","defaultMessage"],"mappings":"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"}