@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
@@ -1,16 +1,19 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState, useEffect, useCallback, useRef } from 'react';
2
+ import { useMemo, useRef, useCallback, useEffect, useState, useId, createElement } from 'react';
3
+ import { useDroppable } from '@dnd-kit/core';
3
4
  import { SubNav } from '@strapi/admin/strapi-admin';
4
- import { Flex, Typography, Box, Loader, IconButton } from '@strapi/design-system';
5
- import { House, Folder, ChevronDown } from '@strapi/icons';
5
+ import { Flex, Typography, Box, Loader, Tooltip, IconButton } from '@strapi/design-system';
6
+ import { House, Folder, More, ChevronRight, ChevronDown } from '@strapi/icons';
6
7
  import { useIntl } from 'react-intl';
7
8
  import { css, styled } from 'styled-components';
8
- import { TruncatedText } from '../../../../components/TruncatedText.mjs';
9
9
  import { useGetFolderStructureQuery } from '../../../../services/folders.mjs';
10
+ import { findFolderPath } from '../../../../utils/findFolderPath.mjs';
10
11
  import { isEventFromWithin } from '../../../../utils/isEventFromWithin.mjs';
11
12
  import { getTranslationKey } from '../../../../utils/translations.mjs';
12
13
  import { useAssetsDndOptional } from '../Dnd/AssetsDndProvider.mjs';
14
+ import { toFolderTreeSummaryId } from '../Dnd/dndIds.mjs';
13
15
  import { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable.mjs';
16
+ import { getCollapsedBranch } from './collapsedBranch.mjs';
14
17
  import { FolderTreeRowMenu } from './FolderTreeRowMenu.mjs';
15
18
  import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
16
19
 
@@ -54,6 +57,13 @@ import { useSpringLoadedExpand } from './useSpringLoadedExpand.mjs';
54
57
  outline-offset: -2px;
55
58
  }
56
59
  `;
60
+ // Squared where path rows meet, so the path reads as one block rather than a
61
+ // stack of separately highlighted rows.
62
+ const getOpenPathRadius = (segment, radius)=>({
63
+ start: `${radius} ${radius} 0 0`,
64
+ middle: '0',
65
+ end: `0 0 ${radius} ${radius}`
66
+ })[segment];
57
67
  const TreeRow = styled(Flex)`
