@strapi/upload 5.50.1 → 5.50.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 (47) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +7 -1
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  3. package/dist/admin/ai/components/AIAssetCard.mjs +7 -1
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -1
  5. package/dist/admin/components/AssetCard/AssetCard.js +6 -0
  6. package/dist/admin/components/AssetCard/AssetCard.js.map +1 -1
  7. package/dist/admin/components/AssetCard/AssetCard.mjs +6 -0
  8. package/dist/admin/components/AssetCard/AssetCard.mjs.map +1 -1
  9. package/dist/admin/components/AssetCard/ImageAssetCard.js +3 -2
  10. package/dist/admin/components/AssetCard/ImageAssetCard.js.map +1 -1
  11. package/dist/admin/components/AssetCard/ImageAssetCard.mjs +3 -2
  12. package/dist/admin/components/AssetCard/ImageAssetCard.mjs.map +1 -1
  13. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +2 -2
  14. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  15. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +2 -2
  16. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  17. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js +8 -0
  18. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.js.map +1 -1
  19. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs +8 -0
  20. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAsset.mjs.map +1 -1
  21. package/dist/admin/components/TableList/PreviewCell.js +5 -1
  22. package/dist/admin/components/TableList/PreviewCell.js.map +1 -1
  23. package/dist/admin/components/TableList/PreviewCell.mjs +5 -1
  24. package/dist/admin/components/TableList/PreviewCell.mjs.map +1 -1
  25. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +6 -3
  26. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -1
  27. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs +6 -3
  28. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.mjs.map +1 -1
  29. package/dist/admin/future/pages/Assets/components/AssetsGrid.js +5 -1
  30. package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
  31. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +5 -1
  32. package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  33. package/dist/admin/src/components/AssetCard/ImageAssetCard.d.ts +2 -1
  34. package/dist/admin/src/hooks/useAiAvailability.d.ts +1 -1
  35. package/dist/admin/src/hooks/useEditAsset.d.ts +4 -4
  36. package/dist/admin/src/hooks/useEditFolder.d.ts +4 -4
  37. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  38. package/dist/admin/translations/ko.json.js +183 -1
  39. package/dist/admin/translations/ko.json.js.map +1 -1
  40. package/dist/admin/translations/ko.json.mjs +183 -1
  41. package/dist/admin/translations/ko.json.mjs.map +1 -1
  42. package/dist/server/src/controllers/index.d.ts +1 -1
  43. package/dist/server/src/index.d.ts +11 -11
  44. package/dist/server/src/routes/index.d.ts +1 -1
  45. package/dist/server/src/services/image-manipulation.d.ts +3 -3
  46. package/dist/server/src/services/index.d.ts +9 -9
  47. package/package.json +16 -12
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPreview.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, Loader, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type {\n File,\n AssetWithPopulatedCreatedBy,\n} from '../../../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n aspect-ratio: 16 / 9;\n max-height: 24rem;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding: ${({ theme }) => theme.spaces[3]};\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst AssetContainer = styled(Flex)`\n justify-content: center;\n position: relative;\n z-index: 2;\n width: 100%;\n height: 100%;\n`;\n\nconst StyledImage = styled.img`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\n/**\n * Top-right overlay slot for image actions (crop). Sits above the\n * image (z-index 3 > AssetContainer 2) so the buttons stay clickable.\n */\nconst ActionsOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n right: ${({ theme }) => theme.spaces[3]};\n z-index: 3;\n`;\n\nconst StyledVideo = styled.video`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\nconst StyledAudio = styled.audio`\n width: 100%;\n`;\n\nconst StyledPdfIframe = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 200px;\n border: none;\n`;\n\nconst IconFallback = styled(Flex)`\n height: 100%;\n aspect-ratio: 1;\n width: auto;\n max-width: 100%;\n margin: 0 auto;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst LoaderOverlay = styled(Flex)`\n position: absolute;\n inset: 0;\n z-index: 1;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetLoader\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetLoader = () => {\n const { formatMessage } = useIntl();\n return (\n <LoaderOverlay justifyContent=\"center\" alignItems=\"center\">\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </LoaderOverlay>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreviewContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetPreviewProps {\n asset: File | AssetWithPopulatedCreatedBy;\n actions?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport const AssetPreview = ({ asset, actions, isLoading = false }: AssetPreviewProps) => {\n const { formatMessage } = useIntl();\n const { alternativeText, ext, mime, url, updatedAt } = asset;\n // Append the asset's `updatedAt` as a cache-buster so a freshly replaced\n // file (often served at the same URL) shows the new content instead of the\n // browser-cached old version.\n const cacheKey = updatedAt ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string | undefined) => {\n if (!raw || cacheKey === undefined) return raw;\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n const mediaUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n const [isMediaLoaded, setIsMediaLoaded] = React.useState(false);\n React.useEffect(() => {\n setIsMediaLoaded(false);\n }, [mediaUrl]);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n React.useEffect(() => {\n const image = imageRef.current;\n if (!image) return;\n const recompute = () => {\n const parent = image.parentElement;\n if (!parent) return;\n const c = parent.getBoundingClientRect();\n // offsetWidth/Height = pre-transform layout box (transforms ignored).\n const w = image.offsetWidth;\n const h = image.offsetHeight;\n if (!w || !h || !c.width || !c.height) return;\n };\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(image);\n if (image.parentElement) ro.observe(image.parentElement);\n return () => ro.disconnect();\n }, [isMediaLoaded]);\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const imageUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n if (imageUrl) {\n return (\n <PreviewContainer>\n {(!isMediaLoaded || isLoading) && <AssetLoader />}\n {actions ? <ActionsOverlay>{actions}</ActionsOverlay> : null}\n <AssetContainer>\n <StyledImage\n ref={imageRef}\n src={imageUrl}\n alt={alternativeText || asset.name || ''}\n onLoad={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n }\n\n if (mime?.includes(ASSET_TYPES.Video) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledVideo\n src={mediaUrl}\n controls\n title={asset.name}\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.videoNotSupported'),\n defaultMessage: 'Your browser does not support the video tag.',\n })}\n </StyledVideo>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n if (mime?.includes(ASSET_TYPES.Audio) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <Flex\n width=\"100%\"\n padding={4}\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n minHeight=\"12rem\"\n >\n <StyledAudio\n src={mediaUrl}\n controls\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </Flex>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const isPdf =\n ext?.toLowerCase() === 'pdf' || ext?.toLowerCase() === '.pdf' || mime === 'application/pdf';\n if (isPdf && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledPdfIframe\n src={`${mediaUrl}#toolbar=0`}\n title={asset.name}\n onLoad={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n return (\n <PreviewContainer>\n <IconFallback\n justifyContent=\"center\"\n alignItems=\"center\"\n gap={1}\n direction=\"column\"\n hasRadius\n >\n <DocIcon width={24} height={24} />\n <Typography variant=\"pi\">\n {formatMessage({\n id: getTranslationKey('asset-details.noPreview'),\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </IconFallback>\n </PreviewContainer>\n );\n};\n"],"names":["PreviewContainer","styled","Box","theme","borderRadius","spaces","colors","neutral100","AssetContainer","Flex","StyledImage","img","ActionsOverlay","StyledVideo","video","StyledAudio","audio","StyledPdfIframe","iframe","IconFallback","neutral500","neutral150","LoaderOverlay","AssetLoader","formatMessage","useIntl","_jsx","justifyContent","alignItems","Loader","id","defaultMessage","AssetPreview","asset","actions","isLoading","alternativeText","ext","mime","url","updatedAt","cacheKey","Date","getTime","undefined","appendCacheBuster","raw","includes","mediaUrl","prefixFileUrlWithBackendUrl","isMediaLoaded","setIsMediaLoaded","React","useState","useEffect","imageRef","useRef","image","current","recompute","parent","parentElement","c","getBoundingClientRect","w","offsetWidth","h","offsetHeight","width","height","ro","ResizeObserver","observe","disconnect","ASSET_TYPES","Image","imageUrl","_jsxs","ref","src","alt","name","onLoad","onError","Video","controls","title","onLoadedData","getTranslationKey","Audio","padding","minHeight","isPdf","toLowerCase","DocIcon","getAssetIcon","gap","direction","hasRadius","Typography","variant"],"mappings":"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"}
1
+ {"version":3,"file":"AssetPreview.js","sources":["../../../../../../../admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, Loader, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type {\n File,\n AssetWithPopulatedCreatedBy,\n} from '../../../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n aspect-ratio: 16 / 9;\n max-height: 24rem;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding: ${({ theme }) => theme.spaces[3]};\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst AssetContainer = styled(Flex)`\n justify-content: center;\n position: relative;\n z-index: 2;\n width: 100%;\n height: 100%;\n`;\n\nconst StyledImage = styled.img`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\n/**\n * Top-right overlay slot for image actions (crop). Sits above the\n * image (z-index 3 > AssetContainer 2) so the buttons stay clickable.\n */\nconst ActionsOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n right: ${({ theme }) => theme.spaces[3]};\n z-index: 3;\n`;\n\nconst StyledVideo = styled.video`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\nconst StyledAudio = styled.audio`\n width: 100%;\n`;\n\nconst StyledPdfIframe = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 200px;\n border: none;\n`;\n\nconst IconFallback = styled(Flex)`\n height: 100%;\n aspect-ratio: 1;\n width: auto;\n max-width: 100%;\n margin: 0 auto;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst LoaderOverlay = styled(Flex)`\n position: absolute;\n inset: 0;\n z-index: 1;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetLoader\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetLoader = () => {\n const { formatMessage } = useIntl();\n return (\n <LoaderOverlay justifyContent=\"center\" alignItems=\"center\">\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </LoaderOverlay>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreviewContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetPreviewProps {\n asset: File | AssetWithPopulatedCreatedBy;\n actions?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport const AssetPreview = ({ asset, actions, isLoading = false }: AssetPreviewProps) => {\n const { formatMessage } = useIntl();\n const { alternativeText, ext, mime, url, updatedAt, isUrlSigned, isLocal } = asset;\n // Append the asset's `updatedAt` as a cache-buster so a freshly replaced\n // file (often served at the same URL) shows the new content instead of the\n // browser-cached old version. Signed URLs are excluded: their query string\n // is part of the SigV4 signature, so appending a param invalidates the\n // signature and the request fails with 403. See #26581.\n const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string | undefined) => {\n if (!raw || cacheKey === undefined) return raw;\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n const mediaUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n const [isMediaLoaded, setIsMediaLoaded] = React.useState(false);\n React.useEffect(() => {\n setIsMediaLoaded(false);\n }, [mediaUrl]);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n React.useEffect(() => {\n const image = imageRef.current;\n if (!image) return;\n const recompute = () => {\n const parent = image.parentElement;\n if (!parent) return;\n const c = parent.getBoundingClientRect();\n // offsetWidth/Height = pre-transform layout box (transforms ignored).\n const w = image.offsetWidth;\n const h = image.offsetHeight;\n if (!w || !h || !c.width || !c.height) return;\n };\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(image);\n if (image.parentElement) ro.observe(image.parentElement);\n return () => ro.disconnect();\n }, [isMediaLoaded]);\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const imageUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n if (imageUrl) {\n return (\n <PreviewContainer>\n {(!isMediaLoaded || isLoading) && <AssetLoader />}\n {actions ? <ActionsOverlay>{actions}</ActionsOverlay> : null}\n <AssetContainer>\n <StyledImage\n ref={imageRef}\n src={imageUrl}\n alt={alternativeText || asset.name || ''}\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n onLoad={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n }\n\n if (mime?.includes(ASSET_TYPES.Video) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledVideo\n src={mediaUrl}\n controls\n title={asset.name}\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.videoNotSupported'),\n defaultMessage: 'Your browser does not support the video tag.',\n })}\n </StyledVideo>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n if (mime?.includes(ASSET_TYPES.Audio) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <Flex\n width=\"100%\"\n padding={4}\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n minHeight=\"12rem\"\n >\n <StyledAudio\n src={mediaUrl}\n controls\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </Flex>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const isPdf =\n ext?.toLowerCase() === 'pdf' || ext?.toLowerCase() === '.pdf' || mime === 'application/pdf';\n if (isPdf && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledPdfIframe\n src={`${mediaUrl}#toolbar=0`}\n title={asset.name}\n onLoad={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n return (\n <PreviewContainer>\n <IconFallback\n justifyContent=\"center\"\n alignItems=\"center\"\n gap={1}\n direction=\"column\"\n hasRadius\n >\n <DocIcon width={24} height={24} />\n <Typography variant=\"pi\">\n {formatMessage({\n id: getTranslationKey('asset-details.noPreview'),\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </IconFallback>\n </PreviewContainer>\n );\n};\n"],"names":["PreviewContainer","styled","Box","theme","borderRadius","spaces","colors","neutral100","AssetContainer","Flex","StyledImage","img","ActionsOverlay","StyledVideo","video","StyledAudio","audio","StyledPdfIframe","iframe","IconFallback","neutral500","neutral150","LoaderOverlay","AssetLoader","formatMessage","useIntl","_jsx","justifyContent","alignItems","Loader","id","defaultMessage","AssetPreview","asset","actions","isLoading","alternativeText","ext","mime","url","updatedAt","isUrlSigned","isLocal","cacheKey","Date","getTime","undefined","appendCacheBuster","raw","includes","mediaUrl","prefixFileUrlWithBackendUrl","isMediaLoaded","setIsMediaLoaded","React","useState","useEffect","imageRef","useRef","image","current","recompute","parent","parentElement","c","getBoundingClientRect","w","offsetWidth","h","offsetHeight","width","height","ro","ResizeObserver","observe","disconnect","ASSET_TYPES","Image","imageUrl","_jsxs","ref","src","alt","name","crossOrigin","onLoad","onError","Video","controls","title","onLoadedData","getTranslationKey","Audio","padding","minHeight","isPdf","toLowerCase","DocIcon","getAssetIcon","gap","direction","hasRadius","Typography","variant"],"mappings":"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"}
@@ -90,11 +90,13 @@ const LoaderOverlay = styled(Flex)`
90
90
  };
91
91
  const AssetPreview = ({ asset, actions, isLoading = false })=>{
92
92
  const { formatMessage } = useIntl();
93
- const { alternativeText, ext, mime, url, updatedAt } = asset;
93
+ const { alternativeText, ext, mime, url, updatedAt, isUrlSigned, isLocal } = asset;
94
94
  // Append the asset's `updatedAt` as a cache-buster so a freshly replaced
95
95
  // file (often served at the same URL) shows the new content instead of the
96
- // browser-cached old version.
97
- const cacheKey = updatedAt ? new Date(updatedAt).getTime() : undefined;
96
+ // browser-cached old version. Signed URLs are excluded: their query string
97
+ // is part of the SigV4 signature, so appending a param invalidates the
98
+ // signature and the request fails with 403. See #26581.
99
+ const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;
98
100
  const appendCacheBuster = (raw)=>{
99
101
  if (!raw || cacheKey === undefined) return raw;
100
102
  return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;
@@ -141,6 +143,7 @@ const AssetPreview = ({ asset, actions, isLoading = false })=>{
141
143
  ref: imageRef,
142
144
  src: imageUrl,
143
145
  alt: alternativeText || asset.name || '',
146
+ crossOrigin: !isLocal && isUrlSigned ? 'anonymous' : undefined,
144
147
  onLoad: ()=>setIsMediaLoaded(true),
145
148
  onError: ()=>setIsMediaLoaded(true)
146
149
  })
@@ -1 +1 @@
1
- {"version":3,"file":"AssetPreview.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, Loader, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type {\n File,\n AssetWithPopulatedCreatedBy,\n} from '../../../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n aspect-ratio: 16 / 9;\n max-height: 24rem;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding: ${({ theme }) => theme.spaces[3]};\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst AssetContainer = styled(Flex)`\n justify-content: center;\n position: relative;\n z-index: 2;\n width: 100%;\n height: 100%;\n`;\n\nconst StyledImage = styled.img`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\n/**\n * Top-right overlay slot for image actions (crop). Sits above the\n * image (z-index 3 > AssetContainer 2) so the buttons stay clickable.\n */\nconst ActionsOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n right: ${({ theme }) => theme.spaces[3]};\n z-index: 3;\n`;\n\nconst StyledVideo = styled.video`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\nconst StyledAudio = styled.audio`\n width: 100%;\n`;\n\nconst StyledPdfIframe = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 200px;\n border: none;\n`;\n\nconst IconFallback = styled(Flex)`\n height: 100%;\n aspect-ratio: 1;\n width: auto;\n max-width: 100%;\n margin: 0 auto;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst LoaderOverlay = styled(Flex)`\n position: absolute;\n inset: 0;\n z-index: 1;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetLoader\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetLoader = () => {\n const { formatMessage } = useIntl();\n return (\n <LoaderOverlay justifyContent=\"center\" alignItems=\"center\">\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </LoaderOverlay>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreviewContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetPreviewProps {\n asset: File | AssetWithPopulatedCreatedBy;\n actions?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport const AssetPreview = ({ asset, actions, isLoading = false }: AssetPreviewProps) => {\n const { formatMessage } = useIntl();\n const { alternativeText, ext, mime, url, updatedAt } = asset;\n // Append the asset's `updatedAt` as a cache-buster so a freshly replaced\n // file (often served at the same URL) shows the new content instead of the\n // browser-cached old version.\n const cacheKey = updatedAt ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string | undefined) => {\n if (!raw || cacheKey === undefined) return raw;\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n const mediaUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n const [isMediaLoaded, setIsMediaLoaded] = React.useState(false);\n React.useEffect(() => {\n setIsMediaLoaded(false);\n }, [mediaUrl]);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n React.useEffect(() => {\n const image = imageRef.current;\n if (!image) return;\n const recompute = () => {\n const parent = image.parentElement;\n if (!parent) return;\n const c = parent.getBoundingClientRect();\n // offsetWidth/Height = pre-transform layout box (transforms ignored).\n const w = image.offsetWidth;\n const h = image.offsetHeight;\n if (!w || !h || !c.width || !c.height) return;\n };\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(image);\n if (image.parentElement) ro.observe(image.parentElement);\n return () => ro.disconnect();\n }, [isMediaLoaded]);\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const imageUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n if (imageUrl) {\n return (\n <PreviewContainer>\n {(!isMediaLoaded || isLoading) && <AssetLoader />}\n {actions ? <ActionsOverlay>{actions}</ActionsOverlay> : null}\n <AssetContainer>\n <StyledImage\n ref={imageRef}\n src={imageUrl}\n alt={alternativeText || asset.name || ''}\n onLoad={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n }\n\n if (mime?.includes(ASSET_TYPES.Video) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledVideo\n src={mediaUrl}\n controls\n title={asset.name}\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.videoNotSupported'),\n defaultMessage: 'Your browser does not support the video tag.',\n })}\n </StyledVideo>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n if (mime?.includes(ASSET_TYPES.Audio) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <Flex\n width=\"100%\"\n padding={4}\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n minHeight=\"12rem\"\n >\n <StyledAudio\n src={mediaUrl}\n controls\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </Flex>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const isPdf =\n ext?.toLowerCase() === 'pdf' || ext?.toLowerCase() === '.pdf' || mime === 'application/pdf';\n if (isPdf && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledPdfIframe\n src={`${mediaUrl}#toolbar=0`}\n title={asset.name}\n onLoad={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n return (\n <PreviewContainer>\n <IconFallback\n justifyContent=\"center\"\n alignItems=\"center\"\n gap={1}\n direction=\"column\"\n hasRadius\n >\n <DocIcon width={24} height={24} />\n <Typography variant=\"pi\">\n {formatMessage({\n id: getTranslationKey('asset-details.noPreview'),\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </IconFallback>\n </PreviewContainer>\n );\n};\n"],"names":["PreviewContainer","styled","Box","theme","borderRadius","spaces","colors","neutral100","AssetContainer","Flex","StyledImage","img","ActionsOverlay","StyledVideo","video","StyledAudio","audio","StyledPdfIframe","iframe","IconFallback","neutral500","neutral150","LoaderOverlay","AssetLoader","formatMessage","useIntl","_jsx","justifyContent","alignItems","Loader","id","defaultMessage","AssetPreview","asset","actions","isLoading","alternativeText","ext","mime","url","updatedAt","cacheKey","Date","getTime","undefined","appendCacheBuster","raw","includes","mediaUrl","prefixFileUrlWithBackendUrl","isMediaLoaded","setIsMediaLoaded","React","useState","useEffect","imageRef","useRef","image","current","recompute","parent","parentElement","c","getBoundingClientRect","w","offsetWidth","h","offsetHeight","width","height","ro","ResizeObserver","observe","disconnect","ASSET_TYPES","Image","imageUrl","_jsxs","ref","src","alt","name","onLoad","onError","Video","controls","title","onLoadedData","getTranslationKey","Audio","padding","minHeight","isPdf","toLowerCase","DocIcon","getAssetIcon","gap","direction","hasRadius","Typography","variant"],"mappings":"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"}
1
+ {"version":3,"file":"AssetPreview.mjs","sources":["../../../../../../../admin/src/future/pages/Assets/components/AssetDetails/AssetPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Flex, Loader, Typography } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/files';\nimport { getAssetIcon } from '../../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../../utils/translations';\n\nimport type {\n File,\n AssetWithPopulatedCreatedBy,\n} from '../../../../../../../shared/contracts/files';\n\n/* -------------------------------------------------------------------------------------------------\n * Styled components\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n aspect-ratio: 16 / 9;\n max-height: 24rem;\n overflow: hidden;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding: ${({ theme }) => theme.spaces[3]};\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst AssetContainer = styled(Flex)`\n justify-content: center;\n position: relative;\n z-index: 2;\n width: 100%;\n height: 100%;\n`;\n\nconst StyledImage = styled.img`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\n/**\n * Top-right overlay slot for image actions (crop). Sits above the\n * image (z-index 3 > AssetContainer 2) so the buttons stay clickable.\n */\nconst ActionsOverlay = styled(Flex)`\n position: absolute;\n top: ${({ theme }) => theme.spaces[3]};\n right: ${({ theme }) => theme.spaces[3]};\n z-index: 3;\n`;\n\nconst StyledVideo = styled.video`\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n`;\n\nconst StyledAudio = styled.audio`\n width: 100%;\n`;\n\nconst StyledPdfIframe = styled.iframe`\n width: 100%;\n height: 100%;\n min-height: 200px;\n border: none;\n`;\n\nconst IconFallback = styled(Flex)`\n height: 100%;\n aspect-ratio: 1;\n width: auto;\n max-width: 100%;\n margin: 0 auto;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst LoaderOverlay = styled(Flex)`\n position: absolute;\n inset: 0;\n z-index: 1;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetLoader\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetLoader = () => {\n const { formatMessage } = useIntl();\n return (\n <LoaderOverlay justifyContent=\"center\" alignItems=\"center\">\n <Loader>{formatMessage({ id: 'app.loading', defaultMessage: 'Loading...' })}</Loader>\n </LoaderOverlay>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreviewContent\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetPreviewProps {\n asset: File | AssetWithPopulatedCreatedBy;\n actions?: React.ReactNode;\n isLoading?: boolean;\n}\n\nexport const AssetPreview = ({ asset, actions, isLoading = false }: AssetPreviewProps) => {\n const { formatMessage } = useIntl();\n const { alternativeText, ext, mime, url, updatedAt, isUrlSigned, isLocal } = asset;\n // Append the asset's `updatedAt` as a cache-buster so a freshly replaced\n // file (often served at the same URL) shows the new content instead of the\n // browser-cached old version. Signed URLs are excluded: their query string\n // is part of the SigV4 signature, so appending a param invalidates the\n // signature and the request fails with 403. See #26581.\n const cacheKey = updatedAt && !isUrlSigned ? new Date(updatedAt).getTime() : undefined;\n const appendCacheBuster = (raw: string | undefined) => {\n if (!raw || cacheKey === undefined) return raw;\n return raw.includes('?') ? `${raw}&v=${cacheKey}` : `${raw}?v=${cacheKey}`;\n };\n const mediaUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n const [isMediaLoaded, setIsMediaLoaded] = React.useState(false);\n React.useEffect(() => {\n setIsMediaLoaded(false);\n }, [mediaUrl]);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n React.useEffect(() => {\n const image = imageRef.current;\n if (!image) return;\n const recompute = () => {\n const parent = image.parentElement;\n if (!parent) return;\n const c = parent.getBoundingClientRect();\n // offsetWidth/Height = pre-transform layout box (transforms ignored).\n const w = image.offsetWidth;\n const h = image.offsetHeight;\n if (!w || !h || !c.width || !c.height) return;\n };\n recompute();\n const ro = new ResizeObserver(recompute);\n ro.observe(image);\n if (image.parentElement) ro.observe(image.parentElement);\n return () => ro.disconnect();\n }, [isMediaLoaded]);\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const imageUrl = appendCacheBuster(prefixFileUrlWithBackendUrl(url));\n\n if (imageUrl) {\n return (\n <PreviewContainer>\n {(!isMediaLoaded || isLoading) && <AssetLoader />}\n {actions ? <ActionsOverlay>{actions}</ActionsOverlay> : null}\n <AssetContainer>\n <StyledImage\n ref={imageRef}\n src={imageUrl}\n alt={alternativeText || asset.name || ''}\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n onLoad={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n }\n\n if (mime?.includes(ASSET_TYPES.Video) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledVideo\n src={mediaUrl}\n controls\n title={asset.name}\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n >\n {formatMessage({\n id: getTranslationKey('asset-details.videoNotSupported'),\n defaultMessage: 'Your browser does not support the video tag.',\n })}\n </StyledVideo>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n if (mime?.includes(ASSET_TYPES.Audio) && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <Flex\n width=\"100%\"\n padding={4}\n justifyContent=\"center\"\n alignItems=\"center\"\n height=\"100%\"\n minHeight=\"12rem\"\n >\n <StyledAudio\n src={mediaUrl}\n controls\n onLoadedData={() => setIsMediaLoaded(true)}\n onError={() => setIsMediaLoaded(true)}\n />\n </Flex>\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const isPdf =\n ext?.toLowerCase() === 'pdf' || ext?.toLowerCase() === '.pdf' || mime === 'application/pdf';\n if (isPdf && mediaUrl) {\n return (\n <PreviewContainer>\n {!isMediaLoaded && <AssetLoader />}\n <AssetContainer>\n <StyledPdfIframe\n src={`${mediaUrl}#toolbar=0`}\n title={asset.name}\n onLoad={() => setIsMediaLoaded(true)}\n />\n </AssetContainer>\n </PreviewContainer>\n );\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n return (\n <PreviewContainer>\n <IconFallback\n justifyContent=\"center\"\n alignItems=\"center\"\n gap={1}\n direction=\"column\"\n hasRadius\n >\n <DocIcon width={24} height={24} />\n <Typography variant=\"pi\">\n {formatMessage({\n id: getTranslationKey('asset-details.noPreview'),\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </IconFallback>\n </PreviewContainer>\n );\n};\n"],"names":["PreviewContainer","styled","Box","theme","borderRadius","spaces","colors","neutral100","AssetContainer","Flex","StyledImage","img","ActionsOverlay","StyledVideo","video","StyledAudio","audio","StyledPdfIframe","iframe","IconFallback","neutral500","neutral150","LoaderOverlay","AssetLoader","formatMessage","useIntl","_jsx","justifyContent","alignItems","Loader","id","defaultMessage","AssetPreview","asset","actions","isLoading","alternativeText","ext","mime","url","updatedAt","isUrlSigned","isLocal","cacheKey","Date","getTime","undefined","appendCacheBuster","raw","includes","mediaUrl","prefixFileUrlWithBackendUrl","isMediaLoaded","setIsMediaLoaded","React","useState","useEffect","imageRef","useRef","image","current","recompute","parent","parentElement","c","getBoundingClientRect","w","offsetWidth","h","offsetHeight","width","height","ro","ResizeObserver","observe","disconnect","ASSET_TYPES","Image","imageUrl","_jsxs","ref","src","alt","name","crossOrigin","onLoad","onError","Video","controls","title","onLoadedData","getTranslationKey","Audio","padding","minHeight","isPdf","toLowerCase","DocIcon","getAssetIcon","gap","direction","hasRadius","Typography","variant"],"mappings":"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"}
@@ -162,7 +162,7 @@ const IconPreview = styledComponents.styled(designSystem.Flex)`
162
162
  background: ${({ theme })=>theme.colors.neutral100};
163
163
  `;
