@strapi/upload 5.51.1 → 5.51.2

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 (262) hide show
  1. package/dist/admin/components/AssetCard/VideoPreview.js +1 -1
  2. package/dist/admin/components/AssetCard/VideoPreview.js.map +1 -1
  3. package/dist/admin/components/AssetCard/VideoPreview.mjs +1 -1
  4. package/dist/admin/components/AssetCard/VideoPreview.mjs.map +1 -1
  5. package/dist/admin/components/TableList/TableList.js +1 -1
  6. package/dist/admin/components/TableList/TableList.js.map +1 -1
  7. package/dist/admin/components/TableList/TableList.mjs +1 -1
  8. package/dist/admin/components/TableList/TableList.mjs.map +1 -1
  9. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +21 -4
  10. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  11. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs +21 -4
  12. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.mjs.map +1 -1
  13. package/dist/admin/future/components/Drawer.js +3 -1
  14. package/dist/admin/future/components/Drawer.js.map +1 -1
  15. package/dist/admin/future/components/Drawer.mjs +3 -1
  16. package/dist/admin/future/components/Drawer.mjs.map +1 -1
  17. package/dist/admin/future/components/UploadProgressDialog.js +200 -27
  18. package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
  19. package/dist/admin/future/components/UploadProgressDialog.mjs +203 -30
  20. package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
  21. package/dist/admin/future/hooks/useMediaLibraryPermissions.js +35 -0
  22. package/dist/admin/future/hooks/useMediaLibraryPermissions.js.map +1 -0
  23. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs +33 -0
  24. package/dist/admin/future/hooks/useMediaLibraryPermissions.mjs.map +1 -0
  25. package/dist/admin/future/pages/Assets/AssetsPage.js +203 -78
  26. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/AssetsPage.mjs +200 -75
  28. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +75 -32
  30. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +75 -32
  32. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
  33. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +46 -19
  34. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  35. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +47 -20
  36. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
  37. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +5 -2
  38. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  39. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +5 -2
  40. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  41. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js +100 -0
  42. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.js.map +1 -0
  43. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs +98 -0
  44. package/dist/admin/future/pages/Assets/components/AssetsSearchInput.mjs.map +1 -0
  45. package/dist/admin/future/pages/Assets/components/AssetsTable.js +10 -4
  46. package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
  47. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +10 -4
  48. package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
  49. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +140 -22
  50. package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
  51. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +142 -24
  52. package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
  53. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js +193 -0
  54. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.js.map +1 -0
  55. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs +191 -0
  56. package/dist/admin/future/pages/Assets/components/DateRangeCalendar.mjs.map +1 -0
  57. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +18 -1
  58. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
  59. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +18 -1
  60. package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
  61. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js +13 -3
  62. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs +13 -3
  64. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZoneContext.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/EmptyState.js +62 -3
  66. package/dist/admin/future/pages/Assets/components/EmptyState.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/EmptyState.mjs +62 -4
  68. package/dist/admin/future/pages/Assets/components/EmptyState.mjs.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/FilterBadges.js +408 -0
  70. package/dist/admin/future/pages/Assets/components/FilterBadges.js.map +1 -0
  71. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs +406 -0
  72. package/dist/admin/future/pages/Assets/components/FilterBadges.mjs.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/FilterMenu.js +273 -0
  74. package/dist/admin/future/pages/Assets/components/FilterMenu.js.map +1 -0
  75. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs +267 -0
  76. package/dist/admin/future/pages/Assets/components/FilterMenu.mjs.map +1 -0
  77. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +76 -19
  78. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +78 -21
  80. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js +33 -0
  82. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.js.map +1 -0
  83. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs +31 -0
  84. package/dist/admin/future/pages/Assets/components/FolderTree/filterFolderTree.mjs.map +1 -0
  85. package/dist/admin/future/pages/Assets/components/SortMenu.js +21 -32
  86. package/dist/admin/future/pages/Assets/components/SortMenu.js.map +1 -1
  87. package/dist/admin/future/pages/Assets/components/SortMenu.mjs +22 -33
  88. package/dist/admin/future/pages/Assets/components/SortMenu.mjs.map +1 -1
  89. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js +40 -0
  90. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.js.map +1 -0
  91. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs +38 -0
  92. package/dist/admin/future/pages/Assets/hooks/useAssetSearch.mjs.map +1 -0
  93. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js +21 -5
  94. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  95. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs +21 -5
  96. package/dist/admin/future/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  97. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +33 -12
  98. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  99. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +33 -12
  100. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  101. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +40 -4
  102. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
  103. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +40 -4
  104. package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
  105. package/dist/admin/future/pages/Assets/hooks/useListFilters.js +168 -0
  106. package/dist/admin/future/pages/Assets/hooks/useListFilters.js.map +1 -0
  107. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs +162 -0
  108. package/dist/admin/future/pages/Assets/hooks/useListFilters.mjs.map +1 -0
  109. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js +201 -0
  110. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.js.map +1 -0
  111. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs +198 -0
  112. package/dist/admin/future/pages/Assets/utils/buildAssetFilters.mjs.map +1 -0
  113. package/dist/admin/future/pages/Assets/utils/listQueryKey.js +2 -2
  114. package/dist/admin/future/pages/Assets/utils/listQueryKey.js.map +1 -1
  115. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs +2 -2
  116. package/dist/admin/future/pages/Assets/utils/listQueryKey.mjs.map +1 -1
  117. package/dist/admin/future/services/api.js +163 -28
  118. package/dist/admin/future/services/api.js.map +1 -1
  119. package/dist/admin/future/services/api.mjs +163 -30
  120. package/dist/admin/future/services/api.mjs.map +1 -1
  121. package/dist/admin/future/services/assets.js +29 -17
  122. package/dist/admin/future/services/assets.js.map +1 -1
  123. package/dist/admin/future/services/assets.mjs +29 -17
  124. package/dist/admin/future/services/assets.mjs.map +1 -1
  125. package/dist/admin/future/services/folders.js +29 -17
  126. package/dist/admin/future/services/folders.js.map +1 -1
  127. package/dist/admin/future/services/folders.mjs +29 -17
  128. package/dist/admin/future/services/folders.mjs.map +1 -1
  129. package/dist/admin/future/services/settings.js +10 -3
  130. package/dist/admin/future/services/settings.js.map +1 -1
  131. package/dist/admin/future/services/settings.mjs +10 -3
  132. package/dist/admin/future/services/settings.mjs.map +1 -1
  133. package/dist/admin/future/store/uploadProgress.js +109 -2
  134. package/dist/admin/future/store/uploadProgress.js.map +1 -1
  135. package/dist/admin/future/store/uploadProgress.mjs +105 -3
  136. package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
  137. package/dist/admin/future/utils/searchQueryParam.js +11 -0
  138. package/dist/admin/future/utils/searchQueryParam.js.map +1 -0
  139. package/dist/admin/future/utils/searchQueryParam.mjs +9 -0
  140. package/dist/admin/future/utils/searchQueryParam.mjs.map +1 -0
  141. package/dist/admin/hooks/useSelectionState.js +2 -4
  142. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  143. package/dist/admin/hooks/useSelectionState.mjs +2 -4
  144. package/dist/admin/hooks/useSelectionState.mjs.map +1 -1
  145. package/dist/admin/shared/constants.js +43 -0
  146. package/dist/admin/shared/constants.js.map +1 -0
  147. package/dist/admin/shared/constants.mjs +38 -0
  148. package/dist/admin/shared/constants.mjs.map +1 -0
  149. package/dist/admin/src/future/hooks/useMediaLibraryPermissions.d.ts +21 -0
  150. package/dist/admin/src/future/pages/Assets/components/AssetDetails/AssetCropEditor.d.ts +7 -1
  151. package/dist/admin/src/future/pages/Assets/components/AssetsSearchInput.d.ts +5 -0
  152. package/dist/admin/src/future/pages/Assets/components/BulkActionsBar.d.ts +14 -1
  153. package/dist/admin/src/future/pages/Assets/components/DateRangeCalendar.d.ts +8 -0
  154. package/dist/admin/src/future/pages/Assets/components/DropZone/UploadDropZoneContext.d.ts +8 -1
  155. package/dist/admin/src/future/pages/Assets/components/EmptyState.d.ts +18 -1
  156. package/dist/admin/src/future/pages/Assets/components/FilterBadges.d.ts +6 -0
  157. package/dist/admin/src/future/pages/Assets/components/FilterMenu.d.ts +22 -0
  158. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +13 -4
  159. package/dist/admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.d.ts +16 -0
  160. package/dist/admin/src/future/pages/Assets/components/SortMenu.d.ts +6 -0
  161. package/dist/admin/src/future/pages/Assets/hooks/useAssetSearch.d.ts +12 -0
  162. package/dist/admin/src/future/pages/Assets/hooks/useAssetSelection.d.ts +8 -1
  163. package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +13 -3
  164. package/dist/admin/src/future/pages/Assets/hooks/useListFilters.d.ts +69 -0
  165. package/dist/admin/src/future/pages/Assets/utils/buildAssetFilters.d.ts +46 -0
  166. package/dist/admin/src/future/pages/Assets/utils/listQueryKey.d.ts +3 -4
  167. package/dist/admin/src/future/services/api.d.ts +53 -5
  168. package/dist/admin/src/future/services/assets.d.ts +9 -1
  169. package/dist/admin/src/future/services/folders.d.ts +3 -0
  170. package/dist/admin/src/future/services/settings.d.ts +2 -2
  171. package/dist/admin/src/future/store/uploadProgress.d.ts +83 -1
  172. package/dist/admin/src/future/utils/searchQueryParam.d.ts +7 -0
  173. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  174. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  175. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  176. package/dist/admin/src/hooks/useSettings.d.ts +1 -0
  177. package/dist/admin/src/hooks/useTracking.d.ts +1 -1
  178. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  179. package/dist/admin/translations/en.json.js +53 -3
  180. package/dist/admin/translations/en.json.js.map +1 -1
  181. package/dist/admin/translations/en.json.mjs +53 -3
  182. package/dist/admin/translations/en.json.mjs.map +1 -1
  183. package/dist/admin/utils/urlYupSchema.js +33 -9
  184. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  185. package/dist/admin/utils/urlYupSchema.mjs +33 -9
  186. package/dist/admin/utils/urlYupSchema.mjs.map +1 -1
  187. package/dist/server/config.js +13 -5
  188. package/dist/server/config.js.map +1 -1
  189. package/dist/server/config.mjs +13 -5
  190. package/dist/server/config.mjs.map +1 -1
  191. package/dist/server/constants.js.map +1 -1
  192. package/dist/server/constants.mjs.map +1 -1
  193. package/dist/server/controllers/admin-file.js +30 -0
  194. package/dist/server/controllers/admin-file.js.map +1 -1
  195. package/dist/server/controllers/admin-file.mjs +30 -0
  196. package/dist/server/controllers/admin-file.mjs.map +1 -1
  197. package/dist/server/controllers/admin-settings.js +20 -2
  198. package/dist/server/controllers/admin-settings.js.map +1 -1
  199. package/dist/server/controllers/admin-settings.mjs +21 -3
  200. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  201. package/dist/server/controllers/content-api.js +1 -2
  202. package/dist/server/controllers/content-api.js.map +1 -1
  203. package/dist/server/controllers/content-api.mjs +2 -2
  204. package/dist/server/controllers/content-api.mjs.map +1 -1
  205. package/dist/server/controllers/validation/admin/ai-metadata.js +12 -0
  206. package/dist/server/controllers/validation/admin/ai-metadata.js.map +1 -0
  207. package/dist/server/controllers/validation/admin/ai-metadata.mjs +10 -0
  208. package/dist/server/controllers/validation/admin/ai-metadata.mjs.map +1 -0
  209. package/dist/server/controllers/validation/admin/settings.js +4 -1
  210. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  211. package/dist/server/controllers/validation/admin/settings.mjs +1 -1
  212. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  213. package/dist/server/routes/admin.js +18 -0
  214. package/dist/server/routes/admin.js.map +1 -1
  215. package/dist/server/routes/admin.mjs +18 -0
  216. package/dist/server/routes/admin.mjs.map +1 -1
  217. package/dist/server/services/ai-metadata.js +108 -11
  218. package/dist/server/services/ai-metadata.js.map +1 -1
  219. package/dist/server/services/ai-metadata.mjs +108 -11
  220. package/dist/server/services/ai-metadata.mjs.map +1 -1
  221. package/dist/server/services/file.js +86 -13
  222. package/dist/server/services/file.js.map +1 -1
  223. package/dist/server/services/file.mjs +87 -14
  224. package/dist/server/services/file.mjs.map +1 -1
  225. package/dist/server/services/image-manipulation.js +4 -4
  226. package/dist/server/services/image-manipulation.js.map +1 -1
  227. package/dist/server/services/image-manipulation.mjs +4 -4
  228. package/dist/server/services/image-manipulation.mjs.map +1 -1
  229. package/dist/server/shared/constants.js +43 -0
  230. package/dist/server/shared/constants.js.map +1 -0
  231. package/dist/server/shared/constants.mjs +38 -0
  232. package/dist/server/shared/constants.mjs.map +1 -0
  233. package/dist/server/src/config.d.ts +2 -0
  234. package/dist/server/src/config.d.ts.map +1 -1
  235. package/dist/server/src/constants.d.ts +2 -1
  236. package/dist/server/src/constants.d.ts.map +1 -1
  237. package/dist/server/src/controllers/admin-file.d.ts +10 -0
  238. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  239. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  240. package/dist/server/src/controllers/index.d.ts +1 -0
  241. package/dist/server/src/controllers/index.d.ts.map +1 -1
  242. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts +2 -0
  243. package/dist/server/src/controllers/validation/admin/ai-metadata.d.ts.map +1 -0
  244. package/dist/server/src/controllers/validation/admin/settings.d.ts +1 -1
  245. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  246. package/dist/server/src/index.d.ts +7 -1
  247. package/dist/server/src/index.d.ts.map +1 -1
  248. package/dist/server/src/routes/admin.d.ts.map +1 -1
  249. package/dist/server/src/services/ai-metadata.d.ts +19 -0
  250. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  251. package/dist/server/src/services/file.d.ts +12 -2
  252. package/dist/server/src/services/file.d.ts.map +1 -1
  253. package/dist/server/src/services/index.d.ts +4 -1
  254. package/dist/server/src/services/index.d.ts.map +1 -1
  255. package/dist/server/src/types.d.ts +3 -0
  256. package/dist/server/src/types.d.ts.map +1 -1
  257. package/dist/shared/constants.d.ts +35 -0
  258. package/dist/shared/constants.d.ts.map +1 -0
  259. package/dist/shared/contracts/files.d.ts +25 -0
  260. package/dist/shared/contracts/files.d.ts.map +1 -1
  261. package/dist/shared/contracts/settings.d.ts +7 -0
  262. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { Box, Flex, IconButton, Loader, Tooltip, Typography } from '@strapi/design-system';\nimport { ChevronDown, Folder as FolderIcon, House } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { useAssetsDndOptional } from '../Dnd/AssetsDndProvider';\nimport { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable';\n\nimport { useSpringLoadedExpand } from './useSpringLoadedExpand';\n\nimport type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * RowButton — shared row styling aligned with admin SubNav.Link\n * -----------------------------------------------------------------------------------------------*/\n\nconst RowButton = styled.button<{\n $isActive: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n min-height: 3.2rem;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border: 0;\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : 'transparent';\n }};\n color: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary700 : theme.colors.neutral800};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'pointer';\n }};\n text-align: left;\n font: inherit;\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : theme.colors.neutral100;\n }};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst TreeRow = styled(Flex)<{\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'default';\n }};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * useExpandedFolders — local expand/collapse state\n * -----------------------------------------------------------------------------------------------*/\n\nconst findAncestorIds = (\n nodes: FolderNode[],\n targetId: number,\n trail: number[] = []\n): number[] | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return trail;\n }\n\n if (node.children?.length) {\n const nextTrail = node.id != null ? [...trail, node.id] : trail;\n const found = findAncestorIds(node.children, targetId, nextTrail);\n if (found !== null) {\n return found;\n }\n }\n }\n\n return null;\n};\n\nconst useExpandedFolders = (folderStructure: FolderNode[], currentFolderId: number | null) => {\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => new Set());\n\n useEffect(() => {\n if (currentFolderId == null) {\n return;\n }\n\n const ancestors = findAncestorIds(folderStructure, currentFolderId);\n if (!ancestors || ancestors.length === 0) {\n return;\n }\n\n setExpandedIds((prev) => {\n const next = new Set(prev);\n let changed = false;\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [folderStructure, currentFolderId]);\n\n const toggleExpanded = useCallback((id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const expandFolder = useCallback((id: number) => {\n setExpandedIds((prev) => {\n if (prev.has(id)) {\n return prev;\n }\n\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n\n const isExpanded = useCallback((id: number) => expandedIds.has(id), [expandedIds]);\n\n return { isExpanded, toggleExpanded, expandFolder };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TruncatedFolderName — tooltip when the label is ellipsized\n * -----------------------------------------------------------------------------------------------*/\n\nconst TruncatedFolderName = ({ name, isActive }: { name: string; isActive: boolean }) => {\n const textRef = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = textRef.current;\n if (!el) {\n return;\n }\n\n const checkTruncation = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth);\n };\n\n checkTruncation();\n\n const observer = new ResizeObserver(checkTruncation);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [name]);\n\n const label = (\n <Typography\n ref={textRef}\n variant=\"omega\"\n fontWeight={isActive ? 'semiBold' : 'regular'}\n ellipsis\n >\n {name}\n </Typography>\n );\n\n if (isTruncated) {\n return <Tooltip label={name}>{label}</Tooltip>;\n }\n\n return label;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\nconst RotatingChevron = styled(ChevronDown)<{ $expanded: boolean }>`\n transform: rotate(${({ $expanded }) => ($expanded ? '0deg' : '-90deg')});\n transition: transform 0.2s ease;\n`;\n\ninterface FolderTreeItemProps {\n node: FolderNode;\n level: number;\n currentFolderId: number | null;\n isExpanded: (id: number) => boolean;\n onToggle: (id: number) => void;\n onExpand: (id: number) => void;\n onSelect: (folderId: number) => void;\n isMovePending: boolean;\n}\n\ninterface FolderTreeItemInnerProps extends Omit<FolderTreeItemProps, 'node'> {\n id: number;\n name: string;\n folderChildren: FolderNode[];\n}\n\nconst FolderTreeItemInner = ({\n id,\n name,\n folderChildren,\n level,\n currentFolderId,\n isExpanded,\n onToggle,\n onExpand,\n onSelect,\n isMovePending,\n}: FolderTreeItemInnerProps) => {\n const { formatMessage } = useIntl();\n const hasChildren = folderChildren.length > 0;\n const isFolderExpanded = isExpanded(id);\n const isActive = currentFolderId === id;\n\n const {\n droppable: { setNodeRef },\n isOver,\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderTreeDroppable({ id, name });\n\n const handleExpand = useCallback(() => onExpand(id), [id, onExpand]);\n\n useSpringLoadedExpand({\n isOver,\n canExpand: hasChildren && !isFolderExpanded,\n onExpand: handleExpand,\n });\n\n // TODO: full `role=\"tree\"` + arrow-key treeview navigation before revamp GA\n // if an accessibility audit requires it (v1 is button rows only).\n return (\n <li>\n <TreeRow\n ref={setNodeRef}\n alignItems=\"center\"\n paddingLeft={`${level * INDENT_PER_LEVEL_REM}rem`}\n gap={1}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n >\n <IconButton\n label={formatMessage(\n {\n id: getTranslationKey(\n isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'\n ),\n defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}',\n },\n { name }\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={isFolderExpanded}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </IconButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n type=\"button\"\n $isActive={isActive}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onSelect(id)}\n data-testid={`folder-tree-node-${id}`}\n data-folder-id={id}\n >\n <TruncatedFolderName name={name} isActive={isActive} />\n </RowButton>\n </Box>\n </TreeRow>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {folderChildren.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n level={level + 1}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onExpand={onExpand}\n onSelect={onSelect}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </li>\n );\n};\n\nconst FolderTreeItem = ({ node, ...props }: FolderTreeItemProps) => {\n if (node.id == null) {\n return null;\n }\n\n return (\n <FolderTreeItemInner\n {...props}\n id={node.id}\n name={node.name ?? ''}\n folderChildren={node.children ?? []}\n />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTree — public sidebar component\n * -----------------------------------------------------------------------------------------------*/\n\nconst SidebarNav = styled(Flex)`\n /* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */\n width: 25.6rem;\n height: 100%;\n min-height: 100%;\n background: ${({ theme }) => theme.colors.neutral0};\n flex-shrink: 0;\n flex-direction: column;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarHeader = styled(Box)`\n flex-shrink: 0;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarBody = styled(Flex)`\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n`;\n\ninterface FolderTreeProps {\n currentFolderId: number | null;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Left-rail navigation for the Media Library. Fetches folder structure internally\n * and renders:\n *\n * 1. A \"Media library\" title\n * 2. A \"Home\" entry that clears the folder query param\n * 3. A \"FOLDERS\" section header\n * 4. The folder tree itself\n *\n * Presentational with respect to routing — navigation is delegated to the parent\n * via `onSelectFolder` so the URL stays the single source of truth (see\n * `useFolderNavigation`).\n */\nexport const FolderTree = ({ currentFolderId, onSelectFolder }: FolderTreeProps) => {\n const { formatMessage } = useIntl();\n const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();\n const { isExpanded, toggleExpanded, expandFolder } = useExpandedFolders(\n folderStructure,\n currentFolderId\n );\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const isHomeActive = currentFolderId == null;\n const homeLabel = formatMessage({\n id: getTranslationKey('sidebar.home'),\n defaultMessage: 'Home',\n });\n\n const {\n droppable: { setNodeRef: setHomeDropRef },\n showValidDropHighlight: showHomeValidDropHighlight,\n showInvalidDropCursor: showHomeInvalidDropCursor,\n } = useFolderTreeDroppable({ id: null, name: homeLabel });\n\n return (\n <SidebarNav\n direction=\"column\"\n alignItems=\"stretch\"\n tag=\"nav\"\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SidebarHeader paddingTop={4} paddingBottom={4} paddingLeft={5} paddingRight={5}>\n <Typography variant=\"beta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n </Typography>\n </SidebarHeader>\n\n <SidebarBody direction=\"column\" alignItems=\"stretch\" gap={1} padding={3}>\n <RowButton\n ref={setHomeDropRef}\n type=\"button\"\n $isActive={isHomeActive}\n $isValidDropTarget={showHomeValidDropHighlight}\n $isInvalidDropCursor={showHomeInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isHomeActive ? 'page' : undefined}\n onClick={() => onSelectFolder(null)}\n data-testid=\"folder-tree-home\"\n >\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {homeLabel}\n </Typography>\n </RowButton>\n\n <Box marginTop={4}>\n <Flex\n alignItems=\"center\"\n gap={1}\n paddingTop={1}\n paddingBottom={1}\n paddingLeft={2}\n paddingRight={2}\n marginBottom={2}\n >\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n style={{ textTransform: 'uppercase' }}\n >\n {formatMessage({\n id: getTranslationKey('sidebar.folders'),\n defaultMessage: 'Folders',\n })}\n </Typography>\n </Flex>\n\n {isLoading ? (\n // TODO: revisit loading state before revamp GA\n <Flex justifyContent=\"center\" padding={1} paddingTop={2}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('sidebar.tree.loading'),\n defaultMessage: 'Loading folders...',\n })}\n </Loader>\n </Flex>\n ) : isError ? (\n // TODO: revisit error state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.error'),\n defaultMessage: 'Could not load folders.',\n })}\n </Typography>\n </Box>\n ) : folderStructure.length === 0 ? (\n // TODO: revisit empty state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.empty'),\n defaultMessage: 'No folders yet',\n })}\n </Typography>\n </Box>\n ) : (\n <NavList>\n {folderStructure.map((node) => (\n <FolderTreeItem\n key={node.id ?? node.name}\n node={node}\n level={0}\n currentFolderId={currentFolderId}\n isExpanded={isExpanded}\n onToggle={toggleExpanded}\n onExpand={expandFolder}\n onSelect={onSelectFolder}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </Box>\n </SidebarBody>\n </SidebarNav>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","$isValidDropTarget","colors","primary100","primary700","neutral800","borderRadius","$isMovePending","$isInvalidDropCursor","css","primary600","neutral100","TreeRow","Flex","findAncestorIds","nodes","targetId","trail","node","id","children","length","nextTrail","found","useExpandedFolders","folderStructure","currentFolderId","expandedIds","setExpandedIds","useState","Set","useEffect","ancestors","prev","next","changed","has","add","toggleExpanded","useCallback","delete","expandFolder","isExpanded","TruncatedFolderName","name","isActive","textRef","useRef","isTruncated","setIsTruncated","useLayoutEffect","el","current","checkTruncation","scrollWidth","clientWidth","observer","ResizeObserver","observe","disconnect","label","_jsx","Typography","ref","variant","fontWeight","ellipsis","Tooltip","NavList","ul","INDENT_PER_LEVEL_REM","RotatingChevron","ChevronDown","$expanded","FolderTreeItemInner","folderChildren","level","onToggle","onExpand","onSelect","isMovePending","formatMessage","useIntl","hasChildren","isFolderExpanded","droppable","setNodeRef","isOver","showValidDropHighlight","showInvalidDropCursor","useFolderTreeDroppable","handleExpand","useSpringLoadedExpand","canExpand","_jsxs","li","alignItems","paddingLeft","gap","IconButton","getTranslationKey","defaultMessage","onClick","event","stopPropagation","withTooltip","aria-expanded","fill","Box","flex","minWidth","type","aria-current","undefined","data-testid","data-folder-id","map","child","FolderTreeItem","props","SidebarNav","neutral0","neutral150","SidebarHeader","SidebarBody","FolderTree","onSelectFolder","data","isLoading","isError","useGetFolderStructureQuery","useAssetsDndOptional","isHomeActive","homeLabel","setHomeDropRef","showHomeValidDropHighlight","showHomeInvalidDropCursor","direction","tag","aria-label","paddingTop","paddingBottom","paddingRight","padding","House","aria-hidden","width","height","marginTop","marginBottom","FolderIcon","textColor","style","textTransform","justifyContent","Loader"],"mappings":"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"}
1
+ {"version":3,"file":"FolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/FolderTree.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Loader,\n Searchbar,\n Tooltip,\n Typography,\n useFilter,\n} from '@strapi/design-system';\nimport { ChevronDown, Folder as FolderIcon, House } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { css, styled } from 'styled-components';\n\nimport { useGetFolderStructureQuery } from '../../../../services/folders';\nimport { getTranslationKey } from '../../../../utils/translations';\nimport { useAssetsDndOptional } from '../Dnd/AssetsDndProvider';\nimport { useFolderTreeDroppable } from '../Dnd/useFolderTreeDroppable';\n\nimport { filterFolderTree } from './filterFolderTree';\nimport { useSpringLoadedExpand } from './useSpringLoadedExpand';\n\nimport type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * RowButton — shared row styling aligned with admin SubNav.Link\n * -----------------------------------------------------------------------------------------------*/\n\nconst RowButton = styled.button<{\n $isActive: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]};\n width: 100%;\n min-height: 3.2rem;\n padding: ${({ theme }) => `${theme.spaces[1]} ${theme.spaces[2]}`};\n border: 0;\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : 'transparent';\n }};\n color: ${({ $isActive, theme }) =>\n $isActive ? theme.colors.primary700 : theme.colors.neutral800};\n border-radius: ${({ theme }) => theme.borderRadius};\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'pointer';\n }};\n text-align: left;\n font: inherit;\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n\n &:hover {\n background: ${({ $isActive, $isValidDropTarget, theme }) => {\n if ($isValidDropTarget) {\n return theme.colors.primary100;\n }\n\n return $isActive ? theme.colors.primary100 : theme.colors.neutral100;\n }};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: -2px;\n }\n`;\n\nconst TreeRow = styled(Flex)<{\n $isValidDropTarget?: boolean;\n $isInvalidDropCursor?: boolean;\n $isMovePending?: boolean;\n}>`\n cursor: ${({ $isMovePending, $isInvalidDropCursor }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropCursor ? 'not-allowed' : 'default';\n }};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n outline: 1px dashed ${theme.colors.primary600};\n outline-offset: -1px;\n `}\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * useExpandedFolders — local expand/collapse state\n * -----------------------------------------------------------------------------------------------*/\n\nconst findAncestorIds = (\n nodes: FolderNode[],\n targetId: number,\n trail: number[] = []\n): number[] | null => {\n for (const node of nodes) {\n if (node.id === targetId) {\n return trail;\n }\n\n if (node.children?.length) {\n const nextTrail = node.id != null ? [...trail, node.id] : trail;\n const found = findAncestorIds(node.children, targetId, nextTrail);\n if (found !== null) {\n return found;\n }\n }\n }\n\n return null;\n};\n\nconst useExpandedFolders = (folderStructure: FolderNode[], currentFolderId: number | null) => {\n const [expandedIds, setExpandedIds] = useState<Set<number>>(() => new Set());\n\n useEffect(() => {\n if (currentFolderId == null) {\n return;\n }\n\n const ancestors = findAncestorIds(folderStructure, currentFolderId);\n if (!ancestors || ancestors.length === 0) {\n return;\n }\n\n setExpandedIds((prev) => {\n const next = new Set(prev);\n let changed = false;\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [folderStructure, currentFolderId]);\n\n const toggleExpanded = useCallback((id: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const expandFolder = useCallback((id: number) => {\n setExpandedIds((prev) => {\n if (prev.has(id)) {\n return prev;\n }\n\n const next = new Set(prev);\n next.add(id);\n return next;\n });\n }, []);\n\n const isExpanded = useCallback((id: number) => expandedIds.has(id), [expandedIds]);\n\n return { isExpanded, toggleExpanded, expandFolder };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TruncatedFolderName — tooltip when the label is ellipsized\n * -----------------------------------------------------------------------------------------------*/\n\nconst TruncatedFolderName = ({ name, isActive }: { name: string; isActive: boolean }) => {\n const textRef = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useLayoutEffect(() => {\n const el = textRef.current;\n if (!el) {\n return;\n }\n\n const checkTruncation = () => {\n setIsTruncated(el.scrollWidth > el.clientWidth);\n };\n\n checkTruncation();\n\n const observer = new ResizeObserver(checkTruncation);\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [name]);\n\n const label = (\n <Typography\n ref={textRef}\n variant=\"omega\"\n fontWeight={isActive ? 'semiBold' : 'regular'}\n ellipsis\n >\n {name}\n </Typography>\n );\n\n if (isTruncated) {\n return <Tooltip label={name}>{label}</Tooltip>;\n }\n\n return label;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NavList — unstyled list for tree rows\n * -----------------------------------------------------------------------------------------------*/\n\nconst NavList = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTreeItem — single tree row (internal)\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDENT_PER_LEVEL_REM = 1.6;\n\nconst RotatingChevron = styled(ChevronDown)<{ $expanded: boolean }>`\n transform: rotate(${({ $expanded }) => ($expanded ? '0deg' : '-90deg')});\n transition: transform 0.2s ease;\n`;\n\ninterface FolderTreeItemProps {\n node: FolderNode;\n level: number;\n currentFolderId: number | null;\n showActiveFolder: boolean;\n isExpanded: (id: number) => boolean;\n onToggle: (id: number) => void;\n onExpand: (id: number) => void;\n onSelect: (folderId: number) => void;\n isMovePending: boolean;\n}\n\ninterface FolderTreeItemInnerProps extends Omit<FolderTreeItemProps, 'node'> {\n id: number;\n name: string;\n folderChildren: FolderNode[];\n}\n\nconst FolderTreeItemInner = ({\n id,\n name,\n folderChildren,\n level,\n currentFolderId,\n showActiveFolder,\n isExpanded,\n onToggle,\n onExpand,\n onSelect,\n isMovePending,\n}: FolderTreeItemInnerProps) => {\n const { formatMessage } = useIntl();\n const hasChildren = folderChildren.length > 0;\n const isFolderExpanded = isExpanded(id);\n const isActive = showActiveFolder && currentFolderId === id;\n\n const {\n droppable: { setNodeRef },\n isOver,\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderTreeDroppable({ id, name });\n\n const handleExpand = useCallback(() => onExpand(id), [id, onExpand]);\n\n useSpringLoadedExpand({\n isOver,\n canExpand: hasChildren && !isFolderExpanded,\n onExpand: handleExpand,\n });\n\n // TODO: full `role=\"tree\"` + arrow-key treeview navigation before revamp GA\n // if an accessibility audit requires it (v1 is button rows only).\n return (\n <li>\n <TreeRow\n ref={setNodeRef}\n alignItems=\"center\"\n paddingLeft={`${level * INDENT_PER_LEVEL_REM}rem`}\n gap={1}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n >\n <IconButton\n label={formatMessage(\n {\n id: getTranslationKey(\n isFolderExpanded ? 'sidebar.tree.collapse' : 'sidebar.tree.expand'\n ),\n defaultMessage: isFolderExpanded ? 'Collapse {name}' : 'Expand {name}',\n },\n { name }\n )}\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n onToggle(id);\n }}\n variant=\"ghost\"\n withTooltip={false}\n aria-expanded={isFolderExpanded}\n >\n <RotatingChevron $expanded={isFolderExpanded} fill=\"neutral500\" />\n </IconButton>\n\n <Box flex=\"1\" minWidth={0}>\n <RowButton\n type=\"button\"\n $isActive={isActive}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropCursor={showInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onSelect(id)}\n data-testid={`folder-tree-node-${id}`}\n data-folder-id={id}\n >\n <TruncatedFolderName name={name} isActive={isActive} />\n </RowButton>\n </Box>\n </TreeRow>\n\n {hasChildren && isFolderExpanded && (\n <NavList>\n {folderChildren.map((child) => (\n <FolderTreeItem\n key={child.id ?? child.name}\n node={child}\n level={level + 1}\n currentFolderId={currentFolderId}\n showActiveFolder={showActiveFolder}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onExpand={onExpand}\n onSelect={onSelect}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </li>\n );\n};\n\nconst FolderTreeItem = ({ node, ...props }: FolderTreeItemProps) => {\n if (node.id == null) {\n return null;\n }\n\n return (\n <FolderTreeItemInner\n {...props}\n id={node.id}\n name={node.name ?? ''}\n folderChildren={node.children ?? []}\n />\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * FolderTree — public sidebar component\n * -----------------------------------------------------------------------------------------------*/\n\nconst SidebarNav = styled(Flex)`\n /* TODO: reconcile 25.6rem (Figma) with admin WIDTH_SIDE_NAVIGATION (23.2rem) */\n width: 25.6rem;\n height: 100%;\n min-height: 100%;\n background: ${({ theme }) => theme.colors.neutral0};\n flex-shrink: 0;\n flex-direction: column;\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarHeader = styled(Box)`\n flex-shrink: 0;\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst SidebarBody = styled(Flex)`\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n`;\n\ninterface FolderTreeProps {\n currentFolderId: number | null;\n /**\n * Set to `false` while a global asset search is active: the results span the\n * whole library, so highlighting one folder would misrepresent them.\n * */\n showActiveFolder?: boolean;\n onSelectFolder: (folderId: number | null) => void;\n}\n\n/**\n * Left-rail navigation for the Media Library. Fetches folder structure internally\n * and renders:\n *\n * 1. A \"Media library\" title\n * 2. A filter input that prunes the tree to matching destinations\n * 3. A \"Home\" entry that clears the folder query param\n * 4. A \"FOLDERS\" section header\n * 5. The folder tree itself\n *\n * The filter is purely local: it never touches the URL and never affects the\n * asset list, which has its own independent search in the content toolbar.\n *\n * Presentational with respect to routing — navigation is delegated to the parent\n * via `onSelectFolder` so the URL stays the single source of truth (see\n * `useFolderNavigation`).\n */\nexport const FolderTree = ({\n currentFolderId,\n showActiveFolder = true,\n onSelectFolder,\n}: FolderTreeProps) => {\n const { formatMessage, locale } = useIntl();\n const { data: folderStructure = [], isLoading, isError } = useGetFolderStructureQuery();\n const { isExpanded, toggleExpanded, expandFolder } = useExpandedFolders(\n folderStructure,\n currentFolderId\n );\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n\n const [treeFilter, setTreeFilter] = useState('');\n const { contains } = useFilter(locale, { sensitivity: 'base' });\n const trimmedFilter = treeFilter.trim();\n\n const { nodes: visibleNodes, expandedIds: filterExpandedIds } = useMemo(\n () =>\n trimmedFilter\n ? filterFolderTree(folderStructure, (name) => contains(name, trimmedFilter))\n : { nodes: folderStructure, expandedIds: [] },\n [folderStructure, trimmedFilter, contains]\n );\n\n // An override layered on top of the user's own expansion rather than written\n // into it, so clearing the filter restores exactly what they had open.\n const isExpandedForRender = useCallback(\n (id: number) => filterExpandedIds.includes(id) || isExpanded(id),\n [filterExpandedIds, isExpanded]\n );\n\n const isHomeActive = showActiveFolder && currentFolderId == null;\n const homeLabel = formatMessage({\n id: getTranslationKey('sidebar.home'),\n defaultMessage: 'Home',\n });\n\n const {\n droppable: { setNodeRef: setHomeDropRef },\n showValidDropHighlight: showHomeValidDropHighlight,\n showInvalidDropCursor: showHomeInvalidDropCursor,\n } = useFolderTreeDroppable({ id: null, name: homeLabel });\n\n return (\n <SidebarNav\n direction=\"column\"\n alignItems=\"stretch\"\n tag=\"nav\"\n aria-label={formatMessage({\n id: getTranslationKey('sidebar.tree.aria-label'),\n defaultMessage: 'Media library folders',\n })}\n >\n <SidebarHeader paddingTop={4} paddingBottom={4} paddingLeft={5} paddingRight={5}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"beta\" tag=\"h2\">\n {formatMessage({\n id: getTranslationKey('sidebar.title'),\n defaultMessage: 'Media library',\n })}\n </Typography>\n\n <Searchbar\n name=\"search-folders\"\n value={treeFilter}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n setTreeFilter(event.target.value)\n }\n onClear={() => setTreeFilter('')}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n placeholder={formatMessage({\n id: getTranslationKey('sidebar.search.placeholder'),\n defaultMessage: 'Search folders',\n })}\n size=\"S\"\n >\n {formatMessage({\n id: getTranslationKey('sidebar.search.label'),\n defaultMessage: 'Search folders',\n })}\n </Searchbar>\n </Flex>\n </SidebarHeader>\n\n <SidebarBody direction=\"column\" alignItems=\"stretch\" gap={1} padding={3}>\n <RowButton\n ref={setHomeDropRef}\n type=\"button\"\n $isActive={isHomeActive}\n $isValidDropTarget={showHomeValidDropHighlight}\n $isInvalidDropCursor={showHomeInvalidDropCursor}\n $isMovePending={isMovePending}\n aria-current={isHomeActive ? 'page' : undefined}\n onClick={() => onSelectFolder(null)}\n data-testid=\"folder-tree-home\"\n >\n <House aria-hidden width=\"1.6rem\" height=\"1.6rem\" />\n <Typography variant=\"omega\" fontWeight={isHomeActive ? 'semiBold' : 'regular'}>\n {homeLabel}\n </Typography>\n </RowButton>\n\n <Box marginTop={4}>\n <Flex\n alignItems=\"center\"\n gap={1}\n paddingTop={1}\n paddingBottom={1}\n paddingLeft={2}\n paddingRight={2}\n marginBottom={2}\n >\n <FolderIcon aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"neutral500\" />\n <Typography\n variant=\"sigma\"\n textColor=\"neutral600\"\n style={{ textTransform: 'uppercase' }}\n >\n {formatMessage({\n id: getTranslationKey('sidebar.folders'),\n defaultMessage: 'Folders',\n })}\n </Typography>\n </Flex>\n\n {isLoading ? (\n // TODO: revisit loading state before revamp GA\n <Flex justifyContent=\"center\" padding={1} paddingTop={2}>\n <Loader>\n {formatMessage({\n id: getTranslationKey('sidebar.tree.loading'),\n defaultMessage: 'Loading folders...',\n })}\n </Loader>\n </Flex>\n ) : isError ? (\n // TODO: revisit error state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"danger600\">\n {formatMessage({\n id: getTranslationKey('sidebar.tree.error'),\n defaultMessage: 'Could not load folders.',\n })}\n </Typography>\n </Box>\n ) : visibleNodes.length === 0 ? (\n // TODO: revisit empty state before revamp GA\n <Box padding={1} paddingTop={2}>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {trimmedFilter\n ? formatMessage(\n {\n id: getTranslationKey('sidebar.tree.no-results'),\n defaultMessage: 'No folders match \"{query}\"',\n },\n { query: trimmedFilter }\n )\n : formatMessage({\n id: getTranslationKey('sidebar.tree.empty'),\n defaultMessage: 'No folders yet',\n })}\n </Typography>\n </Box>\n ) : (\n <NavList>\n {visibleNodes.map((node) => (\n <FolderTreeItem\n key={node.id ?? node.name}\n node={node}\n level={0}\n currentFolderId={currentFolderId}\n showActiveFolder={showActiveFolder}\n isExpanded={isExpandedForRender}\n onToggle={toggleExpanded}\n onExpand={expandFolder}\n onSelect={onSelectFolder}\n isMovePending={isMovePending}\n />\n ))}\n </NavList>\n )}\n </Box>\n </SidebarBody>\n </SidebarNav>\n );\n};\n"],"names":["RowButton","styled","button","theme","spaces","$isActive","$isValidDropTarget","colors","primary100","primary700","neutral800","borderRadius","$isMovePending","$isInvalidDropCursor","css","primary600","neutral100","TreeRow","Flex","findAncestorIds","nodes","targetId","trail","node","id","children","length","nextTrail","found","useExpandedFolders","folderStructure","currentFolderId","expandedIds","setExpandedIds","useState","Set","useEffect","ancestors","prev","next","changed","has","add","toggleExpanded","useCallback","delete","expandFolder","isExpanded","TruncatedFolderName","name","isActive","textRef","useRef","isTruncated","setIsTruncated","useLayoutEffect","el","current","checkTruncation","scrollWidth","clientWidth","observer","ResizeObserver","observe","disconnect","label","_jsx","Typography","ref","variant","fontWeight","ellipsis","Tooltip","NavList","ul","INDENT_PER_LEVEL_REM","RotatingChevron","ChevronDown","$expanded","FolderTreeItemInner","folderChildren","level","showActiveFolder","onToggle","onExpand","onSelect","isMovePending","formatMessage","useIntl","hasChildren","isFolderExpanded","droppable","setNodeRef","isOver","showValidDropHighlight","showInvalidDropCursor","useFolderTreeDroppable","handleExpand","useSpringLoadedExpand","canExpand","_jsxs","li","alignItems","paddingLeft","gap","IconButton","getTranslationKey","defaultMessage","onClick","event","stopPropagation","withTooltip","aria-expanded","fill","Box","flex","minWidth","type","aria-current","undefined","data-testid","data-folder-id","map","child","FolderTreeItem","props","SidebarNav","neutral0","neutral150","SidebarHeader","SidebarBody","FolderTree","onSelectFolder","locale","data","isLoading","isError","useGetFolderStructureQuery","useAssetsDndOptional","treeFilter","setTreeFilter","contains","useFilter","sensitivity","trimmedFilter","trim","visibleNodes","filterExpandedIds","useMemo","filterFolderTree","isExpandedForRender","includes","isHomeActive","homeLabel","setHomeDropRef","showHomeValidDropHighlight","showHomeInvalidDropCursor","direction","tag","aria-label","paddingTop","paddingBottom","paddingRight","Searchbar","value","onChange","target","onClear","clearLabel","placeholder","size","padding","House","aria-hidden","width","height","marginTop","marginBottom","FolderIcon","textColor","style","textTransform","justifyContent","Loader","query"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Prunes the folder tree to nodes that match, or that have a matching
5
+ * descendant, so a match deep in the hierarchy stays reachable with its ancestor
6
+ * chain intact.
7
+ */ const filterFolderTree = (nodes, matches)=>{
8
+ const expandedIds = [];
9
+ const prune = (candidates)=>candidates.reduce((retained, node)=>{
10
+ const retainedChildren = prune(node.children ?? []);
11
+ const isMatch = matches(node.name ?? '');
12
+ if (!isMatch && retainedChildren.length === 0) {
13
+ return retained;
14
+ }
15
+ // Only nodes kept for a descendant's sake need force-expanding; a leaf
16
+ // match has nothing to reveal.
17
+ if (retainedChildren.length > 0 && node.id != null) {
18
+ expandedIds.push(node.id);
19
+ }
20
+ retained.push({
21
+ ...node,
22
+ children: retainedChildren
23
+ });
24
+ return retained;
25
+ }, []);
26
+ return {
27
+ nodes: prune(nodes),
28
+ expandedIds
29
+ };
30
+ };
31
+
32
+ exports.filterFolderTree = filterFolderTree;
33
+ //# sourceMappingURL=filterFolderTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterFolderTree.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.ts"],"sourcesContent":["import type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\ninterface FilterFolderTreeResult {\n nodes: FolderNode[];\n /**\n * Ancestors of a match, which have to be expanded for the match to be\n * reachable.\n */\n expandedIds: number[];\n}\n\n/**\n * Prunes the folder tree to nodes that match, or that have a matching\n * descendant, so a match deep in the hierarchy stays reachable with its ancestor\n * chain intact.\n */\nexport const filterFolderTree = (\n nodes: FolderNode[],\n matches: (name: string) => boolean\n): FilterFolderTreeResult => {\n const expandedIds: number[] = [];\n\n const prune = (candidates: FolderNode[]): FolderNode[] =>\n candidates.reduce<FolderNode[]>((retained, node) => {\n const retainedChildren = prune(node.children ?? []);\n const isMatch = matches(node.name ?? '');\n\n if (!isMatch && retainedChildren.length === 0) {\n return retained;\n }\n\n // Only nodes kept for a descendant's sake need force-expanding; a leaf\n // match has nothing to reveal.\n if (retainedChildren.length > 0 && node.id != null) {\n expandedIds.push(node.id);\n }\n\n retained.push({ ...node, children: retainedChildren });\n\n return retained;\n }, []);\n\n return { nodes: prune(nodes), expandedIds };\n};\n"],"names":["filterFolderTree","nodes","matches","expandedIds","prune","candidates","reduce","retained","node","retainedChildren","children","isMatch","name","length","id","push"],"mappings":";;AAWA;;;;AAIC,IACM,MAAMA,gBAAAA,GAAmB,CAC9BC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,cAAwB,EAAE;AAEhC,IAAA,MAAMC,QAAQ,CAACC,UAAAA,GACbA,WAAWC,MAAM,CAAe,CAACC,QAAAA,EAAUC,IAAAA,GAAAA;AACzC,YAAA,MAAMC,gBAAAA,GAAmBL,KAAAA,CAAMI,IAAAA,CAAKE,QAAQ,IAAI,EAAE,CAAA;AAClD,YAAA,MAAMC,OAAAA,GAAUT,OAAAA,CAAQM,IAAAA,CAAKI,IAAI,IAAI,EAAA,CAAA;AAErC,YAAA,IAAI,CAACD,OAAAA,IAAWF,gBAAAA,CAAiBI,MAAM,KAAK,CAAA,EAAG;gBAC7C,OAAON,QAAAA;AACT,YAAA;;;AAIA,YAAA,IAAIE,iBAAiBI,MAAM,GAAG,KAAKL,IAAAA,CAAKM,EAAE,IAAI,IAAA,EAAM;gBAClDX,WAAAA,CAAYY,IAAI,CAACP,IAAAA,CAAKM,EAAE,CAAA;AAC1B,YAAA;AAEAP,YAAAA,QAAAA,CAASQ,IAAI,CAAC;AAAE,gBAAA,GAAGP,IAAI;gBAAEE,QAAAA,EAAUD;AAAiB,aAAA,CAAA;YAEpD,OAAOF,QAAAA;AACT,QAAA,CAAA,EAAG,EAAE,CAAA;IAEP,OAAO;AAAEN,QAAAA,KAAAA,EAAOG,KAAAA,CAAMH,KAAAA,CAAAA;AAAQE,QAAAA;AAAY,KAAA;AAC5C;;;;"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Prunes the folder tree to nodes that match, or that have a matching
3
+ * descendant, so a match deep in the hierarchy stays reachable with its ancestor
4
+ * chain intact.
5
+ */ const filterFolderTree = (nodes, matches)=>{
6
+ const expandedIds = [];
7
+ const prune = (candidates)=>candidates.reduce((retained, node)=>{
8
+ const retainedChildren = prune(node.children ?? []);
9
+ const isMatch = matches(node.name ?? '');
10
+ if (!isMatch && retainedChildren.length === 0) {
11
+ return retained;
12
+ }
13
+ // Only nodes kept for a descendant's sake need force-expanding; a leaf
14
+ // match has nothing to reveal.
15
+ if (retainedChildren.length > 0 && node.id != null) {
16
+ expandedIds.push(node.id);
17
+ }
18
+ retained.push({
19
+ ...node,
20
+ children: retainedChildren
21
+ });
22
+ return retained;
23
+ }, []);
24
+ return {
25
+ nodes: prune(nodes),
26
+ expandedIds
27
+ };
28
+ };
29
+
30
+ export { filterFolderTree };
31
+ //# sourceMappingURL=filterFolderTree.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterFolderTree.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/FolderTree/filterFolderTree.ts"],"sourcesContent":["import type { FolderNode } from '../../../../../../../shared/contracts/folders';\n\ninterface FilterFolderTreeResult {\n nodes: FolderNode[];\n /**\n * Ancestors of a match, which have to be expanded for the match to be\n * reachable.\n */\n expandedIds: number[];\n}\n\n/**\n * Prunes the folder tree to nodes that match, or that have a matching\n * descendant, so a match deep in the hierarchy stays reachable with its ancestor\n * chain intact.\n */\nexport const filterFolderTree = (\n nodes: FolderNode[],\n matches: (name: string) => boolean\n): FilterFolderTreeResult => {\n const expandedIds: number[] = [];\n\n const prune = (candidates: FolderNode[]): FolderNode[] =>\n candidates.reduce<FolderNode[]>((retained, node) => {\n const retainedChildren = prune(node.children ?? []);\n const isMatch = matches(node.name ?? '');\n\n if (!isMatch && retainedChildren.length === 0) {\n return retained;\n }\n\n // Only nodes kept for a descendant's sake need force-expanding; a leaf\n // match has nothing to reveal.\n if (retainedChildren.length > 0 && node.id != null) {\n expandedIds.push(node.id);\n }\n\n retained.push({ ...node, children: retainedChildren });\n\n return retained;\n }, []);\n\n return { nodes: prune(nodes), expandedIds };\n};\n"],"names":["filterFolderTree","nodes","matches","expandedIds","prune","candidates","reduce","retained","node","retainedChildren","children","isMatch","name","length","id","push"],"mappings":"AAWA;;;;AAIC,IACM,MAAMA,gBAAAA,GAAmB,CAC9BC,KAAAA,EACAC,OAAAA,GAAAA;AAEA,IAAA,MAAMC,cAAwB,EAAE;AAEhC,IAAA,MAAMC,QAAQ,CAACC,UAAAA,GACbA,WAAWC,MAAM,CAAe,CAACC,QAAAA,EAAUC,IAAAA,GAAAA;AACzC,YAAA,MAAMC,gBAAAA,GAAmBL,KAAAA,CAAMI,IAAAA,CAAKE,QAAQ,IAAI,EAAE,CAAA;AAClD,YAAA,MAAMC,OAAAA,GAAUT,OAAAA,CAAQM,IAAAA,CAAKI,IAAI,IAAI,EAAA,CAAA;AAErC,YAAA,IAAI,CAACD,OAAAA,IAAWF,gBAAAA,CAAiBI,MAAM,KAAK,CAAA,EAAG;gBAC7C,OAAON,QAAAA;AACT,YAAA;;;AAIA,YAAA,IAAIE,iBAAiBI,MAAM,GAAG,KAAKL,IAAAA,CAAKM,EAAE,IAAI,IAAA,EAAM;gBAClDX,WAAAA,CAAYY,IAAI,CAACP,IAAAA,CAAKM,EAAE,CAAA;AAC1B,YAAA;AAEAP,YAAAA,QAAAA,CAASQ,IAAI,CAAC;AAAE,gBAAA,GAAGP,IAAI;gBAAEE,QAAAA,EAAUD;AAAiB,aAAA,CAAA;YAEpD,OAAOF,QAAAA;AACT,QAAA,CAAA,EAAG,EAAE,CAAA;IAEP,OAAO;AAAEN,QAAAA,KAAAA,EAAOG,KAAAA,CAAMH,KAAAA,CAAAA;AAAQE,QAAAA;AAAY,KAAA;AAC5C;;;;"}
@@ -47,9 +47,7 @@ const FOLDERS_LABELS = {
47
47
  };
48
48
  // Stretch to the toolbar row height so the trigger matches the view toggle
49
49
  // (the parent Flex uses alignItems="stretch").
50
- const SortTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
51
- height: auto;
52
- `;
50
+ const SortTrigger = styledComponents.styled(designSystem.Menu.Trigger)``;
53
51
  // Full-width section band, like the design mock (sits inside the Menu.Content
54
52
  // padding, so the band stops short of the panel edges).
55
53
  const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
@@ -64,6 +62,12 @@ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
64
62
  * option keeps the menu open (`onSelect` preventDefault) so several facets can
65
63
  * be tuned in one visit; clicking a checked facet clears it (the hook
66
64
  * guarantees at least one sort rule stays active).
65
+ *
66
+ * Each section is single-select, so its items are radios: the checkmark icon is
67
+ * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`
68
+ * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element
69
+ * it renders through Radix's `asChild`, where they take precedence over Radix's
70
+ * own `role="menuitem"`.
67
71
  */ const SortMenu = ({ sort, showFoldersGroup = true })=>{
68
72
  const { formatMessage } = reactIntl.useIntl();
69
73
  const triggerLabel = formatMessage({
@@ -78,22 +82,10 @@ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
78
82
  height: "1.6rem",
79
83
  fill: "primary600"
80
84
  });
81
- // The checkmark icon is aria-hidden, so the active option carries a
82
- // visually-hidden suffix for screen readers instead (menuitem does not
83
- // allow aria-checked).
84
- const activeMark = /*#__PURE__*/ jsxRuntime.jsxs(designSystem.VisuallyHidden, {
85
- children: [
86
- ' ',
87
- formatMessage({
88
- id: translations.getTranslationKey('list.sort.active'),
89
- defaultMessage: '(active)'
90
- })
91
- ]
92
- });
93
85
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
94
86
  children: [
95
87
  /*#__PURE__*/ jsxRuntime.jsx(SortTrigger, {
96
- variant: "tertiary",
88
+ variant: "ghost",
97
89
  endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ChevronDown, {
98
90
  "aria-hidden": true
99
91
  }),
@@ -103,7 +95,7 @@ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
103
95
  popoverPlacement: "bottom-end",
104
96
  zIndex: 2,
105
97
  maxHeight: "70vh",
106
- width: "25rem",
98
+ minWidth: "25rem",
107
99
  children: [
108
100
  /*#__PURE__*/ jsxRuntime.jsx(GroupLabel, {
109
101
  children: formatMessage({
@@ -111,27 +103,25 @@ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
111
103
  defaultMessage: 'Sort'
112
104
  })
113
105
  }),
114
- Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
106
+ Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
107
+ role: "menuitemradio",
108
+ "aria-checked": sort.sortBy === key,
115
109
  onSelect: (e)=>{
116
110
  e.preventDefault();
117
111
  sort.setSortBy(sort.sortBy === key ? null : key);
118
112
  },
119
113
  endIcon: sort.sortBy === key ? checkmark : null,
120
- children: [
121
- formatMessage(SORT_BY_LABELS[key]),
122
- sort.sortBy === key && activeMark
123
- ]
114
+ children: formatMessage(SORT_BY_LABELS[key])
124
115
  }, key)),
125
- Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
116
+ Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
117
+ role: "menuitemradio",
118
+ "aria-checked": sort.direction === key,
126
119
  onSelect: (e)=>{
127
120
  e.preventDefault();
128
121
  sort.setDirection(sort.direction === key ? null : key);
129
122
  },
130
123
  endIcon: sort.direction === key ? checkmark : null,
131
- children: [
132
- formatMessage(SORT_DIRECTION_LABELS[key]),
133
- sort.direction === key && activeMark
134
- ]
124
+ children: formatMessage(SORT_DIRECTION_LABELS[key])
135
125
  }, key)),