58
68
  cursor: ${({ $isMovePending, $isInvalidDropCursor })=>{
59
69
  if ($isMovePending) {
@@ -62,13 +72,28 @@ const TreeRow = styled(Flex)`
62
72
  return $isInvalidDropCursor ? 'not-allowed' : 'default';
63
73
  }};
64
74
  pointer-events: ${({ $isMovePending })=>$isMovePending ? 'none' : 'auto'};
65
- border-radius: ${({ theme })=>theme.borderRadius};
66
- background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : 'transparent'};
75
+ border-radius: ${({ $openPathSegment, theme })=>$openPathSegment ? getOpenPathRadius($openPathSegment, theme.borderRadius) : theme.borderRadius};
76
+ background: ${({ $isActive, $openPathSegment, theme })=>{
77
+ if ($isActive) {
78
+ return theme.colors.primary100;
79
+ }
80
+ // While a summary row is open, the path down to the open folder is tinted —
81
+ // the folders it reveals plus the parent — so the tint reads as "on the way
82
+ // here" and the open folder's own highlight as "here".
83
+ return $openPathSegment ? theme.colors.neutral100 : 'transparent';
84
+ }};
67
85
 
68
86
  // The whole row lights up, so pointing anywhere along it — chevron, label or
69
- // the actions trigger — reads as one target.
87
+ // the actions trigger — reads as one target. A path row steps past its tint
88
+ // rather than to primary100, which would make it look like a second open
89
+ // folder (and, in dark mode, is the same colour as the tint).
70
90
  &:hover {
71
- background: ${({ $isActive, theme })=>$isActive ? theme.colors.primary100 : theme.colors.neutral100};
91
+ background: ${({ $isActive, $openPathSegment, theme })=>{
92
+ if ($isActive) {
93
+ return theme.colors.primary100;
94
+ }
95
+ return $openPathSegment ? theme.colors.neutral150 : theme.colors.neutral100;
96
+ }};
72
97
  }
73
98
 
74
99
  ${({ $isValidDropTarget, theme })=>$isValidDropTarget && css`
@@ -83,31 +108,14 @@ const TreeRow = styled(Flex)`
83
108
  `;
84
109
  /* -------------------------------------------------------------------------------------------------
85
110
  * useExpandedFolders — local expand/collapse state
86
- * -----------------------------------------------------------------------------------------------*/ const findAncestorIds = (nodes, targetId, trail = [])=>{
87
- for (const node of nodes){
88
- if (node.id === targetId) {
89
- return trail;
90
- }
91
- if (node.children?.length) {
92
- const nextTrail = node.id != null ? [
93
- ...trail,
94
- node.id
95
- ] : trail;
96
- const found = findAncestorIds(node.children, targetId, nextTrail);
97
- if (found !== null) {
98
- return found;
99
- }
100
- }
101
- }
102
- return null;
103
- };
104
- const useExpandedFolders = (folderStructure, currentFolderId)=>{
111
+ * -----------------------------------------------------------------------------------------------*/ const useExpandedFolders = (folderStructure, currentFolderId)=>{
105
112
  const [expandedIds, setExpandedIds] = useState(()=>new Set());
106
113
  useEffect(()=>{
107
114
  if (currentFolderId == null) {
108
115
  return;
109
116
  }
110
- const ancestors = findAncestorIds(folderStructure, currentFolderId);
117
+ // The path ends with the current folder itself, which needs no expanding.
118
+ const ancestors = findFolderPath(folderStructure, currentFolderId)?.slice(0, -1).map((folder)=>folder.id).filter((id)=>id != null);
111
119
  if (!ancestors || ancestors.length === 0) {
112
120
  return;
113
121
  }
@@ -182,6 +190,11 @@ const useExpandedFolders = (folderStructure, currentFolderId)=>{
182
190
  /* -------------------------------------------------------------------------------------------------
183
191
  * FolderTreeItem — single tree row (internal)
184
192
  * -----------------------------------------------------------------------------------------------*/ const INDENT_PER_LEVEL_REM = 1.6;
193
+ /**
194
+ * Deeper rows keep this level's indent, so a name never runs out of room however
195
+ * deep the tree goes. Rows past it stay readable through their path tooltip.
196
+ */ const MAX_VISUAL_LEVEL = 4;
197
+ const getIndentRem = (level)=>Math.min(level, MAX_VISUAL_LEVEL) * INDENT_PER_LEVEL_REM;
185
198
  /**
186
199
  * Breathing room between the row's highlight and the controls at either end.
187
200
  * Asymmetric on purpose: the chevron reads as part of the indent, while the
@@ -232,7 +245,7 @@ const RotatingChevron = styled(ChevronDown)`
232
245
  transform: rotate(${({ $expanded })=>$expanded ? '0deg' : '-90deg'});
233
246
  transition: transform 0.2s ease;
234
247
  `;
235
- const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, currentFolderId, showActiveFolder, isExpanded, onToggle, onExpand, onSelect, isMovePending })=>{
248
+ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, currentFolderId, showActiveFolder, isExpanded, onToggle, onExpand, onSelect, isMovePending, ancestorNames, isHiddenAncestor = false, openPathSegment, subtree })=>{
236
249
  const { formatMessage } = useIntl();
237
250
  const hasChildren = folderChildren.length > 0;
238
251
  // A folder keeps its entry in the expanded set after its last subfolder is
@@ -240,6 +253,14 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
240
253
  // show" — otherwise the chevron stays rotated on what is now a leaf.
241
254
  const isFolderExpanded = isExpanded(id) && hasChildren;
242
255
  const isActive = showActiveFolder && currentFolderId === id;
256
+ const pathLabel = [
257
+ formatMessage({
258
+ id: getTranslationKey('plugin.name'),
259
+ defaultMessage: 'Media Library'
260
+ }),
261
+ ...ancestorNames,
262
+ name
263
+ ].join(' / ');
243
264
  const { droppable: { setNodeRef }, isOver, showValidDropHighlight, showInvalidDropCursor } = useFolderTreeDroppable({
244
265
  id,
245
266
  name
@@ -254,7 +275,7 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
254
275
  const rowButtonRef = useRef(null);
255
276
  useSpringLoadedExpand({
256
277
  isOver,
257
- canExpand: hasChildren && !isFolderExpanded,
278
+ canExpand: !isHiddenAncestor && hasChildren && !isFolderExpanded,
258
279
  onExpand: handleExpand
259
280
  });
260
281
  // TODO: full `role="tree"` + arrow-key treeview navigation before revamp GA
@@ -267,10 +288,11 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
267
288
  alignItems: "center",
268
289
  // Indent plus the row's own inset, so the chevron never sits flush
269
290
  // against the edge of the highlight at any depth.
270
- paddingLeft: `${level * INDENT_PER_LEVEL_REM + ROW_INSET_LEFT_REM}rem`,
291
+ paddingLeft: `${getIndentRem(level) + ROW_INSET_LEFT_REM}rem`,
271
292
  paddingRight: `${ROW_INSET_RIGHT_REM}rem`,
272
293
  gap: 1,
273
294
  $isActive: isActive,
295
+ $openPathSegment: openPathSegment,
274
296
  $isValidDropTarget: showValidDropHighlight,
275
297
  $isInvalidDropCursor: showInvalidDropCursor,
276
298
  $isMovePending: isMovePending,
@@ -285,7 +307,9 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
285
307
  });
286
308
  },
287
309
  children: [
288
- /*#__PURE__*/ jsx(ChevronButton, {
310
+ isHiddenAncestor ? /*#__PURE__*/ jsx(IconSlot, {
311
+ "aria-hidden": true
312
+ }) : /*#__PURE__*/ jsx(ChevronButton, {
289
313
  label: hasChildren ? formatMessage({
290
314
  id: getTranslationKey(isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'),
291
315
  defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}'
@@ -313,21 +337,25 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
313
337
  /*#__PURE__*/ jsx(Box, {
314
338
  flex: "1",
315
339
  minWidth: 0,
316
- children: /*#__PURE__*/ jsx(RowButton, {
317
- ref: rowButtonRef,
318
- type: "button",
319
- $isActive: isActive,
320
- $isValidDropTarget: showValidDropHighlight,
321
- $isInvalidDropCursor: showInvalidDropCursor,
322
- $isMovePending: isMovePending,
323
- "aria-current": isActive ? 'page' : undefined,
324
- onClick: ()=>onSelect(id),
325
- "data-testid": `folder-tree-node-${id}`,
326
- "data-folder-id": id,
327
- children: /*#__PURE__*/ jsx(TruncatedText, {
328
- variant: "omega",
329
- fontWeight: isActive ? 'semiBold' : 'regular',
330
- children: name
340
+ children: /*#__PURE__*/ jsx(Tooltip, {
341
+ label: pathLabel,
342
+ children: /*#__PURE__*/ jsx(RowButton, {
343
+ ref: rowButtonRef,
344
+ type: "button",
345
+ $isActive: isActive,
346
+ $isValidDropTarget: showValidDropHighlight,
347
+ $isInvalidDropCursor: showInvalidDropCursor,
348
+ $isMovePending: isMovePending,
349
+ "aria-current": isActive ? 'page' : undefined,
350
+ onClick: ()=>onSelect(id),
351
+ "data-testid": `folder-tree-node-${id}`,
352
+ "data-folder-id": id,
353
+ children: /*#__PURE__*/ jsx(Typography, {
354
+ ellipsis: true,
355
+ variant: "omega",
356
+ fontWeight: isActive ? 'semiBold' : 'regular',
357
+ children: name
358
+ })
331
359
  })
332
360
  })
333
361
  }),
@@ -343,7 +371,7 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
343
371
  })
344
372
  ]
345
373
  }),
346
- hasChildren && isFolderExpanded && /*#__PURE__*/ jsx(NavList, {
374
+ hasChildren && isFolderExpanded && !isHiddenAncestor && (subtree ?? /*#__PURE__*/ jsx(NavList, {
347
375
  children: folderChildren.map((child)=>/*#__PURE__*/ jsx(FolderTreeItem, {
348
376
  node: child,
349
377
  parentId: id,
@@ -354,9 +382,13 @@ const FolderTreeItemInner = ({ id, name, parentId, folderChildren, level, curren
354
382
  onToggle: onToggle,
355
383
  onExpand: onExpand,
356
384
  onSelect: onSelect,
357
- isMovePending: isMovePending
385
+ isMovePending: isMovePending,
386
+ ancestorNames: [
387
+ ...ancestorNames,
388
+ name
389
+ ]
358
390
  }, child.id ?? child.name))
359
- })
391
+ }))
360
392
  ]
361
393
  });
362
394
  };
@@ -371,6 +403,155 @@ const FolderTreeItem = ({ node, ...props })=>{
371
403
  folderChildren: node.children ?? []
372
404
  });
373
405
  };
406
+ /* -------------------------------------------------------------------------------------------------
407
+ * CollapsedAncestors — the "N parent folders" row of a deep branch (internal)
408
+ * -----------------------------------------------------------------------------------------------*/ const SummaryLabel = styled(Typography)`
409
+ font-style: italic;
410
+ `;
411
+ const SummaryChevron = styled(ChevronRight)`
412
+ transform: rotate(${({ $expanded })=>$expanded ? '90deg' : '0deg'});
413
+ transition: transform 0.2s ease;
414
+ `;
415
+ /**
416
+ * Stands in for the folders between a deep branch's root and the selected
417
+ * folder's parent, and lists them in place when opened.
418
+ */ const CollapsedAncestors = ({ branch, isOpen, onOpenChange, ...itemProps })=>{
419
+ const { formatMessage } = useIntl();
420
+ const listId = useId();
421
+ const open = useCallback(()=>onOpenChange(true), [
422
+ onOpenChange
423
+ ]);
424
+ const rootName = branch.root.name ?? '';
425
+ const hiddenNames = branch.hidden.map((node)=>node.name ?? '');
426
+ // Without this the hidden folders would be unreachable mid-drag, since the row
427
+ // can't be clicked while dragging. It never resolves to a destination.
428
+ const { setNodeRef, isOver } = useDroppable({
429
+ id: toFolderTreeSummaryId(branch.root.id),
430
+ disabled: itemProps.isMovePending
431
+ });
432
+ useSpringLoadedExpand({
433
+ isOver,
434
+ canExpand: !isOpen,
435
+ onExpand: open
436
+ });
437
+ return /*#__PURE__*/ jsxs("li", {
438
+ children: [
439
+ /*#__PURE__*/ jsx(TreeRow, {
440
+ ref: setNodeRef,
441
+ "data-native-context-menu": true,
442
+ alignItems: "center",
443
+ paddingLeft: `${getIndentRem(1) + ROW_INSET_LEFT_REM}rem`,
444
+ paddingRight: `${ROW_INSET_RIGHT_REM}rem`,
445
+ $isInvalidDropCursor: isOver,
446
+ $isMovePending: itemProps.isMovePending,
447
+ children: /*#__PURE__*/ jsx(Tooltip, {
448
+ label: hiddenNames.join(' / '),
449
+ children: /*#__PURE__*/ jsxs(RowButton, {
450
+ type: "button",
451
+ $isActive: false,
452
+ $isInvalidDropCursor: isOver,
453
+ $isMovePending: itemProps.isMovePending,
454
+ "aria-expanded": isOpen,
455
+ "aria-controls": isOpen ? listId : undefined,
456
+ onClick: ()=>onOpenChange(!isOpen),
457
+ "data-testid": "folder-tree-hidden-ancestors",
458
+ children: [
459
+ /*#__PURE__*/ jsx(IconSlot, {
460
+ children: /*#__PURE__*/ jsx(More, {
461
+ "aria-hidden": true,
462
+ fill: "neutral500"
463
+ })
464
+ }),
465
+ /*#__PURE__*/ jsx(Box, {
466
+ flex: "1",
467
+ minWidth: 0,
468
+ children: /*#__PURE__*/ jsx(SummaryLabel, {
469
+ ellipsis: true,
470
+ variant: "omega",
471
+ textColor: "neutral600",
472
+ children: formatMessage({
473
+ id: getTranslationKey('sidebar.tree.hidden-ancestors'),
474
+ defaultMessage: '{count, plural, one {# parent folder} other {# parent folders}}'
475
+ }, {
476
+ count: branch.hidden.length
477
+ })
478
+ })
479
+ }),
480
+ /*#__PURE__*/ jsx(IconSlot, {
481
+ children: /*#__PURE__*/ jsx(SummaryChevron, {
482
+ "aria-hidden": true,
483
+ $expanded: isOpen,
484
+ fill: "neutral500"
485
+ })
486
+ })
487
+ ]
488
+ })
489
+ })
490
+ }),
491
+ isOpen && /*#__PURE__*/ jsx(NavList, {
492
+ id: listId,
493
+ children: branch.hidden.map((node, index)=>/*#__PURE__*/ createElement(FolderTreeItem, {
494
+ ...itemProps,
495
+ key: node.id ?? node.name,
496
+ node: node,
497
+ parentId: (index === 0 ? branch.root.id : branch.hidden[index - 1].id) ?? null,
498
+ // All at one level: they are a list of the path, not a nested tree.
499
+ level: 2,
500
+ ancestorNames: [
501
+ rootName,
502
+ ...hiddenNames.slice(0, index)
503
+ ],
504
+ isHiddenAncestor: true,
505
+ openPathSegment: index === 0 ? 'start' : 'middle'
506
+ }))
507
+ })
508
+ ]
509
+ });
510
+ };
511
+ /**
512
+ * The root folder of a deep branch, with everything between it and the selected
513
+ * folder's parent folded into one row. See `getCollapsedBranch`.
514
+ */ const CollapsedBranchItem = ({ branch, ...itemProps })=>{
515
+ const { currentFolderId } = itemProps;
516
+ const [isOpen, setIsOpen] = useState(false);
517
+ // Closed again on every new selection, clicking a hidden folder included.
518
+ // Reset during render rather than in an effect, so the list never paints open
519
+ // for a folder it wasn't opened on.
520
+ const [openedOn, setOpenedOn] = useState(currentFolderId);
521
+ if (openedOn !== currentFolderId) {
522
+ setOpenedOn(currentFolderId);
523
+ setIsOpen(false);
524
+ }
525
+ const ancestorNamesOfParent = [
526
+ branch.root,
527
+ ...branch.hidden
528
+ ].map((node)=>node.name ?? '');
529
+ return /*#__PURE__*/ jsx(FolderTreeItem, {
530
+ ...itemProps,
531
+ node: branch.root,
532
+ parentId: null,
533
+ level: 0,
534
+ ancestorNames: [],
535
+ subtree: /*#__PURE__*/ jsxs(NavList, {
536
+ children: [
537
+ /*#__PURE__*/ jsx(CollapsedAncestors, {
538
+ ...itemProps,
539
+ branch: branch,
540
+ isOpen: isOpen,
541
+ onOpenChange: setIsOpen
542
+ }),
543
+ /*#__PURE__*/ jsx(FolderTreeItem, {
544
+ ...itemProps,
545
+ node: branch.parent,
546
+ parentId: branch.hidden[branch.hidden.length - 1]?.id ?? branch.root.id ?? null,
547
+ level: 2,
548
+ ancestorNames: ancestorNamesOfParent,
549
+ openPathSegment: isOpen ? 'end' : undefined
550
+ })
551
+ ]
552
+ })
553
+ });
554
+ };
374
555
  const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';
375
556
  /**
376
557
  * Left-rail navigation for the Media Library. Fetches folder structure internally
@@ -395,6 +576,45 @@ const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';
395
576
  const { isMovePending } = useAssetsDndOptional() ?? {
396
577
  isMovePending: false
397
578
  };
579
+ const collapsedBranch = useMemo(()=>getCollapsedBranch(folderStructure, currentFolderId), [
580
+ folderStructure,
581
+ currentFolderId
582
+ ]);
583
+ // A selection that folds or unfolds a branch remounts the selected row, which
584
+ // drops focus to <body>. Whether focus was in the tree has to be read before
585
+ // the selection, since by the time the new row renders the old one is gone.
586
+ const restoreFocusRef = useRef(false);
587
+ const handleSelectFolder = useCallback((folderId)=>{
588
+ // Re-selecting the open folder renders nothing new, so a flag set here
589
+ // would linger and pull focus back on a later, unrelated navigation.
590
+ restoreFocusRef.current = folderId !== currentFolderId && document.activeElement?.closest(FOLDER_TREE_ROOT_SELECTOR) != null;
591
+ onSelectFolder(folderId);
592
+ }, [
593
+ currentFolderId,
594
+ onSelectFolder
595
+ ]);
596
+ useEffect(()=>{
597
+ if (!restoreFocusRef.current || currentFolderId == null) {
598
+ return;
599
+ }
600
+ restoreFocusRef.current = false;
601
+ // Only take back the focus the remount dropped, never steal it from elsewhere.
602
+ if (document.activeElement !== document.body) {
603
+ return;
604
+ }
605
+ document.querySelector(`${FOLDER_TREE_ROOT_SELECTOR} [data-folder-id="${currentFolderId}"]`)?.focus();
606
+ }, [
607
+ currentFolderId
608
+ ]);
609
+ const sharedItemProps = {
610
+ currentFolderId,
611
+ showActiveFolder,
612
+ isExpanded,
613
+ onToggle: toggleExpanded,
614
+ onExpand: expandFolder,
615
+ onSelect: handleSelectFolder,
616
+ isMovePending
617
+ };
398
618
  const isHomeActive = showActiveFolder && currentFolderId == null;
399
619
  const homeLabel = formatMessage({
400
620
  id: getTranslationKey('sidebar.home'),
@@ -529,18 +749,16 @@ const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';
529
749
  })
530
750
  })
531
751
  }) : /*#__PURE__*/ jsx(NavList, {
532
- children: folderStructure.map((node)=>/*#__PURE__*/ jsx(FolderTreeItem, {
752
+ children: folderStructure.map((node)=>collapsedBranch && node.id === collapsedBranch.root.id ? /*#__PURE__*/ jsx(CollapsedBranchItem, {
753
+ branch: collapsedBranch,
754
+ ...sharedItemProps
755
+ }, node.id) : /*#__PURE__*/ jsx(FolderTreeItem, {
533
756
  node: node,
534
757
  // Top of the tree — these sit at the library root.
535
758
  parentId: null,
536
759
  level: 0,
537
- currentFolderId: currentFolderId,
538
- showActiveFolder: showActiveFolder,
539
- isExpanded: isExpanded,
540
- onToggle: toggleExpanded,
541
- onExpand: expandFolder,
542
- onSelect: onSelectFolder,
543
- isMovePending: isMovePending
760
+ ancestorNames: [],
761
+ ...sharedItemProps
544
762
  }, node.id ?? node.name))
545
763
  })
546
764
  ]
@@ -552,5 +770,5 @@ const FOLDER_TREE_ROOT_SELECTOR = '[data-folder-tree-root]';
552
770
  });
553
771
  };
554
772
 
555
- export { FOLDER_TREE_ROOT_SELECTOR, FolderTree };
773
+ export { FOLDER_TREE_ROOT_SELECTOR, FolderTree, getIndentRem };
556
774
  //# sourceMappingURL=FolderTree.mjs.map