164
164
  const AssetPreview = ({ asset })=>{
165
- const { alternativeText, ext, formats, mime, url } = asset;
165
+ const { alternativeText, ext, formats, mime, url, isLocal, isUrlSigned } = asset;
166
166
  if (mime?.includes(enums.ASSET_TYPES.Image)) {
167
167
  const mediaURL = files.prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? files.prefixFileUrlWithBackendUrl(url);
168
168
  if (mediaURL) {
@@ -170,6 +170,10 @@ const AssetPreview = ({ asset })=>{
170
170
  children: /*#__PURE__*/ jsxRuntime.jsx(StyledImage, {
171
171
  src: mediaURL,
172
172
  alt: alternativeText || '',
173
+ // Only signed remote URLs need crossOrigin (cache collision with
174
+ // the preview). Public/unsigned remote thumbnails must render
175
+ // without a bucket CORS rule. See #26581.
176
+ crossOrigin: !isLocal && isUrlSigned ? 'anonymous' : undefined,
173
177
  draggable: false,
174
178
  onDragStart: (e)=>e.preventDefault()
175
179
  })
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsGrid.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsGrid.js","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url, isLocal, isUrlSigned } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n // Only signed remote URLs need crossOrigin (cache collision with\n // the preview). Public/unsigned remote thumbnails must render\n // without a bucket CORS rule. See #26581.\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","isLocal","isUrlSigned","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","crossOrigin","undefined","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
@@ -160,7 +160,7 @@ const IconPreview = styled(Flex)`
160
160
  background: ${({ theme })=>theme.colors.neutral100};
161
161
  `;
162
162
  const AssetPreview = ({ asset })=>{
163
- const { alternativeText, ext, formats, mime, url } = asset;
163
+ const { alternativeText, ext, formats, mime, url, isLocal, isUrlSigned } = asset;
164
164
  if (mime?.includes(ASSET_TYPES.Image)) {
165
165
  const mediaURL = prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);
166
166
  if (mediaURL) {
@@ -168,6 +168,10 @@ const AssetPreview = ({ asset })=>{
168
168
  children: /*#__PURE__*/ jsx(StyledImage, {
169
169
  src: mediaURL,
170
170
  alt: alternativeText || '',
171
+ // Only signed remote URLs need crossOrigin (cache collision with
172
+ // the preview). Public/unsigned remote thumbnails must render
173
+ // without a bucket CORS rule. See #26581.
174
+ crossOrigin: !isLocal && isUrlSigned ? 'anonymous' : undefined,
171
175
  draggable: false,
172
176
  onDragStart: (e)=>e.preventDefault()
173
177
  })
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsGrid.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsGrid.mjs","sources":["../../../../../../admin/src/future/pages/Assets/components/AssetsGrid.tsx"],"sourcesContent":["import {\n Box,\n Card,\n CardBody,\n CardHeader,\n Flex,\n Grid,\n IconButton,\n Typography,\n} from '@strapi/design-system';\nimport { Folder as FolderIcon, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled, css } from 'styled-components';\n\nimport { ASSET_TYPES } from '../../../../enums';\nimport { prefixFileUrlWithBackendUrl } from '../../../utils/files';\nimport { getAssetIcon } from '../../../utils/getAssetIcon';\nimport { getTranslationKey } from '../../../utils/translations';\nimport { useFolderNavigation } from '../hooks/useFolderNavigation';\n\nimport { useAssetsDndOptional } from './Dnd/AssetsDndProvider';\nimport { useFileDraggable, useFolderDraggableDroppable } from './Dnd/useAssetDnd';\n\nimport type { File } from '../../../../../../shared/contracts/files';\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCard = styled(Card)<{ $isDragging?: boolean; $isMovePending?: boolean }>`\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: 8px;\n overflow: hidden;\n cursor: ${({ $isMovePending }) => ($isMovePending ? 'wait' : 'pointer')};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FolderCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst FoldersRow = styled(Box)`\n grid-column: 1 / -1;\n`;\n\nconst StyledFolderCard = styled(Flex)<{\n $isDragging?: boolean;\n $isMovePending?: boolean;\n $isValidDropTarget?: boolean;\n $isInvalidDropTarget?: boolean;\n}>`\n width: 100%;\n padding: ${({ theme }) => `${theme.spaces[2]} ${theme.spaces[3]}`}; // 8px 12px\n align-items: center;\n gap: ${({ theme }) => theme.spaces[2]}; // 8px\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n background: ${({ theme }) => theme.colors.neutral0};\n cursor: ${({ $isMovePending, $isInvalidDropTarget }) => {\n if ($isMovePending) {\n return 'wait';\n }\n\n return $isInvalidDropTarget ? 'not-allowed' : 'pointer';\n }};\n opacity: ${({ $isDragging }) => ($isDragging ? 0.4 : 1)};\n pointer-events: ${({ $isMovePending }) => ($isMovePending ? 'none' : 'auto')};\n transition: background 0.2s;\n\n ${({ $isValidDropTarget, theme }) =>\n $isValidDropTarget &&\n css`\n background: ${theme.colors.primary100};\n border: 1px dashed ${theme.colors.primary600};\n `}\n\n &:hover {\n background: ${({ theme }) => theme.colors.primary100};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ theme }) => theme.colors.primary600};\n outline-offset: 2px;\n }\n`;\n\nconst FolderIconContainer = styled(Flex)`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.neutral600};\n`;\n\nconst FolderName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface FolderCardProps {\n folder: Folder;\n}\n\nconst FolderCard = ({ folder }: FolderCardProps) => {\n const { formatMessage } = useIntl();\n const { navigateToFolder } = useFolderNavigation();\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const {\n draggable: { attributes, listeners, setNodeRef: setDragRef, isDragging },\n droppable: { setNodeRef: setDropRef },\n showValidDropHighlight,\n showInvalidDropCursor,\n } = useFolderDraggableDroppable(folder);\n\n const setNodeRef = (node: HTMLElement | null) => {\n setDragRef(node);\n setDropRef(node);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateToFolder(folder);\n }\n };\n\n return (\n <StyledFolderCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n $isValidDropTarget={showValidDropHighlight}\n $isInvalidDropTarget={showInvalidDropCursor}\n onClick={() => navigateToFolder(folder)}\n onKeyDown={handleKeyDown}\n role=\"listitem\"\n tabIndex={0}\n >\n <FolderIconContainer>\n <FolderIcon width={20} height={20} />\n </FolderIconContainer>\n <FolderName textColor=\"neutral800\" ellipsis>\n {folder.name}\n </FolderName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </StyledFolderCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetPreview\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewContainer = styled(Box)`\n position: relative;\n width: 100%;\n padding-bottom: 62.5%;\n height: 0;\n overflow: hidden;\n background: repeating-conic-gradient(\n ${({ theme }) => theme.colors.neutral100} 0% 25%,\n transparent 0% 50%\n )\n 50% / 20px 20px;\n`;\n\nconst StyledImage = styled.img`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n`;\n\nconst IconPreview = styled(Flex)`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: ${({ theme }) => theme.colors.neutral500};\n background: ${({ theme }) => theme.colors.neutral100};\n`;\n\ninterface AssetPreviewProps {\n asset: File;\n}\n\nconst AssetPreview = ({ asset }: AssetPreviewProps) => {\n const { alternativeText, ext, formats, mime, url, isLocal, isUrlSigned } = asset;\n\n if (mime?.includes(ASSET_TYPES.Image)) {\n const mediaURL =\n prefixFileUrlWithBackendUrl(formats?.thumbnail?.url) ?? prefixFileUrlWithBackendUrl(url);\n\n if (mediaURL) {\n return (\n <PreviewContainer>\n <StyledImage\n src={mediaURL}\n alt={alternativeText || ''}\n // Only signed remote URLs need crossOrigin (cache collision with\n // the preview). Public/unsigned remote thumbnails must render\n // without a bucket CORS rule. See #26581.\n crossOrigin={!isLocal && isUrlSigned ? 'anonymous' : undefined}\n draggable={false}\n onDragStart={(e) => e.preventDefault()}\n />\n </PreviewContainer>\n );\n }\n }\n\n const DocIcon = getAssetIcon(mime, ext);\n\n return (\n <PreviewContainer>\n <IconPreview justifyContent=\"center\" alignItems=\"center\">\n <DocIcon width={48} height={48} />\n </IconPreview>\n </PreviewContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardHeader = styled(CardHeader)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n`;\n\nconst CardFooter = styled(Flex)`\n min-width: 0;\n width: 100%;\n`;\n\nconst FileTypeIcon = styled(Flex)`\n color: ${({ theme }) => theme.colors.neutral600};\n flex-shrink: 0;\n`;\n\nconst FileName = styled(Typography)`\n flex: 1;\n min-width: 0;\n`;\n\ninterface AssetCardProps {\n asset: File;\n onAssetItemClick: (assetId: number) => void;\n}\n\nconst AssetCard = ({ asset, onAssetItemClick }: AssetCardProps) => {\n const { formatMessage } = useIntl();\n const TypeIcon = getAssetIcon(asset.mime, asset.ext);\n const { isMovePending } = useAssetsDndOptional() ?? { isMovePending: false };\n const { attributes, listeners, setNodeRef, isDragging } = useFileDraggable(asset);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAssetItemClick(asset.id);\n }\n };\n\n return (\n <StyledCard\n ref={setNodeRef}\n {...attributes}\n {...listeners}\n $isDragging={isDragging}\n $isMovePending={isMovePending}\n tabIndex={0}\n role=\"listitem\"\n onDragStart={(e) => e.preventDefault()}\n onClick={() => onAssetItemClick(asset.id)}\n onKeyDown={handleKeyDown}\n >\n <StyledCardHeader>\n <AssetPreview asset={asset} />\n </StyledCardHeader>\n <CardBody>\n <CardFooter alignItems=\"center\" gap={2}>\n <FileTypeIcon>\n <TypeIcon width={20} height={20} />\n </FileTypeIcon>\n <FileName textColor=\"primary800\" ellipsis>\n {asset.name}\n </FileName>\n <IconButton\n label={formatMessage({\n id: getTranslationKey('control-card.more-actions'),\n defaultMessage: 'More actions',\n })}\n variant=\"ghost\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <More />\n </IconButton>\n </CardFooter>\n </CardBody>\n </StyledCard>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetsGrid\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetsGridProps {\n assets: File[];\n folders?: Folder[];\n onAssetItemClick: (assetId: number) => void;\n}\n\nexport const AssetsGrid = ({ assets, folders = [], onAssetItemClick }: AssetsGridProps) => {\n const { formatMessage } = useIntl();\n\n const totalItems = folders.length + assets.length;\n\n if (totalItems === 0) {\n return (\n <Box padding={8}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n </Typography>\n </Box>\n );\n }\n\n return (\n <Grid.Root gap={4} role=\"list\" data-testid=\"assets-grid\">\n {folders.length > 0 && (\n <FoldersRow>\n <Grid.Root gap={4}>\n {folders.map((folder) => (\n <Grid.Item col={3} m={4} s={6} xs={12} key={`folder-${folder.id}`}>\n <FolderCard folder={folder} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </FoldersRow>\n )}\n {assets.map((asset) => (\n <Grid.Item\n col={3}\n m={4}\n s={6}\n xs={12}\n key={asset.id}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <AssetCard asset={asset} onAssetItemClick={onAssetItemClick} />\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n"],"names":["StyledCard","styled","Card","theme","colors","neutral200","$isMovePending","$isDragging","primary100","primary600","FoldersRow","Box","StyledFolderCard","Flex","spaces","borderRadius","neutral0","$isInvalidDropTarget","$isValidDropTarget","css","FolderIconContainer","neutral600","FolderName","Typography","FolderCard","folder","formatMessage","useIntl","navigateToFolder","useFolderNavigation","isMovePending","useAssetsDndOptional","draggable","attributes","listeners","setNodeRef","setDragRef","isDragging","droppable","setDropRef","showValidDropHighlight","showInvalidDropCursor","useFolderDraggableDroppable","node","handleKeyDown","e","key","preventDefault","_jsxs","ref","onClick","onKeyDown","role","tabIndex","_jsx","FolderIcon","width","height","textColor","ellipsis","name","IconButton","label","id","getTranslationKey","defaultMessage","variant","stopPropagation","More","PreviewContainer","neutral100","StyledImage","img","IconPreview","neutral500","AssetPreview","asset","alternativeText","ext","formats","mime","url","isLocal","isUrlSigned","includes","ASSET_TYPES","Image","mediaURL","prefixFileUrlWithBackendUrl","thumbnail","src","alt","crossOrigin","undefined","onDragStart","DocIcon","getAssetIcon","justifyContent","alignItems","StyledCardHeader","CardHeader","CardFooter","FileTypeIcon","FileName","AssetCard","onAssetItemClick","TypeIcon","useFileDraggable","CardBody","gap","AssetsGrid","assets","folders","totalItems","length","padding","Grid","Root","data-testid","map","Item","col","m","s","xs","direction"],"mappings":"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"}
@@ -7,6 +7,7 @@ interface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'chil
7
7
  alt: string;
8
8
  updatedAt?: string;
9
9
  isUrlSigned: boolean;
10
+ crossOrigin?: 'anonymous' | 'use-credentials';
10
11
  }
11
- export declare const ImageAssetCard: ({ height, width, thumbnail, size, alt, isUrlSigned, selected, ...props }: ImageAssetCardProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const ImageAssetCard: ({ height, width, thumbnail, size, alt, isUrlSigned, crossOrigin, selected, ...props }: ImageAssetCardProps) => import("react/jsx-runtime").JSX.Element;
12
13
  export {};
@@ -1,4 +1,4 @@
1
1
  export declare const useAIAvailability: () => {
2
- status: "error" | "success" | "idle" | "loading";
2
+ status: "loading" | "success" | "error" | "idle";
3
3
  isEnabled: boolean | undefined;
4
4
  };
@@ -12,7 +12,7 @@ export declare const useEditAsset: () => {
12
12
  cancel: () => void;
13
13
  editAsset: (asset: FileAsset, file: File) => Promise<FileAsset>;
14
14
  progress: number;
15
- status: "error" | "success" | "idle" | "loading";
15
+ status: "loading" | "success" | "error" | "idle";
16
16
  data: undefined;
17
17
  error: null;
18
18
  isError: false;
@@ -39,7 +39,7 @@ export declare const useEditAsset: () => {
39
39
  cancel: () => void;
40
40
  editAsset: (asset: FileAsset, file: File) => Promise<FileAsset>;
41
41
  progress: number;
42
- status: "error" | "success" | "idle" | "loading";
42
+ status: "loading" | "success" | "error" | "idle";
43
43
  data: undefined;
44
44
  error: null;
45
45
  isError: false;
@@ -66,7 +66,7 @@ export declare const useEditAsset: () => {
66
66
  cancel: () => void;
67
67
  editAsset: (asset: FileAsset, file: File) => Promise<FileAsset>;
68
68
  progress: number;
69
- status: "error" | "success" | "idle" | "loading";
69
+ status: "loading" | "success" | "error" | "idle";
70
70
  data: undefined;
71
71
  error: ErrorMutation;
72
72
  isError: true;
@@ -93,7 +93,7 @@ export declare const useEditAsset: () => {
93
93
  cancel: () => void;
94
94
  editAsset: (asset: FileAsset, file: File) => Promise<FileAsset>;
95
95
  progress: number;
96
- status: "error" | "success" | "idle" | "loading";
96
+ status: "loading" | "success" | "error" | "idle";
97
97
  data: FileAsset;
98
98
  error: null;
99
99
  isError: false;
@@ -6,7 +6,7 @@ interface EditFolderRequestParams {
6
6
  }
7
7
  export declare const useEditFolder: () => {
8
8
  editFolder: (attrs: EditFolderRequestParams["attrs"], id?: EditFolderRequestParams["id"]) => Promise<import("../../../shared/contracts/folders").Folder>;
9
- status: "error" | "success" | "idle" | "loading";
9
+ status: "loading" | "success" | "error" | "idle";
10
10
  data: undefined;
11
11
  error: null;
12
12
  isError: false;
@@ -22,7 +22,7 @@ export declare const useEditFolder: () => {
22
22
  mutateAsync: import("react-query").UseMutateAsyncFunction<import("../../../shared/contracts/folders").Folder, import("@strapi/utils/dist/errors").ApplicationError<"ApplicationError", string, unknown> | import("@strapi/utils/dist/errors").NotFoundError<string, unknown> | import("@strapi/utils/dist/errors").ValidationError<string, unknown> | undefined, EditFolderRequestParams, unknown>;
23
23
  } | {
24
24
  editFolder: (attrs: EditFolderRequestParams["attrs"], id?: EditFolderRequestParams["id"]) => Promise<import("../../../shared/contracts/folders").Folder>;
25
- status: "error" | "success" | "idle" | "loading";
25
+ status: "loading" | "success" | "error" | "idle";
26
26
  data: undefined;
27
27
  error: null;
28
28
  isError: false;
@@ -38,7 +38,7 @@ export declare const useEditFolder: () => {
38
38
  mutateAsync: import("react-query").UseMutateAsyncFunction<import("../../../shared/contracts/folders").Folder, import("@strapi/utils/dist/errors").ApplicationError<"ApplicationError", string, unknown> | import("@strapi/utils/dist/errors").NotFoundError<string, unknown> | import("@strapi/utils/dist/errors").ValidationError<string, unknown> | undefined, EditFolderRequestParams, unknown>;
39
39
  } | {
40
40
  editFolder: (attrs: EditFolderRequestParams["attrs"], id?: EditFolderRequestParams["id"]) => Promise<import("../../../shared/contracts/folders").Folder>;
41
- status: "error" | "success" | "idle" | "loading";
41
+ status: "loading" | "success" | "error" | "idle";
42
42
  data: undefined;
43
43
  error: import("@strapi/utils/dist/errors").ApplicationError<"ApplicationError", string, unknown> | import("@strapi/utils/dist/errors").NotFoundError<string, unknown> | import("@strapi/utils/dist/errors").ValidationError<string, unknown> | undefined;
44
44
  isError: true;
@@ -54,7 +54,7 @@ export declare const useEditFolder: () => {
54
54
  mutateAsync: import("react-query").UseMutateAsyncFunction<import("../../../shared/contracts/folders").Folder, import("@strapi/utils/dist/errors").ApplicationError<"ApplicationError", string, unknown> | import("@strapi/utils/dist/errors").NotFoundError<string, unknown> | import("@strapi/utils/dist/errors").ValidationError<string, unknown> | undefined, EditFolderRequestParams, unknown>;
55
55
  } | {
56
56
  editFolder: (attrs: EditFolderRequestParams["attrs"], id?: EditFolderRequestParams["id"]) => Promise<import("../../../shared/contracts/folders").Folder>;
57
- status: "error" | "success" | "idle" | "loading";
57
+ status: "loading" | "success" | "error" | "idle";
58
58
  data: import("../../../shared/contracts/folders").Folder;
59
59
  error: null;
60
60
  isError: false;
@@ -10,6 +10,6 @@ export declare const useUpload: () => {
10
10
  cancel: () => void;
11
11
  error: import("@strapi/utils/dist/errors").ApplicationError<"ApplicationError", string, unknown> | import("@strapi/utils/dist/errors").ValidationError<string, unknown> | null | undefined;
12
12
  progress: number;
13
- status: "error" | "success" | "idle" | "loading";
13
+ status: "loading" | "success" | "error" | "idle";
14
14
  };
15
15
  export {};