136
126
  showFoldersGroup && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
137
127
  children: [
@@ -142,16 +132,15 @@ const GroupLabel = styledComponents.styled(designSystem.Menu.Label)`
142
132
  defaultMessage: 'Folders'
143
133
  })
144
134
  }),
145
- Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Item, {
135
+ Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
136
+ role: "menuitemradio",
137
+ "aria-checked": sort.foldersPosition === position,
146
138
  onSelect: (e)=>{
147
139
  e.preventDefault();
148
140
  sort.setFoldersPosition(position);
149
141
  },
150
142
  endIcon: sort.foldersPosition === position ? checkmark : null,
151
- children: [
152
- formatMessage(FOLDERS_LABELS[position]),
153
- sort.foldersPosition === position && activeMark
154
- ]
143
+ children: formatMessage(FOLDERS_LABELS[position])
155
144
  }, position))
156
145
  ]
157
146
  })
@@ -1 +1 @@
1
- {"version":3,"file":"SortMenu.js","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu, VisuallyHidden } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)`\n height: auto;\n`;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n // The checkmark icon is aria-hidden, so the active option carries a\n // visually-hidden suffix for screen readers instead (menuitem does not\n // allow aria-checked).\n const activeMark = (\n <VisuallyHidden>\n {' '}\n {formatMessage({ id: getTranslationKey('list.sort.active'), defaultMessage: '(active)' })}\n </VisuallyHidden>\n );\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"tertiary\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" width=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n {sort.sortBy === key && activeMark}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n {sort.direction === key && activeMark}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n {sort.foldersPosition === position && activeMark}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","activeMark","_jsxs","VisuallyHidden","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","Object","keys","map","key","Item","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","setFoldersPosition","foldersPosition"],"mappings":"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"}
1
+ {"version":3,"file":"SortMenu.js","sources":["../../../../../../admin/src/future/pages/Assets/components/SortMenu.tsx"],"sourcesContent":["import { Menu } from '@strapi/design-system';\nimport { Check, ChevronDown } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslationKey } from '../../../utils/translations';\nimport {\n type FoldersPosition,\n type ListSort,\n type SortByKey,\n type SortDirectionKey,\n} from '../hooks/useListSort';\n\nimport type { MessageDescriptor } from 'react-intl';\n\nconst SORT_BY_LABELS: Record<SortByKey, MessageDescriptor> = {\n oldestUploads: {\n id: getTranslationKey('list.sort.oldest-uploads'),\n defaultMessage: 'Oldest uploads',\n },\n mostRecentUpdates: {\n id: getTranslationKey('list.sort.most-recent-updates'),\n defaultMessage: 'Most recent updates',\n },\n};\n\nconst SORT_DIRECTION_LABELS: Record<SortDirectionKey, MessageDescriptor> = {\n nameAsc: { id: getTranslationKey('list.sort.name-asc'), defaultMessage: 'A to Z' },\n nameDesc: { id: getTranslationKey('list.sort.name-desc'), defaultMessage: 'Z to A' },\n sizeAsc: {\n id: getTranslationKey('list.sort.size-asc'),\n defaultMessage: 'File size ascending',\n },\n sizeDesc: {\n id: getTranslationKey('list.sort.size-desc'),\n defaultMessage: 'File size descending',\n },\n};\n\nconst FOLDERS_LABELS: Record<FoldersPosition, MessageDescriptor> = {\n top: { id: getTranslationKey('list.sort.folders-on-top'), defaultMessage: 'On top' },\n mixed: {\n id: getTranslationKey('list.sort.folders-mixed'),\n defaultMessage: 'Mixed with files',\n },\n};\n\n// Stretch to the toolbar row height so the trigger matches the view toggle\n// (the parent Flex uses alignItems=\"stretch\").\nconst SortTrigger = styled(Menu.Trigger)``;\n\n// Full-width section band, like the design mock (sits inside the Menu.Content\n// padding, so the band stops short of the panel edges).\nconst GroupLabel = styled(Menu.Label)`\n width: 100%;\n display: block;\n background: ${({ theme }) =>\n theme.colorScheme === 'dark' ? theme.colors.neutral150 : theme.colors.neutral100};\n padding-inline: ${({ theme }) => theme.spaces[3]};\n border-radius: ${({ theme }) => theme.borderRadius};\n`;\n\ninterface SortMenuProps {\n sort: ListSort;\n /**\n * The grid view forces folders on top (mixing folder cards with asset cards\n * is not supported there), so it hides the Folders group entirely.\n */\n showFoldersGroup?: boolean;\n}\n\n/**\n * Toolbar \"Sort\" dropdown: single-select sections (Sort / Folders). Picking an\n * option keeps the menu open (`onSelect` preventDefault) so several facets can\n * be tuned in one visit; clicking a checked facet clears it (the hook\n * guarantees at least one sort rule stays active).\n *\n * Each section is single-select, so its items are radios: the checkmark icon is\n * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`\n * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element\n * it renders through Radix's `asChild`, where they take precedence over Radix's\n * own `role=\"menuitem\"`.\n */\nexport const SortMenu = ({ sort, showFoldersGroup = true }: SortMenuProps) => {\n const { formatMessage } = useIntl();\n\n const triggerLabel = formatMessage(\n { id: getTranslationKey('list.sort.trigger'), defaultMessage: 'Sort: {active}' },\n {\n active: sort.sortBy\n ? formatMessage(SORT_BY_LABELS[sort.sortBy])\n : formatMessage(SORT_DIRECTION_LABELS[sort.direction!]),\n }\n );\n\n const checkmark = <Check aria-hidden width=\"1.6rem\" height=\"1.6rem\" fill=\"primary600\" />;\n\n return (\n <Menu.Root>\n <SortTrigger variant=\"ghost\" endIcon={<ChevronDown aria-hidden />}>\n {triggerLabel}\n </SortTrigger>\n {/* The DS default maxHeight (15rem) folds everything after the first\n group behind an invisible scroll — all groups must be visible at\n once. 70vh keeps a scroll on very short viewports. */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2} maxHeight=\"70vh\" minWidth=\"25rem\">\n {/* One single-select \"Sort\" section: the two rule families were always\n mutually exclusive (one checkmark total), so they share a group. */}\n <GroupLabel>\n {formatMessage({ id: getTranslationKey('list.sort.section'), defaultMessage: 'Sort' })}\n </GroupLabel>\n {(Object.keys(SORT_BY_LABELS) as SortByKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.sortBy === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setSortBy(sort.sortBy === key ? null : key);\n }}\n endIcon={sort.sortBy === key ? checkmark : null}\n >\n {formatMessage(SORT_BY_LABELS[key])}\n </Menu.Item>\n ))}\n {(Object.keys(SORT_DIRECTION_LABELS) as SortDirectionKey[]).map((key) => (\n <Menu.Item\n key={key}\n role=\"menuitemradio\"\n aria-checked={sort.direction === key}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setDirection(sort.direction === key ? null : key);\n }}\n endIcon={sort.direction === key ? checkmark : null}\n >\n {formatMessage(SORT_DIRECTION_LABELS[key])}\n </Menu.Item>\n ))}\n\n {showFoldersGroup && (\n <>\n <Menu.Separator />\n <GroupLabel>\n {formatMessage({\n id: getTranslationKey('list.sort.folders'),\n defaultMessage: 'Folders',\n })}\n </GroupLabel>\n {(Object.keys(FOLDERS_LABELS) as FoldersPosition[]).map((position) => (\n <Menu.Item\n key={position}\n role=\"menuitemradio\"\n aria-checked={sort.foldersPosition === position}\n onSelect={(e: Event) => {\n e.preventDefault();\n sort.setFoldersPosition(position);\n }}\n endIcon={sort.foldersPosition === position ? checkmark : null}\n >\n {formatMessage(FOLDERS_LABELS[position])}\n </Menu.Item>\n ))}\n </>\n )}\n </Menu.Content>\n </Menu.Root>\n );\n};\n"],"names":["SORT_BY_LABELS","oldestUploads","id","getTranslationKey","defaultMessage","mostRecentUpdates","SORT_DIRECTION_LABELS","nameAsc","nameDesc","sizeAsc","sizeDesc","FOLDERS_LABELS","top","mixed","SortTrigger","styled","Menu","Trigger","GroupLabel","Label","theme","colorScheme","colors","neutral150","neutral100","spaces","borderRadius","SortMenu","sort","showFoldersGroup","formatMessage","useIntl","triggerLabel","active","sortBy","direction","checkmark","_jsx","Check","aria-hidden","width","height","fill","_jsxs","Root","variant","endIcon","ChevronDown","Content","popoverPlacement","zIndex","maxHeight","minWidth","Object","keys","map","key","Item","role","aria-checked","onSelect","e","preventDefault","setSortBy","setDirection","_Fragment","Separator","position","foldersPosition","setFoldersPosition"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { VisuallyHidden, Menu } from '@strapi/design-system';
2
+ import { Menu } from '@strapi/design-system';
3
3
  import { ChevronDown, Check } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { styled } from 'styled-components';
@@ -45,9 +45,7 @@ const FOLDERS_LABELS = {
45
45
  };
46
46
  // Stretch to the toolbar row height so the trigger matches the view toggle
47
47
  // (the parent Flex uses alignItems="stretch").
48
- const SortTrigger = styled(Menu.Trigger)`
49
- height: auto;
50
- `;
48
+ const SortTrigger = styled(Menu.Trigger)``;
51
49
  // Full-width section band, like the design mock (sits inside the Menu.Content
52
50
  // padding, so the band stops short of the panel edges).
53
51
  const GroupLabel = styled(Menu.Label)`
@@ -62,6 +60,12 @@ const GroupLabel = styled(Menu.Label)`
62
60
  * option keeps the menu open (`onSelect` preventDefault) so several facets can
63
61
  * be tuned in one visit; clicking a checked facet clears it (the hook
64
62
  * guarantees at least one sort rule stays active).
63
+ *
64
+ * Each section is single-select, so its items are radios: the checkmark icon is
65
+ * decorative, and `aria-checked` is what assistive tech reads. The DS `Menu`
66
+ * exposes no `RadioItem`, but `Menu.Item` forwards extra props onto the element
67
+ * it renders through Radix's `asChild`, where they take precedence over Radix's
68
+ * own `role="menuitem"`.
65
69
  */ const SortMenu = ({ sort, showFoldersGroup = true })=>{
66
70
  const { formatMessage } = useIntl();
67
71
  const triggerLabel = formatMessage({
@@ -76,22 +80,10 @@ const GroupLabel = styled(Menu.Label)`
76
80
  height: "1.6rem",
77
81
  fill: "primary600"
78
82
  });
79
- // The checkmark icon is aria-hidden, so the active option carries a
80
- // visually-hidden suffix for screen readers instead (menuitem does not
81
- // allow aria-checked).
82
- const activeMark = /*#__PURE__*/ jsxs(VisuallyHidden, {
83
- children: [
84
- ' ',
85
- formatMessage({
86
- id: getTranslationKey('list.sort.active'),
87
- defaultMessage: '(active)'
88
- })
89
- ]
90
- });
91
83
  return /*#__PURE__*/ jsxs(Menu.Root, {
92
84
  children: [
93
85
  /*#__PURE__*/ jsx(SortTrigger, {
94
- variant: "tertiary",
86
+ variant: "ghost",
95
87
  endIcon: /*#__PURE__*/ jsx(ChevronDown, {
96
88
  "aria-hidden": true
97
89
  }),
@@ -101,7 +93,7 @@ const GroupLabel = styled(Menu.Label)`
101
93
  popoverPlacement: "bottom-end",
102
94
  zIndex: 2,
103
95
  maxHeight: "70vh",
104
- width: "25rem",
96
+ minWidth: "25rem",
105
97
  children: [
106
98
  /*#__PURE__*/ jsx(GroupLabel, {
107
99
  children: formatMessage({
@@ -109,27 +101,25 @@ const GroupLabel = styled(Menu.Label)`
109
101
  defaultMessage: 'Sort'
110
102
  })
111
103
  }),
112
- Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsxs(Menu.Item, {
104
+ Object.keys(SORT_BY_LABELS).map((key)=>/*#__PURE__*/ jsx(Menu.Item, {
105
+ role: "menuitemradio",
106
+ "aria-checked": sort.sortBy === key,
113
107
  onSelect: (e)=>{
114
108
  e.preventDefault();
115
109
  sort.setSortBy(sort.sortBy === key ? null : key);
116
110
  },
117
111
  endIcon: sort.sortBy === key ? checkmark : null,
118
- children: [
119
- formatMessage(SORT_BY_LABELS[key]),
120
- sort.sortBy === key && activeMark
121
- ]
112
+ children: formatMessage(SORT_BY_LABELS[key])
122
113
  }, key)),
123
- Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsxs(Menu.Item, {
114
+ Object.keys(SORT_DIRECTION_LABELS).map((key)=>/*#__PURE__*/ jsx(Menu.Item, {
115
+ role: "menuitemradio",
116
+ "aria-checked": sort.direction === key,
124
117
  onSelect: (e)=>{
125
118
  e.preventDefault();
126
119
  sort.setDirection(sort.direction === key ? null : key);
127
120
  },
128
121
  endIcon: sort.direction === key ? checkmark : null,
129
- children: [
130
- formatMessage(SORT_DIRECTION_LABELS[key]),
131
- sort.direction === key && activeMark
132
- ]
122
+ children: formatMessage(SORT_DIRECTION_LABELS[key])
133
123
  }, key)),
134
124
  showFoldersGroup && /*#__PURE__*/ jsxs(Fragment, {
135
125
  children: [
@@ -140,16 +130,15 @@ const GroupLabel = styled(Menu.Label)`
140
130
  defaultMessage: 'Folders'
141
131
  })
142
132
  }),
143
- Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsxs(Menu.Item, {
133
+ Object.keys(FOLDERS_LABELS).map((position)=>/*#__PURE__*/ jsx(Menu.Item, {
134
+ role: "menuitemradio",
135
+ "aria-checked": sort.foldersPosition === position,
144
136
  onSelect: (e)=>{
145
137
  e.preventDefault();
146
138
  sort.setFoldersPosition(position);
147
139
  },
148
140
  endIcon: sort.foldersPosition === position ? checkmark : null,
149
- children: [
150
- formatMessage(FOLDERS_LABELS[position]),
151
- sort.foldersPosition === position && activeMark
152
- ]
141
+ children: formatMessage(FOLDERS_LABELS[position])
153
142
  }, position))
154
143
  ]
155
144
  })