@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
@@ -206,7 +206,13 @@ const Asset = ({ assetType, thumbnailUrl, assetUrl, asset })=>{
206
206
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
207
207
  src: thumbnailUrl,
208
208
  size: "S",
209
- alt: asset.alternativeText || asset.name
209
+ alt: asset.alternativeText || asset.name,
210
+ // AI assets are always remote; only gate crossOrigin on whether the
211
+ // URL is signed. A signed URL is loaded without a cache-buster, so it
212
+ // can collide with the preview in the browser cache and both must opt
213
+ // into CORS. Unsigned (public) URLs must render without a bucket CORS
214
+ // rule. See #26581.
215
+ crossOrigin: asset.isUrlSigned ? 'anonymous' : undefined
210
216
  });
211
217
  case enums.ASSET_TYPES.Video:
212
218
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
@@ -1 +1 @@
1
- {"version":3,"file":"AIAssetCard.js","sources":["../../../../admin/src/ai/components/AIAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Card,\n CardAction,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CardTimer,\n Field,\n Flex,\n Grid,\n TextInput,\n Typography,\n IconButton,\n Dialog,\n Modal,\n} from '@strapi/design-system';\nimport { Pencil, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AudioPreview } from '../../components/AssetCard/AudioPreview';\nimport { VideoPreview } from '../../components/AssetCard/VideoPreview';\nimport { type Asset, EditAssetContent } from '../../components/EditAssetDialog/EditAssetContent';\nimport { AssetType, ASSET_TYPES, DocType, DOC_TYPES } from '../../enums';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\nimport {\n formatBytes,\n formatDuration,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { useAIUploadModalContext } from './AIUploadModal';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n z-index: 1;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardActions\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetCardActions = ({ asset }: { asset: File }) => {\n const { formatMessage } = useIntl();\n const dispatch = useAIUploadModalContext('AssetCardActions', (s) => s.dispatch);\n const state = useAIUploadModalContext('AssetCardActions', (s) => s.state);\n const onClose = useAIUploadModalContext('AssetCardActions', (s) => s.onClose);\n const { canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n\n const [isEditModalOpen, setIsEditModalOpen] = React.useState(false);\n\n const { removeAsset } = useRemoveAsset(() => {});\n\n const handleConfirmRemove = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event?.preventDefault();\n await removeAsset(asset.id);\n dispatch({\n type: 'remove_uploaded_asset',\n payload: { id: asset.id },\n });\n\n // Close modal if this was the last asset\n if (state.uploadedAssets.length === 1) {\n onClose();\n }\n };\n\n const handlePropagationClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditAsset = (editedAsset?: File | null) => {\n if (editedAsset) {\n dispatch({\n type: 'edit_uploaded_asset',\n payload: { editedAsset },\n });\n\n setIsEditModalOpen(false);\n }\n };\n\n return (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n\n <Modal.Root open={isEditModalOpen} onOpenChange={setIsEditModalOpen}>\n <Modal.Trigger>\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n >\n <Pencil />\n </IconButton>\n </Modal.Trigger>\n <Modal.Content>\n <EditAssetContent\n // Is Local must be set to false to trigger the correct branch of logic in the EditAssetContent on submit\n asset={\n {\n ...asset,\n isLocal: false,\n folder: typeof asset.folder === 'number' ? { id: asset.folder } : asset.folder,\n } as Asset\n }\n onClose={(arg) => handleEditAsset(arg as File)}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n omitFields={['caption', 'alternativeText']}\n omitActions={['replace']}\n />\n </Modal.Content>\n </Modal.Root>\n </CardActionsContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Asset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetProps {\n assetType: AssetType | DocType;\n thumbnailUrl: string;\n assetUrl: string;\n asset: File;\n}\n\ninterface AssetCardProps {\n asset: File;\n onCaptionChange: (caption: string) => void;\n onAltTextChange: (altText: string) => void;\n wasCaptionChanged: boolean;\n wasAltTextChanged: boolean;\n}\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n position: relative;\n height: 100%;\n overflow: hidden;\n\n canvas,\n video {\n display: block;\n pointer-events: none;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ${({ theme }) => theme.borderRadius};\n }\n`;\n\nconst VideoTimerOverlay = styled(CardTimer)`\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n`;\n\nconst Asset = ({ assetType, thumbnailUrl, assetUrl, asset }: AssetProps) => {\n const [duration, setDuration] = React.useState<number>();\n const formattedDuration = duration ? formatDuration(duration) : undefined;\n\n switch (assetType) {\n case ASSET_TYPES.Image:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n case ASSET_TYPES.Video:\n return (\n <CardAsset size=\"S\">\n <VideoPreviewWrapper>\n <VideoPreview\n url={assetUrl}\n mime={asset.mime || 'video/mp4'}\n onLoadDuration={setDuration}\n alt={asset.alternativeText || asset.name}\n />\n {formattedDuration && <VideoTimerOverlay>{formattedDuration}</VideoTimerOverlay>}\n </VideoPreviewWrapper>\n </CardAsset>\n );\n case ASSET_TYPES.Audio:\n return (\n <CardAsset size=\"S\">\n <AudioPreviewWrapper>\n <AudioPreview url={assetUrl} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n </CardAsset>\n );\n default:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardBody = styled(CardBody)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[2]} ${({ theme }) => theme.spaces[1]};\n`;\n\nconst StyledCard = styled(Card)`\n width: 100%;\n height: 100%;\n border: none;\n box-shadow: none;\n border-radius: 0;\n padding: 0;\n`;\n\nconst getAssetBadgeLabel = (assetType: AssetType | DocType) => {\n switch (assetType) {\n case ASSET_TYPES.Image:\n return { id: getTrad('settings.section.image.label'), defaultMessage: 'IMAGE' };\n case ASSET_TYPES.Video:\n return { id: getTrad('settings.section.video.label'), defaultMessage: 'VIDEO' };\n case ASSET_TYPES.Audio:\n return { id: getTrad('settings.section.audio.label'), defaultMessage: 'AUDIO' };\n case DOC_TYPES.Pdf:\n return { id: getTrad('settings.section.pdf.label'), defaultMessage: 'PDF' };\n case DOC_TYPES.Csv:\n return { id: getTrad('settings.section.csv.label'), defaultMessage: 'CSV' };\n case DOC_TYPES.Xls:\n return { id: getTrad('settings.section.xls.label'), defaultMessage: 'XLS' };\n case DOC_TYPES.Zip:\n return { id: getTrad('settings.section.zip.label'), defaultMessage: 'ZIP' };\n default:\n return { id: getTrad('settings.section.doc.label'), defaultMessage: 'DOC' };\n }\n};\n\nexport const AIAssetCard = ({\n asset,\n onCaptionChange,\n onAltTextChange,\n wasAltTextChanged,\n wasCaptionChanged,\n}: AssetCardProps) => {\n const { formatMessage } = useIntl();\n\n const assetType = typeFromMime(asset.mime || '');\n const thumbnailUrl =\n prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url) || '';\n const assetUrl = prefixFileUrlWithBackendUrl(asset.url) || '';\n const subtitle = asset.height && asset.width ? ` - ${asset.width}x${asset.height}` : '';\n const formattedSize = asset.size ? formatBytes(asset.size) : '';\n const fullSubtitle = `${subtitle}${subtitle && formattedSize ? ' - ' : ''}${formattedSize}`;\n\n const [caption, setCaption] = React.useState(asset.caption || '');\n React.useEffect(() => {\n onCaptionChange(caption);\n }, [caption, onCaptionChange]);\n\n const [altText, setAltText] = React.useState(asset.alternativeText || '');\n React.useEffect(() => {\n onAltTextChange(altText);\n }, [altText, onAltTextChange]);\n\n return (\n <CardContainer>\n <Grid.Root>\n <Grid.Item m={5} xs={12} alignItems=\"stretch\">\n <StyledCard width=\"100%\" height=\"100%\" shadow=\"none\" borderRadius={0} padding={0}>\n <CardHeader style={{ borderStyle: 'none' }}>\n <AssetCardActions asset={asset} />\n <Asset\n assetType={assetType}\n thumbnailUrl={thumbnailUrl}\n assetUrl={assetUrl}\n asset={asset}\n />\n </CardHeader>\n <StyledCardBody>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\">\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n <CardBadge>{formatMessage(getAssetBadgeLabel(assetType))}</CardBadge>\n </Flex>\n <Flex>\n <CardSubtitle>\n <Extension>{getFileExtension(asset.ext)}</Extension>\n {fullSubtitle}\n </CardSubtitle>\n </Flex>\n </CardContent>\n </StyledCardBody>\n </StyledCard>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Field.Root name=\"caption\">\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n </Flex>\n <TextInput\n value={caption}\n onChange={(e) => setCaption(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-caption'),\n defaultMessage: 'Enter caption',\n })}\n endAction={\n !wasCaptionChanged &&\n asset.caption && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.description.file-alt'),\n defaultMessage: \"This text will be displayed if the asset can't be shown.\",\n })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n </Flex>\n\n <TextInput\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-alt'),\n defaultMessage: 'Enter alternative text',\n })}\n endAction={\n !wasAltTextChanged &&\n asset.alternativeText && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n <Field.Hint />\n </Field.Root>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </CardContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardSkeletons\n * -----------------------------------------------------------------------------------------------*/\n\nconst SkeletonBox = styled(Box)<{ width?: string; height?: string }>`\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.neutral100} 25%,\n ${({ theme }) => theme.colors.neutral150} 50%,\n ${({ theme }) => theme.colors.neutral100} 75%\n );\n background-size: 200% 100%;\n animation: loading 1.5s infinite;\n border-radius: ${({ theme }) => theme.borderRadius};\n width: ${({ width }) => width || '100%'};\n height: ${({ height }) => height || '1rem'};\n\n @keyframes loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n`;\n\nexport const AIAssetCardSkeletons = ({ count = 1 }: { count?: number }) => {\n const skeletons = Array.from({ length: count }, (_, i) => i);\n\n return skeletons.map((index) => (\n <Box\n key={index}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderRadius=\"4px\"\n marginBottom={4}\n >\n <Grid.Root>\n <Grid.Item col={5} alignItems=\"stretch\">\n <Card\n height=\"100%\"\n width=\"100%\"\n borderStyle=\"none\"\n shadow=\"none\"\n borderRadius={0}\n padding={2}\n >\n <Box height=\"150px\" padding={2}>\n <SkeletonBox height=\"100%\" />\n </Box>\n <CardBody style={{ display: 'flex', padding: '8px 4px' }}>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\" marginBottom={1}>\n <SkeletonBox width=\"60%\" height=\"18px\" />\n <SkeletonBox width=\"40px\" height=\"16px\" />\n </Flex>\n <SkeletonBox width=\"80%\" height=\"14px\" />\n </CardContent>\n </CardBody>\n </Card>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Box>\n <SkeletonBox width=\"60px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n </Box>\n\n <Box>\n <SkeletonBox width=\"100px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n <Box marginTop={1}>\n <SkeletonBox width=\"70%\" height=\"12px\" />\n </Box>\n </Box>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </Box>\n ));\n};\n"],"names":["CardActionsContainer","styled","CardAction","CardContainer","Box","theme","colors","neutral0","neutral150","borderRadius","AssetCardActions","asset","formatMessage","useIntl","dispatch","useAIUploadModalContext","s","state","onClose","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","isEditModalOpen","setIsEditModalOpen","React","useState","removeAsset","useRemoveAsset","handleConfirmRemove","event","preventDefault","id","type","payload","uploadedAssets","length","handlePropagationClick","stopPropagation","handleEditAsset","editedAsset","_jsxs","onClick","position","Dialog","Root","_jsx","Trigger","IconButton","label","getTrad","defaultMessage","Trash","ConfirmDialog","onConfirm","Modal","open","onOpenChange","Pencil","Content","EditAssetContent","isLocal","folder","arg","omitFields","omitActions","Extension","span","VideoPreviewWrapper","VideoTimerOverlay","CardTimer","AudioPreviewWrapper","Asset","assetType","thumbnailUrl","assetUrl","duration","setDuration","formattedDuration","formatDuration","undefined","ASSET_TYPES","Image","CardAsset","src","size","alt","alternativeText","name","Video","VideoPreview","url","mime","onLoadDuration","Audio","AudioPreview","StyledCardBody","CardBody","spaces","StyledCard","Card","getAssetBadgeLabel","DOC_TYPES","Pdf","Csv","Xls","Zip","AIAssetCard","onCaptionChange","onAltTextChange","wasAltTextChanged","wasCaptionChanged","typeFromMime","prefixFileUrlWithBackendUrl","formats","thumbnail","subtitle","height","width","formattedSize","formatBytes","fullSubtitle","caption","setCaption","useEffect","altText","setAltText","Grid","Item","m","xs","alignItems","shadow","padding","CardHeader","style","borderStyle","CardContent","Flex","justifyContent","Typography","tag","CardTitle","CardBadge","CardSubtitle","getFileExtension","ext","flex","direction","gap","Field","Label","TextInput","value","onChange","e","target","placeholder","endAction","Sparkle","fill","hint","Hint","SkeletonBox","neutral100","AIAssetCardSkeletons","count","skeletons","Array","from","_","i","map","index","background","borderColor","borderWidth","marginBottom","col","display","marginTop"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAMA,oBAAAA,GAAuBC,uBAAAA,CAAOC,uBAAAA,CAAW;;;;;;;AAO/C,CAAC;AAED,MAAMC,aAAAA,GAAgBF,uBAAAA,CAAOG,gBAAAA,CAAI;cACnB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;oBACjC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;;;AAGjD,IAAA,EAAET,oBAAAA,CAAqB;;;;AAI3B,CAAC;AAED;;AAEkG,qGAElG,MAAMU,gBAAAA,GAAmB,CAAC,EAAEC,KAAK,EAAmB,GAAA;IAClD,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAWC,qCAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEF,QAAQ,CAAA;AAC9E,IAAA,MAAMG,QAAQF,qCAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEC,KAAK,CAAA;AACxE,IAAA,MAAMC,UAAUH,qCAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEE,OAAO,CAAA;AAC5E,IAAA,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,qDAAAA,EAAAA;AAEhD,IAAA,MAAM,CAACC,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AAE7D,IAAA,MAAM,EAAEC,WAAW,EAAE,GAAGC,8BAAe,IAAA,CAAO,CAAA,CAAA;AAE9C,IAAA,MAAMC,sBAAsB,OAAOC,KAAAA,GAAAA;QACjCA,KAAAA,EAAOC,cAAAA,EAAAA;QACP,MAAMJ,WAAAA,CAAYhB,MAAMqB,EAAE,CAAA;QAC1BlB,QAAAA,CAAS;YACPmB,IAAAA,EAAM,uBAAA;YACNC,OAAAA,EAAS;AAAEF,gBAAAA,EAAAA,EAAIrB,MAAMqB;AAAG;AAC1B,SAAA,CAAA;;AAGA,QAAA,IAAIf,KAAAA,CAAMkB,cAAc,CAACC,MAAM,KAAK,CAAA,EAAG;AACrClB,YAAAA,OAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMmB,yBAAyB,CAACP,KAAAA,GAAAA;AAC9BA,QAAAA,KAAAA,CAAMQ,eAAe,EAAA;AACvB,IAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkB,CAACC,WAAAA,GAAAA;AACvB,QAAA,IAAIA,WAAAA,EAAa;YACf1B,QAAAA,CAAS;gBACPmB,IAAAA,EAAM,qBAAA;gBACNC,OAAAA,EAAS;AAAEM,oBAAAA;AAAY;AACzB,aAAA,CAAA;YAEAhB,kBAAAA,CAAmB,KAAA,CAAA;AACrB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEiB,eAAA,CAACzC,oBAAAA,EAAAA;QAAqB0C,OAAAA,EAASL,sBAAAA;QAAwBM,QAAAA,EAAS,KAAA;;AAC9D,0BAAAF,eAAA,CAACG,oBAAOC,IAAI,EAAA;;AACV,kCAAAC,cAAA,CAACF,oBAAOG,OAAO,EAAA;AACb,wBAAA,QAAA,gBAAAD,cAAA,CAACE,uBAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOrC,aAAAA,CAAc;AACnBoB,gCAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,+BAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;AAEA,4BAAA,QAAA,gBAAAL,cAAA,CAACM,WAAAA,EAAAA,EAAAA;;;kCAGLN,cAAA,CAACO,yBAAAA,EAAAA;wBAAcC,SAAAA,EAAWzB;;;;AAG5B,0BAAAY,eAAA,CAACc,mBAAMV,IAAI,EAAA;gBAACW,IAAAA,EAAMjC,eAAAA;gBAAiBkC,YAAAA,EAAcjC,kBAAAA;;AAC/C,kCAAAsB,cAAA,CAACS,mBAAMR,OAAO,EAAA;AACZ,wBAAA,QAAA,gBAAAD,cAAA,CAACE,uBAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOrC,aAAAA,CAAc;AAAEoB,gCAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,mBAAA,CAAA;gCAAsBC,cAAAA,EAAgB;AAAO,6BAAA,CAAA;AAEhF,4BAAA,QAAA,gBAAAL,cAAA,CAACY,YAAAA,EAAAA,EAAAA;;;AAGL,kCAAAZ,cAAA,CAACS,mBAAMI,OAAO,EAAA;AACZ,wBAAA,QAAA,gBAAAb,cAAA,CAACc,iCAAAA,EAAAA;;4BAECjD,KAAAA,EACE;AACE,gCAAA,GAAGA,KAAK;gCACRkD,OAAAA,EAAS,KAAA;AACTC,gCAAAA,MAAAA,EAAQ,OAAOnD,KAAAA,CAAMmD,MAAM,KAAK,QAAA,GAAW;AAAE9B,oCAAAA,EAAAA,EAAIrB,MAAMmD;AAAO,iCAAA,GAAInD,MAAMmD;AAC1E,6BAAA;4BAEF5C,OAAAA,EAAS,CAAC6C,MAAQxB,eAAAA,CAAgBwB,GAAAA,CAAAA;4BAClC5C,SAAAA,EAAWA,SAAAA;4BACXC,WAAAA,EAAaA,WAAAA;4BACbC,WAAAA,EAAaA,WAAAA;4BACb2C,UAAAA,EAAY;AAAC,gCAAA,SAAA;AAAW,gCAAA;AAAkB,6BAAA;4BAC1CC,WAAAA,EAAa;AAAC,gCAAA;AAAU;;;;;;;AAMpC,CAAA;AAqBA,MAAMC,SAAAA,GAAYjE,uBAAAA,CAAOkE,IAAI;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBnE,uBAAAA,CAAOG,gBAAAA,CAAI;;;;;;;;;;;;AAYpB,mBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;;AAEvD,CAAC;AAED,MAAM4D,iBAAAA,GAAoBpE,uBAAAA,CAAOqE,sBAAAA,CAAU;;;;AAI3C,CAAC;AAED,MAAMC,mBAAAA,GAAsBtE,uBAAAA,CAAOG,gBAAAA,CAAI;;;;;;;;;;;;;AAavC,CAAC;AAED,MAAMoE,KAAAA,GAAQ,CAAC,EAAEC,SAAS,EAAEC,YAAY,EAAEC,QAAQ,EAAEhE,KAAK,EAAc,GAAA;AACrE,IAAA,MAAM,CAACiE,QAAAA,EAAUC,WAAAA,CAAY,GAAGpD,iBAAMC,QAAQ,EAAA;IAC9C,MAAMoD,iBAAAA,GAAoBF,QAAAA,GAAWG,6BAAAA,CAAeH,QAAAA,CAAAA,GAAYI,SAAAA;IAEhE,OAAQP,SAAAA;AACN,QAAA,KAAKQ,kBAAYC,KAAK;AACpB,YAAA,qBAAOpC,cAAA,CAACqC,sBAAAA,EAAAA;gBAAUC,GAAAA,EAAKV,YAAAA;gBAAcW,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AACpF,QAAA,KAAKP,kBAAYQ,KAAK;AACpB,YAAA,qBACE3C,cAAA,CAACqC,sBAAAA,EAAAA;gBAAUE,IAAAA,EAAK,GAAA;AACd,gBAAA,QAAA,gBAAA5C,eAAA,CAAC2B,mBAAAA,EAAAA;;sCACCtB,cAAA,CAAC4C,yBAAAA,EAAAA;4BACCC,GAAAA,EAAKhB,QAAAA;4BACLiB,IAAAA,EAAMjF,KAAAA,CAAMiF,IAAI,IAAI,WAAA;4BACpBC,cAAAA,EAAgBhB,WAAAA;AAChBS,4BAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AAErCV,wBAAAA,iBAAAA,kBAAqBhC,cAAA,CAACuB,iBAAAA,EAAAA;AAAmBS,4BAAAA,QAAAA,EAAAA;;;;;AAIlD,QAAA,KAAKG,kBAAYa,KAAK;AACpB,YAAA,qBACEhD,cAAA,CAACqC,sBAAAA,EAAAA;gBAAUE,IAAAA,EAAK,GAAA;AACd,gBAAA,QAAA,gBAAAvC,cAAA,CAACyB,mBAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAzB,cAAA,CAACiD,yBAAAA,EAAAA;wBAAaJ,GAAAA,EAAKhB,QAAAA;AAAUW,wBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;;;AAIzE,QAAA;AACE,YAAA,qBAAO1C,cAAA,CAACqC,sBAAAA,EAAAA;gBAAUC,GAAAA,EAAKV,YAAAA;gBAAcW,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AACtF;AACF,CAAA;AAEA;;AAEkG,qGAElG,MAAMQ,cAAAA,GAAiB/F,uBAAAA,CAAOgG,qBAAAA,CAAS;;WAE5B,EAAE,CAAC,EAAE5F,KAAK,EAAE,GAAKA,KAAAA,CAAM6F,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAE,CAAC,EAAE7F,KAAK,EAAE,GAAKA,KAAAA,CAAM6F,MAAM,CAAC,CAAA,CAAE,CAAC;AAC9E,CAAC;AAED,MAAMC,UAAAA,GAAalG,uBAAAA,CAAOmG,iBAAAA,CAAK;;;;;;;AAO/B,CAAC;AAED,MAAMC,qBAAqB,CAAC5B,SAAAA,GAAAA;IAC1B,OAAQA,SAAAA;AACN,QAAA,KAAKQ,kBAAYC,KAAK;YACpB,OAAO;AAAElD,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAK8B,kBAAYQ,KAAK;YACpB,OAAO;AAAEzD,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAK8B,kBAAYa,KAAK;YACpB,OAAO;AAAE9D,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAKmD,gBAAUC,GAAG;YAChB,OAAO;AAAEvE,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,gBAAUE,GAAG;YAChB,OAAO;AAAExE,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,gBAAUG,GAAG;YAChB,OAAO;AAAEzE,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,gBAAUI,GAAG;YAChB,OAAO;AAAE1E,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA;YACE,OAAO;AAAEnB,gBAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC9E;AACF,CAAA;AAEO,MAAMwD,WAAAA,GAAc,CAAC,EAC1BhG,KAAK,EACLiG,eAAe,EACfC,eAAe,EACfC,iBAAiB,EACjBC,iBAAiB,EACF,GAAA;IACf,MAAM,EAAEnG,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,MAAM4D,SAAAA,GAAYuC,yBAAAA,CAAarG,KAAAA,CAAMiF,IAAI,IAAI,EAAA,CAAA;IAC7C,MAAMlB,YAAAA,GACJuC,wDAA4BtG,KAAAA,EAAOuG,OAAAA,EAASC,WAAWxB,GAAAA,IAAOhF,KAAAA,CAAMgF,GAAG,CAAA,IAAK,EAAA;AAC9E,IAAA,MAAMhB,QAAAA,GAAWsC,uDAAAA,CAA4BtG,KAAAA,CAAMgF,GAAG,CAAA,IAAK,EAAA;AAC3D,IAAA,MAAMyB,WAAWzG,KAAAA,CAAM0G,MAAM,IAAI1G,KAAAA,CAAM2G,KAAK,GAAG,CAAC,GAAG,EAAE3G,KAAAA,CAAM2G,KAAK,CAAC,CAAC,EAAE3G,KAAAA,CAAM0G,MAAM,EAAE,GAAG,EAAA;AACrF,IAAA,MAAME,gBAAgB5G,KAAAA,CAAM0E,IAAI,GAAGmC,uBAAAA,CAAY7G,KAAAA,CAAM0E,IAAI,CAAA,GAAI,EAAA;AAC7D,IAAA,MAAMoC,eAAe,CAAA,EAAGL,QAAAA,CAAAA,EAAWA,YAAYG,aAAAA,GAAgB,KAAA,GAAQ,KAAKA,aAAAA,CAAAA,CAAe;IAE3F,MAAM,CAACG,SAASC,UAAAA,CAAW,GAAGlG,iBAAMC,QAAQ,CAACf,KAAAA,CAAM+G,OAAO,IAAI,EAAA,CAAA;AAC9DjG,IAAAA,gBAAAA,CAAMmG,SAAS,CAAC,IAAA;QACdhB,eAAAA,CAAgBc,OAAAA,CAAAA;IAClB,CAAA,EAAG;AAACA,QAAAA,OAAAA;AAASd,QAAAA;AAAgB,KAAA,CAAA;IAE7B,MAAM,CAACiB,SAASC,UAAAA,CAAW,GAAGrG,iBAAMC,QAAQ,CAACf,KAAAA,CAAM4E,eAAe,IAAI,EAAA,CAAA;AACtE9D,IAAAA,gBAAAA,CAAMmG,SAAS,CAAC,IAAA;QACdf,eAAAA,CAAgBgB,OAAAA,CAAAA;IAClB,CAAA,EAAG;AAACA,QAAAA,OAAAA;AAAShB,QAAAA;AAAgB,KAAA,CAAA;AAE7B,IAAA,qBACE/D,cAAA,CAAC3C,aAAAA,EAAAA;gCACCsC,eAAA,CAACsF,kBAAKlF,IAAI,EAAA;;AACR,8BAAAC,cAAA,CAACiF,kBAAKC,IAAI,EAAA;oBAACC,CAAAA,EAAG,CAAA;oBAAGC,EAAAA,EAAI,EAAA;oBAAIC,UAAAA,EAAW,SAAA;AAClC,oBAAA,QAAA,gBAAA1F,eAAA,CAAC0D,UAAAA,EAAAA;wBAAWmB,KAAAA,EAAM,MAAA;wBAAOD,MAAAA,EAAO,MAAA;wBAAOe,MAAAA,EAAO,MAAA;wBAAO3H,YAAAA,EAAc,CAAA;wBAAG4H,OAAAA,EAAS,CAAA;;0CAC7E5F,eAAA,CAAC6F,uBAAAA,EAAAA;gCAAWC,KAAAA,EAAO;oCAAEC,WAAAA,EAAa;AAAO,iCAAA;;kDACvC1F,cAAA,CAACpC,gBAAAA,EAAAA;wCAAiBC,KAAAA,EAAOA;;kDACzBmC,cAAA,CAAC0B,KAAAA,EAAAA;wCACCC,SAAAA,EAAWA,SAAAA;wCACXC,YAAAA,EAAcA,YAAAA;wCACdC,QAAAA,EAAUA,QAAAA;wCACVhE,KAAAA,EAAOA;;;;0CAGXmC,cAAA,CAACkD,cAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAvD,eAAA,CAACgG,wBAAAA,EAAAA;oCAAYnB,KAAAA,EAAM,MAAA;;sDACjB7E,eAAA,CAACiG,iBAAAA,EAAAA;4CAAKC,cAAAA,EAAe,eAAA;4CAAgBR,UAAAA,EAAW,OAAA;;8DAC9CrF,cAAA,CAAC8F,uBAAAA,EAAAA;oDAAWC,GAAAA,EAAI,IAAA;AACd,oDAAA,QAAA,gBAAA/F,cAAA,CAACgG,sBAAAA,EAAAA;wDAAUD,GAAAA,EAAI,MAAA;AAAQlI,wDAAAA,QAAAA,EAAAA,KAAAA,CAAM6E;;;8DAE/B1C,cAAA,CAACiG,sBAAAA,EAAAA;AAAWnI,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcyF,kBAAAA,CAAmB5B,SAAAA,CAAAA;;;;sDAE/C3B,cAAA,CAAC4F,iBAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAjG,eAAA,CAACuG,yBAAAA,EAAAA;;kEACClG,cAAA,CAACoB,SAAAA,EAAAA;AAAW+E,wDAAAA,QAAAA,EAAAA,iCAAAA,CAAiBtI,MAAMuI,GAAG;;AACrCzB,oDAAAA;;;;;;;;;;AAQb,8BAAA3E,cAAA,CAACiF,kBAAKC,IAAI,EAAA;oBAACC,CAAAA,EAAG,CAAA;oBAAGC,EAAAA,EAAI,EAAA;oBAAIiB,IAAAA,EAAM,CAAA;AAC7B,oBAAA,QAAA,gBAAA1G,eAAA,CAACiG,iBAAAA,EAAAA;wBAAKU,SAAAA,EAAU,QAAA;wBAAS/B,MAAAA,EAAO,MAAA;wBAAOc,UAAAA,EAAW,SAAA;wBAAUgB,IAAAA,EAAM,CAAA;wBAAGd,OAAAA,EAAS,CAAA;wBAAGgB,GAAAA,EAAK,CAAA;;AACpF,0CAAA5G,eAAA,CAAC6G,mBAAMzG,IAAI,EAAA;gCAAC2C,IAAAA,EAAK,SAAA;;kDACf1C,cAAA,CAAC4F,iBAAAA,EAAAA;wCAAKP,UAAAA,EAAW,QAAA;wCAASkB,GAAAA,EAAK,CAAA;gEAC7BvG,cAAA,CAACwG,mBAAMC,KAAK,EAAA;sDACT3I,aAAAA,CAAc;AACboB,gDAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,+BAAA,CAAA;gDACZC,cAAAA,EAAgB;AAClB,6CAAA;;;kDAGJL,cAAA,CAAC0G,sBAAAA,EAAAA;wCACCC,KAAAA,EAAO/B,OAAAA;AACPgC,wCAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAMhC,UAAAA,CAAWgC,CAAAA,CAAEC,MAAM,CAACH,KAAK,CAAA;AAC1CI,wCAAAA,WAAAA,EAAajJ,aAAAA,CAAc;AACzBoB,4CAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,qCAAA,CAAA;4CACZC,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACA2G,wCAAAA,SAAAA,EACE,CAAC/C,iBAAAA,IACDpG,KAAAA,CAAM+G,OAAO,kBAAI5E,cAAA,CAACiH,aAAAA,EAAAA;4CAAQzC,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO2C,IAAAA,EAAK;;wCAE5D/H,IAAAA,EAAK;;;;AAIT,0CAAAQ,eAAA,CAAC6G,mBAAMzG,IAAI,EAAA;gCACT2C,IAAAA,EAAK,iBAAA;AACLyE,gCAAAA,IAAAA,EAAMrJ,aAAAA,CAAc;AAClBoB,oCAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,iCAAA,CAAA;oCACZC,cAAAA,EAAgB;AAClB,iCAAA,CAAA;;kDAEAL,cAAA,CAAC4F,iBAAAA,EAAAA;wCAAKP,UAAAA,EAAW,QAAA;wCAASkB,GAAAA,EAAK,CAAA;gEAC7BvG,cAAA,CAACwG,mBAAMC,KAAK,EAAA;sDACT3I,aAAAA,CAAc;AACboB,gDAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,2BAAA,CAAA;gDACZC,cAAAA,EAAgB;AAClB,6CAAA;;;kDAIJL,cAAA,CAAC0G,sBAAAA,EAAAA;wCACCC,KAAAA,EAAO5B,OAAAA;AACP6B,wCAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAM7B,UAAAA,CAAW6B,CAAAA,CAAEC,MAAM,CAACH,KAAK,CAAA;AAC1CI,wCAAAA,WAAAA,EAAajJ,aAAAA,CAAc;AACzBoB,4CAAAA,EAAAA,EAAIkB,eAAAA,CAAQ,iCAAA,CAAA;4CACZC,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACA2G,wCAAAA,SAAAA,EACE,CAAChD,iBAAAA,IACDnG,KAAAA,CAAM4E,eAAe,kBAAIzC,cAAA,CAACiH,aAAAA,EAAAA;4CAAQzC,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO2C,IAAAA,EAAK;;wCAEpE/H,IAAAA,EAAK;;AAEP,kDAAAa,cAAA,CAACwG,mBAAMY,IAAI,EAAA,EAAA;;;;;;;;;AAOzB;AAEA;;AAEkG,qGAElG,MAAMC,WAAAA,GAAclK,uBAAAA,CAAOG,gBAAAA,CAAyC;;;IAGhE,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8J,UAAU,CAAC;IACzC,EAAE,CAAC,EAAE/J,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;IACzC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8J,UAAU,CAAC;;;;AAI5B,iBAAA,EAAE,CAAC,EAAE/J,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;AAC5C,SAAA,EAAE,CAAC,EAAE6G,KAAK,EAAE,GAAKA,SAAS,MAAA,CAAO;AAChC,UAAA,EAAE,CAAC,EAAED,MAAM,EAAE,GAAKA,UAAU,MAAA,CAAO;;;;;;;;;;AAU7C,CAAC;MAEYgD,oBAAAA,GAAuB,CAAC,EAAEC,KAAAA,GAAQ,CAAC,EAAsB,GAAA;IACpE,MAAMC,SAAAA,GAAYC,KAAAA,CAAMC,IAAI,CAAC;QAAErI,MAAAA,EAAQkI;KAAM,EAAG,CAACI,GAAGC,CAAAA,GAAMA,CAAAA,CAAAA;AAE1D,IAAA,OAAOJ,SAAAA,CAAUK,GAAG,CAAC,CAACC,sBACpB/H,cAAA,CAAC1C,gBAAAA,EAAAA;YAEC0K,UAAAA,EAAW,UAAA;YACXC,WAAAA,EAAY,YAAA;YACZvC,WAAAA,EAAY,OAAA;YACZwC,WAAAA,EAAY,KAAA;YACZvK,YAAAA,EAAa,KAAA;YACbwK,YAAAA,EAAc,CAAA;oCAEdxI,eAAA,CAACsF,kBAAKlF,IAAI,EAAA;;AACR,kCAAAC,cAAA,CAACiF,kBAAKC,IAAI,EAAA;wBAACkD,GAAAA,EAAK,CAAA;wBAAG/C,UAAAA,EAAW,SAAA;AAC5B,wBAAA,QAAA,gBAAA1F,eAAA,CAAC2D,iBAAAA,EAAAA;4BACCiB,MAAAA,EAAO,MAAA;4BACPC,KAAAA,EAAM,MAAA;4BACNkB,WAAAA,EAAY,MAAA;4BACZJ,MAAAA,EAAO,MAAA;4BACP3H,YAAAA,EAAc,CAAA;4BACd4H,OAAAA,EAAS,CAAA;;8CAETvF,cAAA,CAAC1C,gBAAAA,EAAAA;oCAAIiH,MAAAA,EAAO,OAAA;oCAAQgB,OAAAA,EAAS,CAAA;AAC3B,oCAAA,QAAA,gBAAAvF,cAAA,CAACqH,WAAAA,EAAAA;wCAAY9C,MAAAA,EAAO;;;8CAEtBvE,cAAA,CAACmD,qBAAAA,EAAAA;oCAASsC,KAAAA,EAAO;wCAAE4C,OAAAA,EAAS,MAAA;wCAAQ9C,OAAAA,EAAS;AAAU,qCAAA;AACrD,oCAAA,QAAA,gBAAA5F,eAAA,CAACgG,wBAAAA,EAAAA;wCAAYnB,KAAAA,EAAM,MAAA;;0DACjB7E,eAAA,CAACiG,iBAAAA,EAAAA;gDAAKC,cAAAA,EAAe,eAAA;gDAAgBR,UAAAA,EAAW,OAAA;gDAAQ8C,YAAAA,EAAc,CAAA;;kEACpEnI,cAAA,CAACqH,WAAAA,EAAAA;wDAAY7C,KAAAA,EAAM,KAAA;wDAAMD,MAAAA,EAAO;;kEAChCvE,cAAA,CAACqH,WAAAA,EAAAA;wDAAY7C,KAAAA,EAAM,MAAA;wDAAOD,MAAAA,EAAO;;;;0DAEnCvE,cAAA,CAACqH,WAAAA,EAAAA;gDAAY7C,KAAAA,EAAM,KAAA;gDAAMD,MAAAA,EAAO;;;;;;;;AAMxC,kCAAAvE,cAAA,CAACiF,kBAAKC,IAAI,EAAA;wBAACC,CAAAA,EAAG,CAAA;wBAAGC,EAAAA,EAAI,EAAA;wBAAIiB,IAAAA,EAAM,CAAA;AAC7B,wBAAA,QAAA,gBAAA1G,eAAA,CAACiG,iBAAAA,EAAAA;4BAAKU,SAAAA,EAAU,QAAA;4BAAS/B,MAAAA,EAAO,MAAA;4BAAOc,UAAAA,EAAW,SAAA;4BAAUgB,IAAAA,EAAM,CAAA;4BAAGd,OAAAA,EAAS,CAAA;4BAAGgB,GAAAA,EAAK,CAAA;;8CACpF5G,eAAA,CAACrC,gBAAAA,EAAAA;;sDACC0C,cAAA,CAACqH,WAAAA,EAAAA;4CAAY7C,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO4D,YAAAA,EAAc;;sDACtDnI,cAAA,CAACqH,WAAAA,EAAAA;4CAAY9C,MAAAA,EAAO;;;;8CAGtB5E,eAAA,CAACrC,gBAAAA,EAAAA;;sDACC0C,cAAA,CAACqH,WAAAA,EAAAA;4CAAY7C,KAAAA,EAAM,OAAA;4CAAQD,MAAAA,EAAO,MAAA;4CAAO4D,YAAAA,EAAc;;sDACvDnI,cAAA,CAACqH,WAAAA,EAAAA;4CAAY9C,MAAAA,EAAO;;sDACpBvE,cAAA,CAAC1C,gBAAAA,EAAAA;4CAAIgL,SAAAA,EAAW,CAAA;AACd,4CAAA,QAAA,gBAAAtI,cAAA,CAACqH,WAAAA,EAAAA;gDAAY7C,KAAAA,EAAM,KAAA;gDAAMD,MAAAA,EAAO;;;;;;;;;;AA5CrCwD,SAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AAoDX;;;;;"}
1
+ {"version":3,"file":"AIAssetCard.js","sources":["../../../../admin/src/ai/components/AIAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Card,\n CardAction,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CardTimer,\n Field,\n Flex,\n Grid,\n TextInput,\n Typography,\n IconButton,\n Dialog,\n Modal,\n} from '@strapi/design-system';\nimport { Pencil, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AudioPreview } from '../../components/AssetCard/AudioPreview';\nimport { VideoPreview } from '../../components/AssetCard/VideoPreview';\nimport { type Asset, EditAssetContent } from '../../components/EditAssetDialog/EditAssetContent';\nimport { AssetType, ASSET_TYPES, DocType, DOC_TYPES } from '../../enums';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\nimport {\n formatBytes,\n formatDuration,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { useAIUploadModalContext } from './AIUploadModal';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n z-index: 1;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardActions\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetCardActions = ({ asset }: { asset: File }) => {\n const { formatMessage } = useIntl();\n const dispatch = useAIUploadModalContext('AssetCardActions', (s) => s.dispatch);\n const state = useAIUploadModalContext('AssetCardActions', (s) => s.state);\n const onClose = useAIUploadModalContext('AssetCardActions', (s) => s.onClose);\n const { canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n\n const [isEditModalOpen, setIsEditModalOpen] = React.useState(false);\n\n const { removeAsset } = useRemoveAsset(() => {});\n\n const handleConfirmRemove = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event?.preventDefault();\n await removeAsset(asset.id);\n dispatch({\n type: 'remove_uploaded_asset',\n payload: { id: asset.id },\n });\n\n // Close modal if this was the last asset\n if (state.uploadedAssets.length === 1) {\n onClose();\n }\n };\n\n const handlePropagationClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditAsset = (editedAsset?: File | null) => {\n if (editedAsset) {\n dispatch({\n type: 'edit_uploaded_asset',\n payload: { editedAsset },\n });\n\n setIsEditModalOpen(false);\n }\n };\n\n return (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n\n <Modal.Root open={isEditModalOpen} onOpenChange={setIsEditModalOpen}>\n <Modal.Trigger>\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n >\n <Pencil />\n </IconButton>\n </Modal.Trigger>\n <Modal.Content>\n <EditAssetContent\n // Is Local must be set to false to trigger the correct branch of logic in the EditAssetContent on submit\n asset={\n {\n ...asset,\n isLocal: false,\n folder: typeof asset.folder === 'number' ? { id: asset.folder } : asset.folder,\n } as Asset\n }\n onClose={(arg) => handleEditAsset(arg as File)}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n omitFields={['caption', 'alternativeText']}\n omitActions={['replace']}\n />\n </Modal.Content>\n </Modal.Root>\n </CardActionsContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Asset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetProps {\n assetType: AssetType | DocType;\n thumbnailUrl: string;\n assetUrl: string;\n asset: File;\n}\n\ninterface AssetCardProps {\n asset: File;\n onCaptionChange: (caption: string) => void;\n onAltTextChange: (altText: string) => void;\n wasCaptionChanged: boolean;\n wasAltTextChanged: boolean;\n}\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n position: relative;\n height: 100%;\n overflow: hidden;\n\n canvas,\n video {\n display: block;\n pointer-events: none;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ${({ theme }) => theme.borderRadius};\n }\n`;\n\nconst VideoTimerOverlay = styled(CardTimer)`\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n`;\n\nconst Asset = ({ assetType, thumbnailUrl, assetUrl, asset }: AssetProps) => {\n const [duration, setDuration] = React.useState<number>();\n const formattedDuration = duration ? formatDuration(duration) : undefined;\n\n switch (assetType) {\n case ASSET_TYPES.Image:\n return (\n <CardAsset\n src={thumbnailUrl}\n size=\"S\"\n alt={asset.alternativeText || asset.name}\n // AI assets are always remote; only gate crossOrigin on whether the\n // URL is signed. A signed URL is loaded without a cache-buster, so it\n // can collide with the preview in the browser cache and both must opt\n // into CORS. Unsigned (public) URLs must render without a bucket CORS\n // rule. See #26581.\n crossOrigin={asset.isUrlSigned ? 'anonymous' : undefined}\n />\n );\n case ASSET_TYPES.Video:\n return (\n <CardAsset size=\"S\">\n <VideoPreviewWrapper>\n <VideoPreview\n url={assetUrl}\n mime={asset.mime || 'video/mp4'}\n onLoadDuration={setDuration}\n alt={asset.alternativeText || asset.name}\n />\n {formattedDuration && <VideoTimerOverlay>{formattedDuration}</VideoTimerOverlay>}\n </VideoPreviewWrapper>\n </CardAsset>\n );\n case ASSET_TYPES.Audio:\n return (\n <CardAsset size=\"S\">\n <AudioPreviewWrapper>\n <AudioPreview url={assetUrl} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n </CardAsset>\n );\n default:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardBody = styled(CardBody)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[2]} ${({ theme }) => theme.spaces[1]};\n`;\n\nconst StyledCard = styled(Card)`\n width: 100%;\n height: 100%;\n border: none;\n box-shadow: none;\n border-radius: 0;\n padding: 0;\n`;\n\nconst getAssetBadgeLabel = (assetType: AssetType | DocType) => {\n switch (assetType) {\n case ASSET_TYPES.Image:\n return { id: getTrad('settings.section.image.label'), defaultMessage: 'IMAGE' };\n case ASSET_TYPES.Video:\n return { id: getTrad('settings.section.video.label'), defaultMessage: 'VIDEO' };\n case ASSET_TYPES.Audio:\n return { id: getTrad('settings.section.audio.label'), defaultMessage: 'AUDIO' };\n case DOC_TYPES.Pdf:\n return { id: getTrad('settings.section.pdf.label'), defaultMessage: 'PDF' };\n case DOC_TYPES.Csv:\n return { id: getTrad('settings.section.csv.label'), defaultMessage: 'CSV' };\n case DOC_TYPES.Xls:\n return { id: getTrad('settings.section.xls.label'), defaultMessage: 'XLS' };\n case DOC_TYPES.Zip:\n return { id: getTrad('settings.section.zip.label'), defaultMessage: 'ZIP' };\n default:\n return { id: getTrad('settings.section.doc.label'), defaultMessage: 'DOC' };\n }\n};\n\nexport const AIAssetCard = ({\n asset,\n onCaptionChange,\n onAltTextChange,\n wasAltTextChanged,\n wasCaptionChanged,\n}: AssetCardProps) => {\n const { formatMessage } = useIntl();\n\n const assetType = typeFromMime(asset.mime || '');\n const thumbnailUrl =\n prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url) || '';\n const assetUrl = prefixFileUrlWithBackendUrl(asset.url) || '';\n const subtitle = asset.height && asset.width ? ` - ${asset.width}x${asset.height}` : '';\n const formattedSize = asset.size ? formatBytes(asset.size) : '';\n const fullSubtitle = `${subtitle}${subtitle && formattedSize ? ' - ' : ''}${formattedSize}`;\n\n const [caption, setCaption] = React.useState(asset.caption || '');\n React.useEffect(() => {\n onCaptionChange(caption);\n }, [caption, onCaptionChange]);\n\n const [altText, setAltText] = React.useState(asset.alternativeText || '');\n React.useEffect(() => {\n onAltTextChange(altText);\n }, [altText, onAltTextChange]);\n\n return (\n <CardContainer>\n <Grid.Root>\n <Grid.Item m={5} xs={12} alignItems=\"stretch\">\n <StyledCard width=\"100%\" height=\"100%\" shadow=\"none\" borderRadius={0} padding={0}>\n <CardHeader style={{ borderStyle: 'none' }}>\n <AssetCardActions asset={asset} />\n <Asset\n assetType={assetType}\n thumbnailUrl={thumbnailUrl}\n assetUrl={assetUrl}\n asset={asset}\n />\n </CardHeader>\n <StyledCardBody>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\">\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n <CardBadge>{formatMessage(getAssetBadgeLabel(assetType))}</CardBadge>\n </Flex>\n <Flex>\n <CardSubtitle>\n <Extension>{getFileExtension(asset.ext)}</Extension>\n {fullSubtitle}\n </CardSubtitle>\n </Flex>\n </CardContent>\n </StyledCardBody>\n </StyledCard>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Field.Root name=\"caption\">\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n </Flex>\n <TextInput\n value={caption}\n onChange={(e) => setCaption(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-caption'),\n defaultMessage: 'Enter caption',\n })}\n endAction={\n !wasCaptionChanged &&\n asset.caption && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.description.file-alt'),\n defaultMessage: \"This text will be displayed if the asset can't be shown.\",\n })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n </Flex>\n\n <TextInput\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-alt'),\n defaultMessage: 'Enter alternative text',\n })}\n endAction={\n !wasAltTextChanged &&\n asset.alternativeText && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n <Field.Hint />\n </Field.Root>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </CardContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardSkeletons\n * -----------------------------------------------------------------------------------------------*/\n\nconst SkeletonBox = styled(Box)<{ width?: string; height?: string }>`\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.neutral100} 25%,\n ${({ theme }) => theme.colors.neutral150} 50%,\n ${({ theme }) => theme.colors.neutral100} 75%\n );\n background-size: 200% 100%;\n animation: loading 1.5s infinite;\n border-radius: ${({ theme }) => theme.borderRadius};\n width: ${({ width }) => width || '100%'};\n height: ${({ height }) => height || '1rem'};\n\n @keyframes loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n`;\n\nexport const AIAssetCardSkeletons = ({ count = 1 }: { count?: number }) => {\n const skeletons = Array.from({ length: count }, (_, i) => i);\n\n return skeletons.map((index) => (\n <Box\n key={index}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderRadius=\"4px\"\n marginBottom={4}\n >\n <Grid.Root>\n <Grid.Item col={5} alignItems=\"stretch\">\n <Card\n height=\"100%\"\n width=\"100%\"\n borderStyle=\"none\"\n shadow=\"none\"\n borderRadius={0}\n padding={2}\n >\n <Box height=\"150px\" padding={2}>\n <SkeletonBox height=\"100%\" />\n </Box>\n <CardBody style={{ display: 'flex', padding: '8px 4px' }}>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\" marginBottom={1}>\n <SkeletonBox width=\"60%\" height=\"18px\" />\n <SkeletonBox width=\"40px\" height=\"16px\" />\n </Flex>\n <SkeletonBox width=\"80%\" height=\"14px\" />\n </CardContent>\n </CardBody>\n </Card>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Box>\n <SkeletonBox width=\"60px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n </Box>\n\n <Box>\n <SkeletonBox width=\"100px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n <Box marginTop={1}>\n <SkeletonBox width=\"70%\" height=\"12px\" />\n </Box>\n </Box>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </Box>\n ));\n};\n"],"names":["CardActionsContainer","styled","CardAction","CardContainer","Box","theme","colors","neutral0","neutral150","borderRadius","AssetCardActions","asset","formatMessage","useIntl","dispatch","useAIUploadModalContext","s","state","onClose","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","isEditModalOpen","setIsEditModalOpen","React","useState","removeAsset","useRemoveAsset","handleConfirmRemove","event","preventDefault","id","type","payload","uploadedAssets","length","handlePropagationClick","stopPropagation","handleEditAsset","editedAsset","_jsxs","onClick","position","Dialog","Root","_jsx","Trigger","IconButton","label","getTrad","defaultMessage","Trash","ConfirmDialog","onConfirm","Modal","open","onOpenChange","Pencil","Content","EditAssetContent","isLocal","folder","arg","omitFields","omitActions","Extension","span","VideoPreviewWrapper","VideoTimerOverlay","CardTimer","AudioPreviewWrapper","Asset","assetType","thumbnailUrl","assetUrl","duration","setDuration","formattedDuration","formatDuration","undefined","ASSET_TYPES","Image","CardAsset","src","size","alt","alternativeText","name","crossOrigin","isUrlSigned","Video","VideoPreview","url","mime","onLoadDuration","Audio","AudioPreview","StyledCardBody","CardBody","spaces","StyledCard","Card","getAssetBadgeLabel","DOC_TYPES","Pdf","Csv","Xls","Zip","AIAssetCard","onCaptionChange","onAltTextChange","wasAltTextChanged","wasCaptionChanged","typeFromMime","prefixFileUrlWithBackendUrl","formats","thumbnail","subtitle","height","width","formattedSize","formatBytes","fullSubtitle","caption","setCaption","useEffect","altText","setAltText","Grid","Item","m","xs","alignItems","shadow","padding","CardHeader","style","borderStyle","CardContent","Flex","justifyContent","Typography","tag","CardTitle","CardBadge","CardSubtitle","getFileExtension","ext","flex","direction","gap","Field","Label","TextInput","value","onChange","e","target","placeholder","endAction","Sparkle","fill","hint","Hint","SkeletonBox","neutral100","AIAssetCardSkeletons","count","skeletons","Array","from","_","i","map","index","background","borderColor","borderWidth","marginBottom","col","display","marginTop"],"mappings":"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"}
@@ -184,7 +184,13 @@ const Asset = ({ assetType, thumbnailUrl, assetUrl, asset })=>{
184
184
  return /*#__PURE__*/ jsx(CardAsset, {
185
185
  src: thumbnailUrl,
186
186
  size: "S",
187
- alt: asset.alternativeText || asset.name
187
+ alt: asset.alternativeText || asset.name,
188
+ // AI assets are always remote; only gate crossOrigin on whether the
189
+ // URL is signed. A signed URL is loaded without a cache-buster, so it
190
+ // can collide with the preview in the browser cache and both must opt
191
+ // into CORS. Unsigned (public) URLs must render without a bucket CORS
192
+ // rule. See #26581.
193
+ crossOrigin: asset.isUrlSigned ? 'anonymous' : undefined
188
194
  });
189
195
  case ASSET_TYPES.Video:
190
196
  return /*#__PURE__*/ jsx(CardAsset, {
@@ -1 +1 @@
1
- {"version":3,"file":"AIAssetCard.mjs","sources":["../../../../admin/src/ai/components/AIAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Card,\n CardAction,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CardTimer,\n Field,\n Flex,\n Grid,\n TextInput,\n Typography,\n IconButton,\n Dialog,\n Modal,\n} from '@strapi/design-system';\nimport { Pencil, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AudioPreview } from '../../components/AssetCard/AudioPreview';\nimport { VideoPreview } from '../../components/AssetCard/VideoPreview';\nimport { type Asset, EditAssetContent } from '../../components/EditAssetDialog/EditAssetContent';\nimport { AssetType, ASSET_TYPES, DocType, DOC_TYPES } from '../../enums';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\nimport {\n formatBytes,\n formatDuration,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { useAIUploadModalContext } from './AIUploadModal';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n z-index: 1;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardActions\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetCardActions = ({ asset }: { asset: File }) => {\n const { formatMessage } = useIntl();\n const dispatch = useAIUploadModalContext('AssetCardActions', (s) => s.dispatch);\n const state = useAIUploadModalContext('AssetCardActions', (s) => s.state);\n const onClose = useAIUploadModalContext('AssetCardActions', (s) => s.onClose);\n const { canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n\n const [isEditModalOpen, setIsEditModalOpen] = React.useState(false);\n\n const { removeAsset } = useRemoveAsset(() => {});\n\n const handleConfirmRemove = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event?.preventDefault();\n await removeAsset(asset.id);\n dispatch({\n type: 'remove_uploaded_asset',\n payload: { id: asset.id },\n });\n\n // Close modal if this was the last asset\n if (state.uploadedAssets.length === 1) {\n onClose();\n }\n };\n\n const handlePropagationClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditAsset = (editedAsset?: File | null) => {\n if (editedAsset) {\n dispatch({\n type: 'edit_uploaded_asset',\n payload: { editedAsset },\n });\n\n setIsEditModalOpen(false);\n }\n };\n\n return (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n\n <Modal.Root open={isEditModalOpen} onOpenChange={setIsEditModalOpen}>\n <Modal.Trigger>\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n >\n <Pencil />\n </IconButton>\n </Modal.Trigger>\n <Modal.Content>\n <EditAssetContent\n // Is Local must be set to false to trigger the correct branch of logic in the EditAssetContent on submit\n asset={\n {\n ...asset,\n isLocal: false,\n folder: typeof asset.folder === 'number' ? { id: asset.folder } : asset.folder,\n } as Asset\n }\n onClose={(arg) => handleEditAsset(arg as File)}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n omitFields={['caption', 'alternativeText']}\n omitActions={['replace']}\n />\n </Modal.Content>\n </Modal.Root>\n </CardActionsContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Asset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetProps {\n assetType: AssetType | DocType;\n thumbnailUrl: string;\n assetUrl: string;\n asset: File;\n}\n\ninterface AssetCardProps {\n asset: File;\n onCaptionChange: (caption: string) => void;\n onAltTextChange: (altText: string) => void;\n wasCaptionChanged: boolean;\n wasAltTextChanged: boolean;\n}\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n position: relative;\n height: 100%;\n overflow: hidden;\n\n canvas,\n video {\n display: block;\n pointer-events: none;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ${({ theme }) => theme.borderRadius};\n }\n`;\n\nconst VideoTimerOverlay = styled(CardTimer)`\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n`;\n\nconst Asset = ({ assetType, thumbnailUrl, assetUrl, asset }: AssetProps) => {\n const [duration, setDuration] = React.useState<number>();\n const formattedDuration = duration ? formatDuration(duration) : undefined;\n\n switch (assetType) {\n case ASSET_TYPES.Image:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n case ASSET_TYPES.Video:\n return (\n <CardAsset size=\"S\">\n <VideoPreviewWrapper>\n <VideoPreview\n url={assetUrl}\n mime={asset.mime || 'video/mp4'}\n onLoadDuration={setDuration}\n alt={asset.alternativeText || asset.name}\n />\n {formattedDuration && <VideoTimerOverlay>{formattedDuration}</VideoTimerOverlay>}\n </VideoPreviewWrapper>\n </CardAsset>\n );\n case ASSET_TYPES.Audio:\n return (\n <CardAsset size=\"S\">\n <AudioPreviewWrapper>\n <AudioPreview url={assetUrl} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n </CardAsset>\n );\n default:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardBody = styled(CardBody)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[2]} ${({ theme }) => theme.spaces[1]};\n`;\n\nconst StyledCard = styled(Card)`\n width: 100%;\n height: 100%;\n border: none;\n box-shadow: none;\n border-radius: 0;\n padding: 0;\n`;\n\nconst getAssetBadgeLabel = (assetType: AssetType | DocType) => {\n switch (assetType) {\n case ASSET_TYPES.Image:\n return { id: getTrad('settings.section.image.label'), defaultMessage: 'IMAGE' };\n case ASSET_TYPES.Video:\n return { id: getTrad('settings.section.video.label'), defaultMessage: 'VIDEO' };\n case ASSET_TYPES.Audio:\n return { id: getTrad('settings.section.audio.label'), defaultMessage: 'AUDIO' };\n case DOC_TYPES.Pdf:\n return { id: getTrad('settings.section.pdf.label'), defaultMessage: 'PDF' };\n case DOC_TYPES.Csv:\n return { id: getTrad('settings.section.csv.label'), defaultMessage: 'CSV' };\n case DOC_TYPES.Xls:\n return { id: getTrad('settings.section.xls.label'), defaultMessage: 'XLS' };\n case DOC_TYPES.Zip:\n return { id: getTrad('settings.section.zip.label'), defaultMessage: 'ZIP' };\n default:\n return { id: getTrad('settings.section.doc.label'), defaultMessage: 'DOC' };\n }\n};\n\nexport const AIAssetCard = ({\n asset,\n onCaptionChange,\n onAltTextChange,\n wasAltTextChanged,\n wasCaptionChanged,\n}: AssetCardProps) => {\n const { formatMessage } = useIntl();\n\n const assetType = typeFromMime(asset.mime || '');\n const thumbnailUrl =\n prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url) || '';\n const assetUrl = prefixFileUrlWithBackendUrl(asset.url) || '';\n const subtitle = asset.height && asset.width ? ` - ${asset.width}x${asset.height}` : '';\n const formattedSize = asset.size ? formatBytes(asset.size) : '';\n const fullSubtitle = `${subtitle}${subtitle && formattedSize ? ' - ' : ''}${formattedSize}`;\n\n const [caption, setCaption] = React.useState(asset.caption || '');\n React.useEffect(() => {\n onCaptionChange(caption);\n }, [caption, onCaptionChange]);\n\n const [altText, setAltText] = React.useState(asset.alternativeText || '');\n React.useEffect(() => {\n onAltTextChange(altText);\n }, [altText, onAltTextChange]);\n\n return (\n <CardContainer>\n <Grid.Root>\n <Grid.Item m={5} xs={12} alignItems=\"stretch\">\n <StyledCard width=\"100%\" height=\"100%\" shadow=\"none\" borderRadius={0} padding={0}>\n <CardHeader style={{ borderStyle: 'none' }}>\n <AssetCardActions asset={asset} />\n <Asset\n assetType={assetType}\n thumbnailUrl={thumbnailUrl}\n assetUrl={assetUrl}\n asset={asset}\n />\n </CardHeader>\n <StyledCardBody>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\">\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n <CardBadge>{formatMessage(getAssetBadgeLabel(assetType))}</CardBadge>\n </Flex>\n <Flex>\n <CardSubtitle>\n <Extension>{getFileExtension(asset.ext)}</Extension>\n {fullSubtitle}\n </CardSubtitle>\n </Flex>\n </CardContent>\n </StyledCardBody>\n </StyledCard>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Field.Root name=\"caption\">\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n </Flex>\n <TextInput\n value={caption}\n onChange={(e) => setCaption(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-caption'),\n defaultMessage: 'Enter caption',\n })}\n endAction={\n !wasCaptionChanged &&\n asset.caption && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.description.file-alt'),\n defaultMessage: \"This text will be displayed if the asset can't be shown.\",\n })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n </Flex>\n\n <TextInput\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-alt'),\n defaultMessage: 'Enter alternative text',\n })}\n endAction={\n !wasAltTextChanged &&\n asset.alternativeText && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n <Field.Hint />\n </Field.Root>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </CardContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardSkeletons\n * -----------------------------------------------------------------------------------------------*/\n\nconst SkeletonBox = styled(Box)<{ width?: string; height?: string }>`\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.neutral100} 25%,\n ${({ theme }) => theme.colors.neutral150} 50%,\n ${({ theme }) => theme.colors.neutral100} 75%\n );\n background-size: 200% 100%;\n animation: loading 1.5s infinite;\n border-radius: ${({ theme }) => theme.borderRadius};\n width: ${({ width }) => width || '100%'};\n height: ${({ height }) => height || '1rem'};\n\n @keyframes loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n`;\n\nexport const AIAssetCardSkeletons = ({ count = 1 }: { count?: number }) => {\n const skeletons = Array.from({ length: count }, (_, i) => i);\n\n return skeletons.map((index) => (\n <Box\n key={index}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderRadius=\"4px\"\n marginBottom={4}\n >\n <Grid.Root>\n <Grid.Item col={5} alignItems=\"stretch\">\n <Card\n height=\"100%\"\n width=\"100%\"\n borderStyle=\"none\"\n shadow=\"none\"\n borderRadius={0}\n padding={2}\n >\n <Box height=\"150px\" padding={2}>\n <SkeletonBox height=\"100%\" />\n </Box>\n <CardBody style={{ display: 'flex', padding: '8px 4px' }}>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\" marginBottom={1}>\n <SkeletonBox width=\"60%\" height=\"18px\" />\n <SkeletonBox width=\"40px\" height=\"16px\" />\n </Flex>\n <SkeletonBox width=\"80%\" height=\"14px\" />\n </CardContent>\n </CardBody>\n </Card>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Box>\n <SkeletonBox width=\"60px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n </Box>\n\n <Box>\n <SkeletonBox width=\"100px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n <Box marginTop={1}>\n <SkeletonBox width=\"70%\" height=\"12px\" />\n </Box>\n </Box>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </Box>\n ));\n};\n"],"names":["CardActionsContainer","styled","CardAction","CardContainer","Box","theme","colors","neutral0","neutral150","borderRadius","AssetCardActions","asset","formatMessage","useIntl","dispatch","useAIUploadModalContext","s","state","onClose","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","isEditModalOpen","setIsEditModalOpen","React","useState","removeAsset","useRemoveAsset","handleConfirmRemove","event","preventDefault","id","type","payload","uploadedAssets","length","handlePropagationClick","stopPropagation","handleEditAsset","editedAsset","_jsxs","onClick","position","Dialog","Root","_jsx","Trigger","IconButton","label","getTrad","defaultMessage","Trash","ConfirmDialog","onConfirm","Modal","open","onOpenChange","Pencil","Content","EditAssetContent","isLocal","folder","arg","omitFields","omitActions","Extension","span","VideoPreviewWrapper","VideoTimerOverlay","CardTimer","AudioPreviewWrapper","Asset","assetType","thumbnailUrl","assetUrl","duration","setDuration","formattedDuration","formatDuration","undefined","ASSET_TYPES","Image","CardAsset","src","size","alt","alternativeText","name","Video","VideoPreview","url","mime","onLoadDuration","Audio","AudioPreview","StyledCardBody","CardBody","spaces","StyledCard","Card","getAssetBadgeLabel","DOC_TYPES","Pdf","Csv","Xls","Zip","AIAssetCard","onCaptionChange","onAltTextChange","wasAltTextChanged","wasCaptionChanged","typeFromMime","prefixFileUrlWithBackendUrl","formats","thumbnail","subtitle","height","width","formattedSize","formatBytes","fullSubtitle","caption","setCaption","useEffect","altText","setAltText","Grid","Item","m","xs","alignItems","shadow","padding","CardHeader","style","borderStyle","CardContent","Flex","justifyContent","Typography","tag","CardTitle","CardBadge","CardSubtitle","getFileExtension","ext","flex","direction","gap","Field","Label","TextInput","value","onChange","e","target","placeholder","endAction","Sparkle","fill","hint","Hint","SkeletonBox","neutral100","AIAssetCardSkeletons","count","skeletons","Array","from","_","i","map","index","background","borderColor","borderWidth","marginBottom","col","display","marginTop"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAMA,oBAAAA,GAAuBC,MAAAA,CAAOC,UAAAA,CAAW;;;;;;;AAO/C,CAAC;AAED,MAAMC,aAAAA,GAAgBF,MAAAA,CAAOG,GAAAA,CAAI;cACnB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,QAAQ,CAAC;oBACjC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;;;AAGjD,IAAA,EAAET,oBAAAA,CAAqB;;;;AAI3B,CAAC;AAED;;AAEkG,qGAElG,MAAMU,gBAAAA,GAAmB,CAAC,EAAEC,KAAK,EAAmB,GAAA;IAClD,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAWC,uBAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEF,QAAQ,CAAA;AAC9E,IAAA,MAAMG,QAAQF,uBAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEC,KAAK,CAAA;AACxE,IAAA,MAAMC,UAAUH,uBAAAA,CAAwB,kBAAA,EAAoB,CAACC,CAAAA,GAAMA,EAAEE,OAAO,CAAA;AAC5E,IAAA,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,WAAW,EAAE,GAAGC,0BAAAA,EAAAA;AAEhD,IAAA,MAAM,CAACC,eAAAA,EAAiBC,kBAAAA,CAAmB,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AAE7D,IAAA,MAAM,EAAEC,WAAW,EAAE,GAAGC,eAAe,IAAA,CAAO,CAAA,CAAA;AAE9C,IAAA,MAAMC,sBAAsB,OAAOC,KAAAA,GAAAA;QACjCA,KAAAA,EAAOC,cAAAA,EAAAA;QACP,MAAMJ,WAAAA,CAAYhB,MAAMqB,EAAE,CAAA;QAC1BlB,QAAAA,CAAS;YACPmB,IAAAA,EAAM,uBAAA;YACNC,OAAAA,EAAS;AAAEF,gBAAAA,EAAAA,EAAIrB,MAAMqB;AAAG;AAC1B,SAAA,CAAA;;AAGA,QAAA,IAAIf,KAAAA,CAAMkB,cAAc,CAACC,MAAM,KAAK,CAAA,EAAG;AACrClB,YAAAA,OAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMmB,yBAAyB,CAACP,KAAAA,GAAAA;AAC9BA,QAAAA,KAAAA,CAAMQ,eAAe,EAAA;AACvB,IAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkB,CAACC,WAAAA,GAAAA;AACvB,QAAA,IAAIA,WAAAA,EAAa;YACf1B,QAAAA,CAAS;gBACPmB,IAAAA,EAAM,qBAAA;gBACNC,OAAAA,EAAS;AAAEM,oBAAAA;AAAY;AACzB,aAAA,CAAA;YAEAhB,kBAAAA,CAAmB,KAAA,CAAA;AACrB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,qBACEiB,IAAA,CAACzC,oBAAAA,EAAAA;QAAqB0C,OAAAA,EAASL,sBAAAA;QAAwBM,QAAAA,EAAS,KAAA;;AAC9D,0BAAAF,IAAA,CAACG,OAAOC,IAAI,EAAA;;AACV,kCAAAC,GAAA,CAACF,OAAOG,OAAO,EAAA;AACb,wBAAA,QAAA,gBAAAD,GAAA,CAACE,UAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOrC,aAAAA,CAAc;AACnBoB,gCAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,+BAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;AAEA,4BAAA,QAAA,gBAAAL,GAAA,CAACM,KAAAA,EAAAA,EAAAA;;;kCAGLN,GAAA,CAACO,aAAAA,EAAAA;wBAAcC,SAAAA,EAAWzB;;;;AAG5B,0BAAAY,IAAA,CAACc,MAAMV,IAAI,EAAA;gBAACW,IAAAA,EAAMjC,eAAAA;gBAAiBkC,YAAAA,EAAcjC,kBAAAA;;AAC/C,kCAAAsB,GAAA,CAACS,MAAMR,OAAO,EAAA;AACZ,wBAAA,QAAA,gBAAAD,GAAA,CAACE,UAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOrC,aAAAA,CAAc;AAAEoB,gCAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,mBAAA,CAAA;gCAAsBC,cAAAA,EAAgB;AAAO,6BAAA,CAAA;AAEhF,4BAAA,QAAA,gBAAAL,GAAA,CAACY,MAAAA,EAAAA,EAAAA;;;AAGL,kCAAAZ,GAAA,CAACS,MAAMI,OAAO,EAAA;AACZ,wBAAA,QAAA,gBAAAb,GAAA,CAACc,gBAAAA,EAAAA;;4BAECjD,KAAAA,EACE;AACE,gCAAA,GAAGA,KAAK;gCACRkD,OAAAA,EAAS,KAAA;AACTC,gCAAAA,MAAAA,EAAQ,OAAOnD,KAAAA,CAAMmD,MAAM,KAAK,QAAA,GAAW;AAAE9B,oCAAAA,EAAAA,EAAIrB,MAAMmD;AAAO,iCAAA,GAAInD,MAAMmD;AAC1E,6BAAA;4BAEF5C,OAAAA,EAAS,CAAC6C,MAAQxB,eAAAA,CAAgBwB,GAAAA,CAAAA;4BAClC5C,SAAAA,EAAWA,SAAAA;4BACXC,WAAAA,EAAaA,WAAAA;4BACbC,WAAAA,EAAaA,WAAAA;4BACb2C,UAAAA,EAAY;AAAC,gCAAA,SAAA;AAAW,gCAAA;AAAkB,6BAAA;4BAC1CC,WAAAA,EAAa;AAAC,gCAAA;AAAU;;;;;;;AAMpC,CAAA;AAqBA,MAAMC,SAAAA,GAAYjE,MAAAA,CAAOkE,IAAI;;AAE7B,CAAC;AAED,MAAMC,mBAAAA,GAAsBnE,MAAAA,CAAOG,GAAAA,CAAI;;;;;;;;;;;;AAYpB,mBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;;AAEvD,CAAC;AAED,MAAM4D,iBAAAA,GAAoBpE,MAAAA,CAAOqE,SAAAA,CAAU;;;;AAI3C,CAAC;AAED,MAAMC,mBAAAA,GAAsBtE,MAAAA,CAAOG,GAAAA,CAAI;;;;;;;;;;;;;AAavC,CAAC;AAED,MAAMoE,KAAAA,GAAQ,CAAC,EAAEC,SAAS,EAAEC,YAAY,EAAEC,QAAQ,EAAEhE,KAAK,EAAc,GAAA;AACrE,IAAA,MAAM,CAACiE,QAAAA,EAAUC,WAAAA,CAAY,GAAGpD,MAAMC,QAAQ,EAAA;IAC9C,MAAMoD,iBAAAA,GAAoBF,QAAAA,GAAWG,cAAAA,CAAeH,QAAAA,CAAAA,GAAYI,SAAAA;IAEhE,OAAQP,SAAAA;AACN,QAAA,KAAKQ,YAAYC,KAAK;AACpB,YAAA,qBAAOpC,GAAA,CAACqC,SAAAA,EAAAA;gBAAUC,GAAAA,EAAKV,YAAAA;gBAAcW,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AACpF,QAAA,KAAKP,YAAYQ,KAAK;AACpB,YAAA,qBACE3C,GAAA,CAACqC,SAAAA,EAAAA;gBAAUE,IAAAA,EAAK,GAAA;AACd,gBAAA,QAAA,gBAAA5C,IAAA,CAAC2B,mBAAAA,EAAAA;;sCACCtB,GAAA,CAAC4C,YAAAA,EAAAA;4BACCC,GAAAA,EAAKhB,QAAAA;4BACLiB,IAAAA,EAAMjF,KAAAA,CAAMiF,IAAI,IAAI,WAAA;4BACpBC,cAAAA,EAAgBhB,WAAAA;AAChBS,4BAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AAErCV,wBAAAA,iBAAAA,kBAAqBhC,GAAA,CAACuB,iBAAAA,EAAAA;AAAmBS,4BAAAA,QAAAA,EAAAA;;;;;AAIlD,QAAA,KAAKG,YAAYa,KAAK;AACpB,YAAA,qBACEhD,GAAA,CAACqC,SAAAA,EAAAA;gBAAUE,IAAAA,EAAK,GAAA;AACd,gBAAA,QAAA,gBAAAvC,GAAA,CAACyB,mBAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAzB,GAAA,CAACiD,YAAAA,EAAAA;wBAAaJ,GAAAA,EAAKhB,QAAAA;AAAUW,wBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;;;AAIzE,QAAA;AACE,YAAA,qBAAO1C,GAAA,CAACqC,SAAAA,EAAAA;gBAAUC,GAAAA,EAAKV,YAAAA;gBAAcW,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,GAAAA,EAAK3E,KAAAA,CAAM4E,eAAe,IAAI5E,KAAAA,CAAM6E;;AACtF;AACF,CAAA;AAEA;;AAEkG,qGAElG,MAAMQ,cAAAA,GAAiB/F,MAAAA,CAAOgG,QAAAA,CAAS;;WAE5B,EAAE,CAAC,EAAE5F,KAAK,EAAE,GAAKA,KAAAA,CAAM6F,MAAM,CAAC,CAAA,CAAE,CAAC,CAAC,EAAE,CAAC,EAAE7F,KAAK,EAAE,GAAKA,KAAAA,CAAM6F,MAAM,CAAC,CAAA,CAAE,CAAC;AAC9E,CAAC;AAED,MAAMC,UAAAA,GAAalG,MAAAA,CAAOmG,IAAAA,CAAK;;;;;;;AAO/B,CAAC;AAED,MAAMC,qBAAqB,CAAC5B,SAAAA,GAAAA;IAC1B,OAAQA,SAAAA;AACN,QAAA,KAAKQ,YAAYC,KAAK;YACpB,OAAO;AAAElD,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAK8B,YAAYQ,KAAK;YACpB,OAAO;AAAEzD,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAK8B,YAAYa,KAAK;YACpB,OAAO;AAAE9D,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,8BAAA,CAAA;gBAAiCC,cAAAA,EAAgB;AAAQ,aAAA;AAChF,QAAA,KAAKmD,UAAUC,GAAG;YAChB,OAAO;AAAEvE,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,UAAUE,GAAG;YAChB,OAAO;AAAExE,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,UAAUG,GAAG;YAChB,OAAO;AAAEzE,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA,KAAKmD,UAAUI,GAAG;YAChB,OAAO;AAAE1E,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC5E,QAAA;YACE,OAAO;AAAEnB,gBAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,4BAAA,CAAA;gBAA+BC,cAAAA,EAAgB;AAAM,aAAA;AAC9E;AACF,CAAA;AAEO,MAAMwD,WAAAA,GAAc,CAAC,EAC1BhG,KAAK,EACLiG,eAAe,EACfC,eAAe,EACfC,iBAAiB,EACjBC,iBAAiB,EACF,GAAA;IACf,MAAM,EAAEnG,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAM4D,SAAAA,GAAYuC,YAAAA,CAAarG,KAAAA,CAAMiF,IAAI,IAAI,EAAA,CAAA;IAC7C,MAAMlB,YAAAA,GACJuC,4BAA4BtG,KAAAA,EAAOuG,OAAAA,EAASC,WAAWxB,GAAAA,IAAOhF,KAAAA,CAAMgF,GAAG,CAAA,IAAK,EAAA;AAC9E,IAAA,MAAMhB,QAAAA,GAAWsC,2BAAAA,CAA4BtG,KAAAA,CAAMgF,GAAG,CAAA,IAAK,EAAA;AAC3D,IAAA,MAAMyB,WAAWzG,KAAAA,CAAM0G,MAAM,IAAI1G,KAAAA,CAAM2G,KAAK,GAAG,CAAC,GAAG,EAAE3G,KAAAA,CAAM2G,KAAK,CAAC,CAAC,EAAE3G,KAAAA,CAAM0G,MAAM,EAAE,GAAG,EAAA;AACrF,IAAA,MAAME,gBAAgB5G,KAAAA,CAAM0E,IAAI,GAAGmC,WAAAA,CAAY7G,KAAAA,CAAM0E,IAAI,CAAA,GAAI,EAAA;AAC7D,IAAA,MAAMoC,eAAe,CAAA,EAAGL,QAAAA,CAAAA,EAAWA,YAAYG,aAAAA,GAAgB,KAAA,GAAQ,KAAKA,aAAAA,CAAAA,CAAe;IAE3F,MAAM,CAACG,SAASC,UAAAA,CAAW,GAAGlG,MAAMC,QAAQ,CAACf,KAAAA,CAAM+G,OAAO,IAAI,EAAA,CAAA;AAC9DjG,IAAAA,KAAAA,CAAMmG,SAAS,CAAC,IAAA;QACdhB,eAAAA,CAAgBc,OAAAA,CAAAA;IAClB,CAAA,EAAG;AAACA,QAAAA,OAAAA;AAASd,QAAAA;AAAgB,KAAA,CAAA;IAE7B,MAAM,CAACiB,SAASC,UAAAA,CAAW,GAAGrG,MAAMC,QAAQ,CAACf,KAAAA,CAAM4E,eAAe,IAAI,EAAA,CAAA;AACtE9D,IAAAA,KAAAA,CAAMmG,SAAS,CAAC,IAAA;QACdf,eAAAA,CAAgBgB,OAAAA,CAAAA;IAClB,CAAA,EAAG;AAACA,QAAAA,OAAAA;AAAShB,QAAAA;AAAgB,KAAA,CAAA;AAE7B,IAAA,qBACE/D,GAAA,CAAC3C,aAAAA,EAAAA;gCACCsC,IAAA,CAACsF,KAAKlF,IAAI,EAAA;;AACR,8BAAAC,GAAA,CAACiF,KAAKC,IAAI,EAAA;oBAACC,CAAAA,EAAG,CAAA;oBAAGC,EAAAA,EAAI,EAAA;oBAAIC,UAAAA,EAAW,SAAA;AAClC,oBAAA,QAAA,gBAAA1F,IAAA,CAAC0D,UAAAA,EAAAA;wBAAWmB,KAAAA,EAAM,MAAA;wBAAOD,MAAAA,EAAO,MAAA;wBAAOe,MAAAA,EAAO,MAAA;wBAAO3H,YAAAA,EAAc,CAAA;wBAAG4H,OAAAA,EAAS,CAAA;;0CAC7E5F,IAAA,CAAC6F,UAAAA,EAAAA;gCAAWC,KAAAA,EAAO;oCAAEC,WAAAA,EAAa;AAAO,iCAAA;;kDACvC1F,GAAA,CAACpC,gBAAAA,EAAAA;wCAAiBC,KAAAA,EAAOA;;kDACzBmC,GAAA,CAAC0B,KAAAA,EAAAA;wCACCC,SAAAA,EAAWA,SAAAA;wCACXC,YAAAA,EAAcA,YAAAA;wCACdC,QAAAA,EAAUA,QAAAA;wCACVhE,KAAAA,EAAOA;;;;0CAGXmC,GAAA,CAACkD,cAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAvD,IAAA,CAACgG,WAAAA,EAAAA;oCAAYnB,KAAAA,EAAM,MAAA;;sDACjB7E,IAAA,CAACiG,IAAAA,EAAAA;4CAAKC,cAAAA,EAAe,eAAA;4CAAgBR,UAAAA,EAAW,OAAA;;8DAC9CrF,GAAA,CAAC8F,UAAAA,EAAAA;oDAAWC,GAAAA,EAAI,IAAA;AACd,oDAAA,QAAA,gBAAA/F,GAAA,CAACgG,SAAAA,EAAAA;wDAAUD,GAAAA,EAAI,MAAA;AAAQlI,wDAAAA,QAAAA,EAAAA,KAAAA,CAAM6E;;;8DAE/B1C,GAAA,CAACiG,SAAAA,EAAAA;AAAWnI,oDAAAA,QAAAA,EAAAA,aAAAA,CAAcyF,kBAAAA,CAAmB5B,SAAAA,CAAAA;;;;sDAE/C3B,GAAA,CAAC4F,IAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAjG,IAAA,CAACuG,YAAAA,EAAAA;;kEACClG,GAAA,CAACoB,SAAAA,EAAAA;AAAW+E,wDAAAA,QAAAA,EAAAA,gBAAAA,CAAiBtI,MAAMuI,GAAG;;AACrCzB,oDAAAA;;;;;;;;;;AAQb,8BAAA3E,GAAA,CAACiF,KAAKC,IAAI,EAAA;oBAACC,CAAAA,EAAG,CAAA;oBAAGC,EAAAA,EAAI,EAAA;oBAAIiB,IAAAA,EAAM,CAAA;AAC7B,oBAAA,QAAA,gBAAA1G,IAAA,CAACiG,IAAAA,EAAAA;wBAAKU,SAAAA,EAAU,QAAA;wBAAS/B,MAAAA,EAAO,MAAA;wBAAOc,UAAAA,EAAW,SAAA;wBAAUgB,IAAAA,EAAM,CAAA;wBAAGd,OAAAA,EAAS,CAAA;wBAAGgB,GAAAA,EAAK,CAAA;;AACpF,0CAAA5G,IAAA,CAAC6G,MAAMzG,IAAI,EAAA;gCAAC2C,IAAAA,EAAK,SAAA;;kDACf1C,GAAA,CAAC4F,IAAAA,EAAAA;wCAAKP,UAAAA,EAAW,QAAA;wCAASkB,GAAAA,EAAK,CAAA;gEAC7BvG,GAAA,CAACwG,MAAMC,KAAK,EAAA;sDACT3I,aAAAA,CAAc;AACboB,gDAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,+BAAA,CAAA;gDACZC,cAAAA,EAAgB;AAClB,6CAAA;;;kDAGJL,GAAA,CAAC0G,SAAAA,EAAAA;wCACCC,KAAAA,EAAO/B,OAAAA;AACPgC,wCAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAMhC,UAAAA,CAAWgC,CAAAA,CAAEC,MAAM,CAACH,KAAK,CAAA;AAC1CI,wCAAAA,WAAAA,EAAajJ,aAAAA,CAAc;AACzBoB,4CAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,qCAAA,CAAA;4CACZC,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACA2G,wCAAAA,SAAAA,EACE,CAAC/C,iBAAAA,IACDpG,KAAAA,CAAM+G,OAAO,kBAAI5E,GAAA,CAACiH,OAAAA,EAAAA;4CAAQzC,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO2C,IAAAA,EAAK;;wCAE5D/H,IAAAA,EAAK;;;;AAIT,0CAAAQ,IAAA,CAAC6G,MAAMzG,IAAI,EAAA;gCACT2C,IAAAA,EAAK,iBAAA;AACLyE,gCAAAA,IAAAA,EAAMrJ,aAAAA,CAAc;AAClBoB,oCAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,iCAAA,CAAA;oCACZC,cAAAA,EAAgB;AAClB,iCAAA,CAAA;;kDAEAL,GAAA,CAAC4F,IAAAA,EAAAA;wCAAKP,UAAAA,EAAW,QAAA;wCAASkB,GAAAA,EAAK,CAAA;gEAC7BvG,GAAA,CAACwG,MAAMC,KAAK,EAAA;sDACT3I,aAAAA,CAAc;AACboB,gDAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,2BAAA,CAAA;gDACZC,cAAAA,EAAgB;AAClB,6CAAA;;;kDAIJL,GAAA,CAAC0G,SAAAA,EAAAA;wCACCC,KAAAA,EAAO5B,OAAAA;AACP6B,wCAAAA,QAAAA,EAAU,CAACC,CAAAA,GAAM7B,UAAAA,CAAW6B,CAAAA,CAAEC,MAAM,CAACH,KAAK,CAAA;AAC1CI,wCAAAA,WAAAA,EAAajJ,aAAAA,CAAc;AACzBoB,4CAAAA,EAAAA,EAAIkB,OAAAA,CAAQ,iCAAA,CAAA;4CACZC,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACA2G,wCAAAA,SAAAA,EACE,CAAChD,iBAAAA,IACDnG,KAAAA,CAAM4E,eAAe,kBAAIzC,GAAA,CAACiH,OAAAA,EAAAA;4CAAQzC,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO2C,IAAAA,EAAK;;wCAEpE/H,IAAAA,EAAK;;AAEP,kDAAAa,GAAA,CAACwG,MAAMY,IAAI,EAAA,EAAA;;;;;;;;;AAOzB;AAEA;;AAEkG,qGAElG,MAAMC,WAAAA,GAAclK,MAAAA,CAAOG,GAAAA,CAAyC;;;IAGhE,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8J,UAAU,CAAC;IACzC,EAAE,CAAC,EAAE/J,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACE,UAAU,CAAC;IACzC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAAC8J,UAAU,CAAC;;;;AAI5B,iBAAA,EAAE,CAAC,EAAE/J,KAAK,EAAE,GAAKA,KAAAA,CAAMI,YAAY,CAAC;AAC5C,SAAA,EAAE,CAAC,EAAE6G,KAAK,EAAE,GAAKA,SAAS,MAAA,CAAO;AAChC,UAAA,EAAE,CAAC,EAAED,MAAM,EAAE,GAAKA,UAAU,MAAA,CAAO;;;;;;;;;;AAU7C,CAAC;MAEYgD,oBAAAA,GAAuB,CAAC,EAAEC,KAAAA,GAAQ,CAAC,EAAsB,GAAA;IACpE,MAAMC,SAAAA,GAAYC,KAAAA,CAAMC,IAAI,CAAC;QAAErI,MAAAA,EAAQkI;KAAM,EAAG,CAACI,GAAGC,CAAAA,GAAMA,CAAAA,CAAAA;AAE1D,IAAA,OAAOJ,SAAAA,CAAUK,GAAG,CAAC,CAACC,sBACpB/H,GAAA,CAAC1C,GAAAA,EAAAA;YAEC0K,UAAAA,EAAW,UAAA;YACXC,WAAAA,EAAY,YAAA;YACZvC,WAAAA,EAAY,OAAA;YACZwC,WAAAA,EAAY,KAAA;YACZvK,YAAAA,EAAa,KAAA;YACbwK,YAAAA,EAAc,CAAA;oCAEdxI,IAAA,CAACsF,KAAKlF,IAAI,EAAA;;AACR,kCAAAC,GAAA,CAACiF,KAAKC,IAAI,EAAA;wBAACkD,GAAAA,EAAK,CAAA;wBAAG/C,UAAAA,EAAW,SAAA;AAC5B,wBAAA,QAAA,gBAAA1F,IAAA,CAAC2D,IAAAA,EAAAA;4BACCiB,MAAAA,EAAO,MAAA;4BACPC,KAAAA,EAAM,MAAA;4BACNkB,WAAAA,EAAY,MAAA;4BACZJ,MAAAA,EAAO,MAAA;4BACP3H,YAAAA,EAAc,CAAA;4BACd4H,OAAAA,EAAS,CAAA;;8CAETvF,GAAA,CAAC1C,GAAAA,EAAAA;oCAAIiH,MAAAA,EAAO,OAAA;oCAAQgB,OAAAA,EAAS,CAAA;AAC3B,oCAAA,QAAA,gBAAAvF,GAAA,CAACqH,WAAAA,EAAAA;wCAAY9C,MAAAA,EAAO;;;8CAEtBvE,GAAA,CAACmD,QAAAA,EAAAA;oCAASsC,KAAAA,EAAO;wCAAE4C,OAAAA,EAAS,MAAA;wCAAQ9C,OAAAA,EAAS;AAAU,qCAAA;AACrD,oCAAA,QAAA,gBAAA5F,IAAA,CAACgG,WAAAA,EAAAA;wCAAYnB,KAAAA,EAAM,MAAA;;0DACjB7E,IAAA,CAACiG,IAAAA,EAAAA;gDAAKC,cAAAA,EAAe,eAAA;gDAAgBR,UAAAA,EAAW,OAAA;gDAAQ8C,YAAAA,EAAc,CAAA;;kEACpEnI,GAAA,CAACqH,WAAAA,EAAAA;wDAAY7C,KAAAA,EAAM,KAAA;wDAAMD,MAAAA,EAAO;;kEAChCvE,GAAA,CAACqH,WAAAA,EAAAA;wDAAY7C,KAAAA,EAAM,MAAA;wDAAOD,MAAAA,EAAO;;;;0DAEnCvE,GAAA,CAACqH,WAAAA,EAAAA;gDAAY7C,KAAAA,EAAM,KAAA;gDAAMD,MAAAA,EAAO;;;;;;;;AAMxC,kCAAAvE,GAAA,CAACiF,KAAKC,IAAI,EAAA;wBAACC,CAAAA,EAAG,CAAA;wBAAGC,EAAAA,EAAI,EAAA;wBAAIiB,IAAAA,EAAM,CAAA;AAC7B,wBAAA,QAAA,gBAAA1G,IAAA,CAACiG,IAAAA,EAAAA;4BAAKU,SAAAA,EAAU,QAAA;4BAAS/B,MAAAA,EAAO,MAAA;4BAAOc,UAAAA,EAAW,SAAA;4BAAUgB,IAAAA,EAAM,CAAA;4BAAGd,OAAAA,EAAS,CAAA;4BAAGgB,GAAAA,EAAK,CAAA;;8CACpF5G,IAAA,CAACrC,GAAAA,EAAAA;;sDACC0C,GAAA,CAACqH,WAAAA,EAAAA;4CAAY7C,KAAAA,EAAM,MAAA;4CAAOD,MAAAA,EAAO,MAAA;4CAAO4D,YAAAA,EAAc;;sDACtDnI,GAAA,CAACqH,WAAAA,EAAAA;4CAAY9C,MAAAA,EAAO;;;;8CAGtB5E,IAAA,CAACrC,GAAAA,EAAAA;;sDACC0C,GAAA,CAACqH,WAAAA,EAAAA;4CAAY7C,KAAAA,EAAM,OAAA;4CAAQD,MAAAA,EAAO,MAAA;4CAAO4D,YAAAA,EAAc;;sDACvDnI,GAAA,CAACqH,WAAAA,EAAAA;4CAAY9C,MAAAA,EAAO;;sDACpBvE,GAAA,CAAC1C,GAAAA,EAAAA;4CAAIgL,SAAAA,EAAW,CAAA;AACd,4CAAA,QAAA,gBAAAtI,GAAA,CAACqH,WAAAA,EAAAA;gDAAY7C,KAAAA,EAAM,KAAA;gDAAMD,MAAAA,EAAO;;;;;;;;;;AA5CrCwD,SAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AAoDX;;;;"}
1
+ {"version":3,"file":"AIAssetCard.mjs","sources":["../../../../admin/src/ai/components/AIAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { ConfirmDialog } from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Card,\n CardAction,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CardTimer,\n Field,\n Flex,\n Grid,\n TextInput,\n Typography,\n IconButton,\n Dialog,\n Modal,\n} from '@strapi/design-system';\nimport { Pencil, Sparkle, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AudioPreview } from '../../components/AssetCard/AudioPreview';\nimport { VideoPreview } from '../../components/AssetCard/VideoPreview';\nimport { type Asset, EditAssetContent } from '../../components/EditAssetDialog/EditAssetContent';\nimport { AssetType, ASSET_TYPES, DocType, DOC_TYPES } from '../../enums';\nimport { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions';\nimport { useRemoveAsset } from '../../hooks/useRemoveAsset';\nimport {\n formatBytes,\n formatDuration,\n getFileExtension,\n getTrad,\n prefixFileUrlWithBackendUrl,\n} from '../../utils';\nimport { typeFromMime } from '../../utils/typeFromMime';\n\nimport { useAIUploadModalContext } from './AIUploadModal';\n\nimport type { File } from '../../../../shared/contracts/files';\n\nconst CardActionsContainer = styled(CardAction)`\n opacity: 0;\n z-index: 1;\n\n &:focus-within {\n opacity: 1;\n }\n`;\n\nconst CardContainer = styled(Box)`\n background: ${({ theme }) => theme.colors.neutral0};\n border: 1px solid ${({ theme }) => theme.colors.neutral150};\n border-radius: ${({ theme }) => theme.borderRadius};\n\n &:hover {\n ${CardActionsContainer} {\n opacity: 1;\n }\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardActions\n * -----------------------------------------------------------------------------------------------*/\n\nconst AssetCardActions = ({ asset }: { asset: File }) => {\n const { formatMessage } = useIntl();\n const dispatch = useAIUploadModalContext('AssetCardActions', (s) => s.dispatch);\n const state = useAIUploadModalContext('AssetCardActions', (s) => s.state);\n const onClose = useAIUploadModalContext('AssetCardActions', (s) => s.onClose);\n const { canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();\n\n const [isEditModalOpen, setIsEditModalOpen] = React.useState(false);\n\n const { removeAsset } = useRemoveAsset(() => {});\n\n const handleConfirmRemove = async (event?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event?.preventDefault();\n await removeAsset(asset.id);\n dispatch({\n type: 'remove_uploaded_asset',\n payload: { id: asset.id },\n });\n\n // Close modal if this was the last asset\n if (state.uploadedAssets.length === 1) {\n onClose();\n }\n };\n\n const handlePropagationClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n };\n\n const handleEditAsset = (editedAsset?: File | null) => {\n if (editedAsset) {\n dispatch({\n type: 'edit_uploaded_asset',\n payload: { editedAsset },\n });\n\n setIsEditModalOpen(false);\n }\n };\n\n return (\n <CardActionsContainer onClick={handlePropagationClick} position=\"end\">\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: getTrad('control-card.remove-selection'),\n defaultMessage: 'Remove from selection',\n })}\n >\n <Trash />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleConfirmRemove} />\n </Dialog.Root>\n\n <Modal.Root open={isEditModalOpen} onOpenChange={setIsEditModalOpen}>\n <Modal.Trigger>\n <IconButton\n label={formatMessage({ id: getTrad('control-card.edit'), defaultMessage: 'Edit' })}\n >\n <Pencil />\n </IconButton>\n </Modal.Trigger>\n <Modal.Content>\n <EditAssetContent\n // Is Local must be set to false to trigger the correct branch of logic in the EditAssetContent on submit\n asset={\n {\n ...asset,\n isLocal: false,\n folder: typeof asset.folder === 'number' ? { id: asset.folder } : asset.folder,\n } as Asset\n }\n onClose={(arg) => handleEditAsset(arg as File)}\n canUpdate={canUpdate}\n canCopyLink={canCopyLink}\n canDownload={canDownload}\n omitFields={['caption', 'alternativeText']}\n omitActions={['replace']}\n />\n </Modal.Content>\n </Modal.Root>\n </CardActionsContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Asset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface AssetProps {\n assetType: AssetType | DocType;\n thumbnailUrl: string;\n assetUrl: string;\n asset: File;\n}\n\ninterface AssetCardProps {\n asset: File;\n onCaptionChange: (caption: string) => void;\n onAltTextChange: (altText: string) => void;\n wasCaptionChanged: boolean;\n wasAltTextChanged: boolean;\n}\n\nconst Extension = styled.span`\n text-transform: uppercase;\n`;\n\nconst VideoPreviewWrapper = styled(Box)`\n position: relative;\n height: 100%;\n overflow: hidden;\n\n canvas,\n video {\n display: block;\n pointer-events: none;\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: ${({ theme }) => theme.borderRadius};\n }\n`;\n\nconst VideoTimerOverlay = styled(CardTimer)`\n position: absolute;\n bottom: 0.5rem;\n right: 0.5rem;\n`;\n\nconst AudioPreviewWrapper = styled(Box)`\n height: 100%;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: 100%;\n }\n`;\n\nconst Asset = ({ assetType, thumbnailUrl, assetUrl, asset }: AssetProps) => {\n const [duration, setDuration] = React.useState<number>();\n const formattedDuration = duration ? formatDuration(duration) : undefined;\n\n switch (assetType) {\n case ASSET_TYPES.Image:\n return (\n <CardAsset\n src={thumbnailUrl}\n size=\"S\"\n alt={asset.alternativeText || asset.name}\n // AI assets are always remote; only gate crossOrigin on whether the\n // URL is signed. A signed URL is loaded without a cache-buster, so it\n // can collide with the preview in the browser cache and both must opt\n // into CORS. Unsigned (public) URLs must render without a bucket CORS\n // rule. See #26581.\n crossOrigin={asset.isUrlSigned ? 'anonymous' : undefined}\n />\n );\n case ASSET_TYPES.Video:\n return (\n <CardAsset size=\"S\">\n <VideoPreviewWrapper>\n <VideoPreview\n url={assetUrl}\n mime={asset.mime || 'video/mp4'}\n onLoadDuration={setDuration}\n alt={asset.alternativeText || asset.name}\n />\n {formattedDuration && <VideoTimerOverlay>{formattedDuration}</VideoTimerOverlay>}\n </VideoPreviewWrapper>\n </CardAsset>\n );\n case ASSET_TYPES.Audio:\n return (\n <CardAsset size=\"S\">\n <AudioPreviewWrapper>\n <AudioPreview url={assetUrl} alt={asset.alternativeText || asset.name} />\n </AudioPreviewWrapper>\n </CardAsset>\n );\n default:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCard\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledCardBody = styled(CardBody)`\n display: flex;\n padding: ${({ theme }) => theme.spaces[2]} ${({ theme }) => theme.spaces[1]};\n`;\n\nconst StyledCard = styled(Card)`\n width: 100%;\n height: 100%;\n border: none;\n box-shadow: none;\n border-radius: 0;\n padding: 0;\n`;\n\nconst getAssetBadgeLabel = (assetType: AssetType | DocType) => {\n switch (assetType) {\n case ASSET_TYPES.Image:\n return { id: getTrad('settings.section.image.label'), defaultMessage: 'IMAGE' };\n case ASSET_TYPES.Video:\n return { id: getTrad('settings.section.video.label'), defaultMessage: 'VIDEO' };\n case ASSET_TYPES.Audio:\n return { id: getTrad('settings.section.audio.label'), defaultMessage: 'AUDIO' };\n case DOC_TYPES.Pdf:\n return { id: getTrad('settings.section.pdf.label'), defaultMessage: 'PDF' };\n case DOC_TYPES.Csv:\n return { id: getTrad('settings.section.csv.label'), defaultMessage: 'CSV' };\n case DOC_TYPES.Xls:\n return { id: getTrad('settings.section.xls.label'), defaultMessage: 'XLS' };\n case DOC_TYPES.Zip:\n return { id: getTrad('settings.section.zip.label'), defaultMessage: 'ZIP' };\n default:\n return { id: getTrad('settings.section.doc.label'), defaultMessage: 'DOC' };\n }\n};\n\nexport const AIAssetCard = ({\n asset,\n onCaptionChange,\n onAltTextChange,\n wasAltTextChanged,\n wasCaptionChanged,\n}: AssetCardProps) => {\n const { formatMessage } = useIntl();\n\n const assetType = typeFromMime(asset.mime || '');\n const thumbnailUrl =\n prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url) || '';\n const assetUrl = prefixFileUrlWithBackendUrl(asset.url) || '';\n const subtitle = asset.height && asset.width ? ` - ${asset.width}x${asset.height}` : '';\n const formattedSize = asset.size ? formatBytes(asset.size) : '';\n const fullSubtitle = `${subtitle}${subtitle && formattedSize ? ' - ' : ''}${formattedSize}`;\n\n const [caption, setCaption] = React.useState(asset.caption || '');\n React.useEffect(() => {\n onCaptionChange(caption);\n }, [caption, onCaptionChange]);\n\n const [altText, setAltText] = React.useState(asset.alternativeText || '');\n React.useEffect(() => {\n onAltTextChange(altText);\n }, [altText, onAltTextChange]);\n\n return (\n <CardContainer>\n <Grid.Root>\n <Grid.Item m={5} xs={12} alignItems=\"stretch\">\n <StyledCard width=\"100%\" height=\"100%\" shadow=\"none\" borderRadius={0} padding={0}>\n <CardHeader style={{ borderStyle: 'none' }}>\n <AssetCardActions asset={asset} />\n <Asset\n assetType={assetType}\n thumbnailUrl={thumbnailUrl}\n assetUrl={assetUrl}\n asset={asset}\n />\n </CardHeader>\n <StyledCardBody>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\">\n <Typography tag=\"h2\">\n <CardTitle tag=\"span\">{asset.name}</CardTitle>\n </Typography>\n <CardBadge>{formatMessage(getAssetBadgeLabel(assetType))}</CardBadge>\n </Flex>\n <Flex>\n <CardSubtitle>\n <Extension>{getFileExtension(asset.ext)}</Extension>\n {fullSubtitle}\n </CardSubtitle>\n </Flex>\n </CardContent>\n </StyledCardBody>\n </StyledCard>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Field.Root name=\"caption\">\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-caption'),\n defaultMessage: 'Caption',\n })}\n </Field.Label>\n </Flex>\n <TextInput\n value={caption}\n onChange={(e) => setCaption(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-caption'),\n defaultMessage: 'Enter caption',\n })}\n endAction={\n !wasCaptionChanged &&\n asset.caption && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n </Field.Root>\n\n <Field.Root\n name=\"alternativeText\"\n hint={formatMessage({\n id: getTrad('form.input.description.file-alt'),\n defaultMessage: \"This text will be displayed if the asset can't be shown.\",\n })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Field.Label>\n {formatMessage({\n id: getTrad('form.input.label.file-alt'),\n defaultMessage: 'Alternative text',\n })}\n </Field.Label>\n </Flex>\n\n <TextInput\n value={altText}\n onChange={(e) => setAltText(e.target.value)}\n placeholder={formatMessage({\n id: getTrad('form.input.placeholder.file-alt'),\n defaultMessage: 'Enter alternative text',\n })}\n endAction={\n !wasAltTextChanged &&\n asset.alternativeText && <Sparkle width=\"16px\" height=\"16px\" fill=\"#AC73E6\" />\n }\n type=\"text\"\n />\n <Field.Hint />\n </Field.Root>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </CardContainer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AssetCardSkeletons\n * -----------------------------------------------------------------------------------------------*/\n\nconst SkeletonBox = styled(Box)<{ width?: string; height?: string }>`\n background: linear-gradient(\n 90deg,\n ${({ theme }) => theme.colors.neutral100} 25%,\n ${({ theme }) => theme.colors.neutral150} 50%,\n ${({ theme }) => theme.colors.neutral100} 75%\n );\n background-size: 200% 100%;\n animation: loading 1.5s infinite;\n border-radius: ${({ theme }) => theme.borderRadius};\n width: ${({ width }) => width || '100%'};\n height: ${({ height }) => height || '1rem'};\n\n @keyframes loading {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n }\n`;\n\nexport const AIAssetCardSkeletons = ({ count = 1 }: { count?: number }) => {\n const skeletons = Array.from({ length: count }, (_, i) => i);\n\n return skeletons.map((index) => (\n <Box\n key={index}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n borderStyle=\"solid\"\n borderWidth=\"1px\"\n borderRadius=\"4px\"\n marginBottom={4}\n >\n <Grid.Root>\n <Grid.Item col={5} alignItems=\"stretch\">\n <Card\n height=\"100%\"\n width=\"100%\"\n borderStyle=\"none\"\n shadow=\"none\"\n borderRadius={0}\n padding={2}\n >\n <Box height=\"150px\" padding={2}>\n <SkeletonBox height=\"100%\" />\n </Box>\n <CardBody style={{ display: 'flex', padding: '8px 4px' }}>\n <CardContent width=\"100%\">\n <Flex justifyContent=\"space-between\" alignItems=\"start\" marginBottom={1}>\n <SkeletonBox width=\"60%\" height=\"18px\" />\n <SkeletonBox width=\"40px\" height=\"16px\" />\n </Flex>\n <SkeletonBox width=\"80%\" height=\"14px\" />\n </CardContent>\n </CardBody>\n </Card>\n </Grid.Item>\n\n <Grid.Item m={7} xs={12} flex={1}>\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\" flex={1} padding={4} gap={2}>\n <Box>\n <SkeletonBox width=\"60px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n </Box>\n\n <Box>\n <SkeletonBox width=\"100px\" height=\"16px\" marginBottom={1} />\n <SkeletonBox height=\"32px\" />\n <Box marginTop={1}>\n <SkeletonBox width=\"70%\" height=\"12px\" />\n </Box>\n </Box>\n </Flex>\n </Grid.Item>\n </Grid.Root>\n </Box>\n ));\n};\n"],"names":["CardActionsContainer","styled","CardAction","CardContainer","Box","theme","colors","neutral0","neutral150","borderRadius","AssetCardActions","asset","formatMessage","useIntl","dispatch","useAIUploadModalContext","s","state","onClose","canUpdate","canCopyLink","canDownload","useMediaLibraryPermissions","isEditModalOpen","setIsEditModalOpen","React","useState","removeAsset","useRemoveAsset","handleConfirmRemove","event","preventDefault","id","type","payload","uploadedAssets","length","handlePropagationClick","stopPropagation","handleEditAsset","editedAsset","_jsxs","onClick","position","Dialog","Root","_jsx","Trigger","IconButton","label","getTrad","defaultMessage","Trash","ConfirmDialog","onConfirm","Modal","open","onOpenChange","Pencil","Content","EditAssetContent","isLocal","folder","arg","omitFields","omitActions","Extension","span","VideoPreviewWrapper","VideoTimerOverlay","CardTimer","AudioPreviewWrapper","Asset","assetType","thumbnailUrl","assetUrl","duration","setDuration","formattedDuration","formatDuration","undefined","ASSET_TYPES","Image","CardAsset","src","size","alt","alternativeText","name","crossOrigin","isUrlSigned","Video","VideoPreview","url","mime","onLoadDuration","Audio","AudioPreview","StyledCardBody","CardBody","spaces","StyledCard","Card","getAssetBadgeLabel","DOC_TYPES","Pdf","Csv","Xls","Zip","AIAssetCard","onCaptionChange","onAltTextChange","wasAltTextChanged","wasCaptionChanged","typeFromMime","prefixFileUrlWithBackendUrl","formats","thumbnail","subtitle","height","width","formattedSize","formatBytes","fullSubtitle","caption","setCaption","useEffect","altText","setAltText","Grid","Item","m","xs","alignItems","shadow","padding","CardHeader","style","borderStyle","CardContent","Flex","justifyContent","Typography","tag","CardTitle","CardBadge","CardSubtitle","getFileExtension","ext","flex","direction","gap","Field","Label","TextInput","value","onChange","e","target","placeholder","endAction","Sparkle","fill","hint","Hint","SkeletonBox","neutral100","AIAssetCardSkeletons","count","skeletons","Array","from","_","i","map","index","background","borderColor","borderWidth","marginBottom","col","display","marginTop"],"mappings":"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"}
@@ -43,6 +43,12 @@ const AssetCard = ({ asset, isSelected = false, onSelect, onEdit, onRemove, size
43
43
  width: asset.width,
44
44
  updatedAt: asset.updatedAt,
45
45
  isUrlSigned: asset?.isUrlSigned || false,
46
+ // Only signed remote URLs need crossOrigin: they are loaded without a
47
+ // cache-buster, so thumbnail and preview share a cache entry and must
48
+ // both opt into CORS to avoid a cache collision. Public/unsigned remote
49
+ // URLs are cache-busted, so they must not require a bucket CORS rule to
50
+ // render. See #26581.
51
+ crossOrigin: !local && asset?.isUrlSigned ? 'anonymous' : undefined,
46
52
  ...commonAssetCardProps
47
53
  });
48
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssetCard.js","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { ASSET_TYPES } from '../../enums';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n className?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n className,\n}: AssetCardProps) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext)!,\n name: asset.name,\n url: local ? asset.url! : createAssetUrl(asset, true)!,\n mime: asset.mime!,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n className,\n };\n\n if (asset.mime?.includes(ASSET_TYPES.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Image)) {\n return (\n <ImageAssetCard\n alt={asset.alternativeText || asset.name}\n height={asset.height!}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)!}\n width={asset.width!}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","className","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","ASSET_TYPES","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;;;AA2BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACbC,SAAS,EACM,GAAA;AACf,IAAA,MAAMC,YAAAA,GAAeN,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAAAA,CAAAA,GAASS,SAAAA;AAExD,IAAA,MAAMC,oBAAAA,GAAuB;AAC3BC,QAAAA,EAAAA,EAAIX,MAAMW,EAAE;AACZC,QAAAA,YAAAA,EAAcZ,MAAMY,YAAY;QAChCC,SAAAA,EAAWC,iCAAAA,CAAiBd,MAAMe,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMhB,MAAMgB,IAAI;AAChBC,QAAAA,GAAAA,EAAKX,KAAAA,GAAQN,KAAAA,CAAMiB,GAAG,GAAIC,8BAAelB,KAAAA,EAAO,IAAA,CAAA;AAChDmB,QAAAA,IAAAA,EAAMnB,MAAMmB,IAAI;QAChBhB,MAAAA,EAAQA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAAAA,CAAAA,GAASS,SAAAA;QACvCP,QAAAA,EAAUM,YAAAA;QACVJ,QAAAA,EAAUA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAAAA,CAAAA,GAASS,SAAAA;QAC7CW,QAAAA,EAAUnB,UAAAA;AACVI,QAAAA,IAAAA;AACAE,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIP,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYC,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOC,cAAA,CAACC,6BAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYI,KAAK,CAAA,EAAG;AAC3C,QAAA,qBACEF,cAAA,CAACG,6BAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK5B,KAAAA,CAAM6B,eAAe,IAAI7B,KAAAA,CAAMgB,IAAI;AACxCc,YAAAA,MAAAA,EAAQ9B,MAAM8B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,wDAA4BhC,KAAAA,EAAOiC,OAAAA,EAASF,SAAAA,EAAWd,GAAAA,IAAOjB,MAAMiB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOlC,MAAMkC,KAAK;AAClBC,YAAAA,SAAAA,EAAWnC,MAAMmC,SAAS;AAC1BC,YAAAA,WAAAA,EAAapC,OAAOoC,WAAAA,IAAe,KAAA;AAClC,YAAA,GAAG1B;;AAGV,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYe,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOb,cAAA,CAACc,6BAAAA,EAAAA;AAAgB,YAAA,GAAG5B;;AAC7B,IAAA;AAEA,IAAA,qBAAOc,cAAA,CAACe,yBAAAA,EAAAA;AAAc,QAAA,GAAG7B;;AAC3B;;;;"}
1
+ {"version":3,"file":"AssetCard.js","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { ASSET_TYPES } from '../../enums';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n className?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n className,\n}: AssetCardProps) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext)!,\n name: asset.name,\n url: local ? asset.url! : createAssetUrl(asset, true)!,\n mime: asset.mime!,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n className,\n };\n\n if (asset.mime?.includes(ASSET_TYPES.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Image)) {\n return (\n <ImageAssetCard\n alt={asset.alternativeText || asset.name}\n height={asset.height!}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)!}\n width={asset.width!}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n // Only signed remote URLs need crossOrigin: they are loaded without a\n // cache-buster, so thumbnail and preview share a cache entry and must\n // both opt into CORS to avoid a cache collision. Public/unsigned remote\n // URLs are cache-busted, so they must not require a bucket CORS rule to\n // render. See #26581.\n crossOrigin={!local && asset?.isUrlSigned ? 'anonymous' : undefined}\n {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","className","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","ASSET_TYPES","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","crossOrigin","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;;;AA2BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACbC,SAAS,EACM,GAAA;AACf,IAAA,MAAMC,YAAAA,GAAeN,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAAAA,CAAAA,GAASS,SAAAA;AAExD,IAAA,MAAMC,oBAAAA,GAAuB;AAC3BC,QAAAA,EAAAA,EAAIX,MAAMW,EAAE;AACZC,QAAAA,YAAAA,EAAcZ,MAAMY,YAAY;QAChCC,SAAAA,EAAWC,iCAAAA,CAAiBd,MAAMe,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMhB,MAAMgB,IAAI;AAChBC,QAAAA,GAAAA,EAAKX,KAAAA,GAAQN,KAAAA,CAAMiB,GAAG,GAAIC,8BAAelB,KAAAA,EAAO,IAAA,CAAA;AAChDmB,QAAAA,IAAAA,EAAMnB,MAAMmB,IAAI;QAChBhB,MAAAA,EAAQA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAAAA,CAAAA,GAASS,SAAAA;QACvCP,QAAAA,EAAUM,YAAAA;QACVJ,QAAAA,EAAUA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAAAA,CAAAA,GAASS,SAAAA;QAC7CW,QAAAA,EAAUnB,UAAAA;AACVI,QAAAA,IAAAA;AACAE,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIP,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYC,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOC,cAAA,CAACC,6BAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYI,KAAK,CAAA,EAAG;AAC3C,QAAA,qBACEF,cAAA,CAACG,6BAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK5B,KAAAA,CAAM6B,eAAe,IAAI7B,KAAAA,CAAMgB,IAAI;AACxCc,YAAAA,MAAAA,EAAQ9B,MAAM8B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,wDAA4BhC,KAAAA,EAAOiC,OAAAA,EAASF,SAAAA,EAAWd,GAAAA,IAAOjB,MAAMiB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOlC,MAAMkC,KAAK;AAClBC,YAAAA,SAAAA,EAAWnC,MAAMmC,SAAS;AAC1BC,YAAAA,WAAAA,EAAapC,OAAOoC,WAAAA,IAAe,KAAA;;;;;;AAMnCC,YAAAA,WAAAA,EAAa,CAAC/B,KAAAA,IAASN,KAAAA,EAAOoC,WAAAA,GAAc,WAAA,GAAc3B,SAAAA;AACzD,YAAA,GAAGC;;AAGV,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,iBAAAA,CAAYgB,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOd,cAAA,CAACe,6BAAAA,EAAAA;AAAgB,YAAA,GAAG7B;;AAC7B,IAAA;AAEA,IAAA,qBAAOc,cAAA,CAACgB,yBAAAA,EAAAA;AAAc,QAAA,GAAG9B;;AAC3B;;;;"}
@@ -41,6 +41,12 @@ const AssetCard = ({ asset, isSelected = false, onSelect, onEdit, onRemove, size
41
41
  width: asset.width,
42
42
  updatedAt: asset.updatedAt,
43
43
  isUrlSigned: asset?.isUrlSigned || false,
44
+ // Only signed remote URLs need crossOrigin: they are loaded without a
45
+ // cache-buster, so thumbnail and preview share a cache entry and must
46
+ // both opt into CORS to avoid a cache collision. Public/unsigned remote
47
+ // URLs are cache-busted, so they must not require a bucket CORS rule to
48
+ // render. See #26581.
49
+ crossOrigin: !local && asset?.isUrlSigned ? 'anonymous' : undefined,
44
50
  ...commonAssetCardProps
45
51
  });
46
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { ASSET_TYPES } from '../../enums';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n className?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n className,\n}: AssetCardProps) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext)!,\n name: asset.name,\n url: local ? asset.url! : createAssetUrl(asset, true)!,\n mime: asset.mime!,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n className,\n };\n\n if (asset.mime?.includes(ASSET_TYPES.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Image)) {\n return (\n <ImageAssetCard\n alt={asset.alternativeText || asset.name}\n height={asset.height!}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)!}\n width={asset.width!}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","className","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","ASSET_TYPES","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;AA2BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACbC,SAAS,EACM,GAAA;AACf,IAAA,MAAMC,YAAAA,GAAeN,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAAAA,CAAAA,GAASS,SAAAA;AAExD,IAAA,MAAMC,oBAAAA,GAAuB;AAC3BC,QAAAA,EAAAA,EAAIX,MAAMW,EAAE;AACZC,QAAAA,YAAAA,EAAcZ,MAAMY,YAAY;QAChCC,SAAAA,EAAWC,gBAAAA,CAAiBd,MAAMe,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMhB,MAAMgB,IAAI;AAChBC,QAAAA,GAAAA,EAAKX,KAAAA,GAAQN,KAAAA,CAAMiB,GAAG,GAAIC,eAAelB,KAAAA,EAAO,IAAA,CAAA;AAChDmB,QAAAA,IAAAA,EAAMnB,MAAMmB,IAAI;QAChBhB,MAAAA,EAAQA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAAAA,CAAAA,GAASS,SAAAA;QACvCP,QAAAA,EAAUM,YAAAA;QACVJ,QAAAA,EAAUA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAAAA,CAAAA,GAASS,SAAAA;QAC7CW,QAAAA,EAAUnB,UAAAA;AACVI,QAAAA,IAAAA;AACAE,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIP,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYC,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOC,GAAA,CAACC,cAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYI,KAAK,CAAA,EAAG;AAC3C,QAAA,qBACEF,GAAA,CAACG,cAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK5B,KAAAA,CAAM6B,eAAe,IAAI7B,KAAAA,CAAMgB,IAAI;AACxCc,YAAAA,MAAAA,EAAQ9B,MAAM8B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,4BAA4BhC,KAAAA,EAAOiC,OAAAA,EAASF,SAAAA,EAAWd,GAAAA,IAAOjB,MAAMiB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOlC,MAAMkC,KAAK;AAClBC,YAAAA,SAAAA,EAAWnC,MAAMmC,SAAS;AAC1BC,YAAAA,WAAAA,EAAapC,OAAOoC,WAAAA,IAAe,KAAA;AAClC,YAAA,GAAG1B;;AAGV,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYe,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOb,GAAA,CAACc,cAAAA,EAAAA;AAAgB,YAAA,GAAG5B;;AAC7B,IAAA;AAEA,IAAA,qBAAOc,GAAA,CAACe,YAAAA,EAAAA;AAAc,QAAA,GAAG7B;;AAC3B;;;;"}
1
+ {"version":3,"file":"AssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { ASSET_TYPES } from '../../enums';\nimport { createAssetUrl, getFileExtension, prefixFileUrlWithBackendUrl } from '../../utils';\n\nimport { AudioAssetCard } from './AudioAssetCard';\nimport { DocAssetCard } from './DocAssetCard';\nimport { ImageAssetCard } from './ImageAssetCard';\nimport { VideoAssetCard } from './VideoAssetCard';\n\nimport type { File } from '../../../../shared/contracts/files';\n\ntype FileSelectable = File & { isSelectable?: boolean };\n\nexport type AllowedTypes = 'files' | 'images' | 'videos' | 'audios';\n\ninterface AssetCardProps {\n asset: FileSelectable;\n local?: boolean;\n onSelect?: (asset: FileSelectable) => void;\n onEdit?: (asset: FileSelectable) => void;\n onRemove?: (asset: FileSelectable) => void;\n isSelected?: boolean;\n size?: 'S' | 'M';\n allowedTypes?: AllowedTypes[];\n alt?: string;\n className?: string;\n}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\n className,\n}: AssetCardProps) => {\n const handleSelect = onSelect ? () => onSelect(asset) : undefined;\n\n const commonAssetCardProps = {\n id: asset.id,\n isSelectable: asset.isSelectable,\n extension: getFileExtension(asset.ext)!,\n name: asset.name,\n url: local ? asset.url! : createAssetUrl(asset, true)!,\n mime: asset.mime!,\n onEdit: onEdit ? () => onEdit(asset) : undefined,\n onSelect: handleSelect,\n onRemove: onRemove ? () => onRemove(asset) : undefined,\n selected: isSelected,\n size,\n className,\n };\n\n if (asset.mime?.includes(ASSET_TYPES.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Image)) {\n return (\n <ImageAssetCard\n alt={asset.alternativeText || asset.name}\n height={asset.height!}\n thumbnail={prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url)!}\n width={asset.width!}\n updatedAt={asset.updatedAt}\n isUrlSigned={asset?.isUrlSigned || false}\n // Only signed remote URLs need crossOrigin: they are loaded without a\n // cache-buster, so thumbnail and preview share a cache entry and must\n // both opt into CORS to avoid a cache collision. Public/unsigned remote\n // URLs are cache-busted, so they must not require a bucket CORS rule to\n // render. See #26581.\n crossOrigin={!local && asset?.isUrlSigned ? 'anonymous' : undefined}\n {...commonAssetCardProps}\n />\n );\n }\n\n if (asset.mime?.includes(ASSET_TYPES.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","className","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","ASSET_TYPES","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","crossOrigin","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;AA2BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACbC,SAAS,EACM,GAAA;AACf,IAAA,MAAMC,YAAAA,GAAeN,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAAAA,CAAAA,GAASS,SAAAA;AAExD,IAAA,MAAMC,oBAAAA,GAAuB;AAC3BC,QAAAA,EAAAA,EAAIX,MAAMW,EAAE;AACZC,QAAAA,YAAAA,EAAcZ,MAAMY,YAAY;QAChCC,SAAAA,EAAWC,gBAAAA,CAAiBd,MAAMe,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMhB,MAAMgB,IAAI;AAChBC,QAAAA,GAAAA,EAAKX,KAAAA,GAAQN,KAAAA,CAAMiB,GAAG,GAAIC,eAAelB,KAAAA,EAAO,IAAA,CAAA;AAChDmB,QAAAA,IAAAA,EAAMnB,MAAMmB,IAAI;QAChBhB,MAAAA,EAAQA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAAAA,CAAAA,GAASS,SAAAA;QACvCP,QAAAA,EAAUM,YAAAA;QACVJ,QAAAA,EAAUA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAAAA,CAAAA,GAASS,SAAAA;QAC7CW,QAAAA,EAAUnB,UAAAA;AACVI,QAAAA,IAAAA;AACAE,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIP,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYC,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOC,GAAA,CAACC,cAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYI,KAAK,CAAA,EAAG;AAC3C,QAAA,qBACEF,GAAA,CAACG,cAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK5B,KAAAA,CAAM6B,eAAe,IAAI7B,KAAAA,CAAMgB,IAAI;AACxCc,YAAAA,MAAAA,EAAQ9B,MAAM8B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,4BAA4BhC,KAAAA,EAAOiC,OAAAA,EAASF,SAAAA,EAAWd,GAAAA,IAAOjB,MAAMiB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOlC,MAAMkC,KAAK;AAClBC,YAAAA,SAAAA,EAAWnC,MAAMmC,SAAS;AAC1BC,YAAAA,WAAAA,EAAapC,OAAOoC,WAAAA,IAAe,KAAA;;;;;;AAMnCC,YAAAA,WAAAA,EAAa,CAAC/B,KAAAA,IAASN,KAAAA,EAAOoC,WAAAA,GAAc,WAAA,GAAc3B,SAAAA;AACzD,YAAA,GAAGC;;AAGV,IAAA;AAEA,IAAA,IAAIV,MAAMmB,IAAI,EAAEE,QAAAA,CAASC,WAAAA,CAAYgB,KAAK,CAAA,EAAG;AAC3C,QAAA,qBAAOd,GAAA,CAACe,cAAAA,EAAAA;AAAgB,YAAA,GAAG7B;;AAC7B,IAAA;AAEA,IAAA,qBAAOc,GAAA,CAACgB,YAAAA,EAAAA;AAAc,QAAA,GAAG9B;;AAC3B;;;;"}
@@ -9,7 +9,7 @@ require('qs');
9
9
  require('../../utils/urlYupSchema.js');
10
10
  var AssetCardBase = require('./AssetCardBase.js');
11
11
 
12
- const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, selected = false, ...props })=>{
12
+ const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, crossOrigin, selected = false, ...props })=>{
13
13
  // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)
14
14
  // applied only if the url is not signed to prevent the signature from being invalidated
15
15
  const thumbnailUrl = isUrlSigned ? thumbnail : appendSearchParamsToUrl.appendSearchParamsToUrl({
@@ -27,7 +27,8 @@ const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned
27
27
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
28
28
  src: thumbnailUrl,
29
29
  size: size,
30
- alt: alt
30
+ alt: alt,
31
+ crossOrigin: crossOrigin
31
32
  })
32
33
  });
33
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ImageAssetCard.js","sources":["../../../../admin/src/components/AssetCard/ImageAssetCard.tsx"],"sourcesContent":["import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n"],"names":["ImageAssetCard","height","width","thumbnail","size","alt","isUrlSigned","selected","props","thumbnailUrl","appendSearchParamsToUrl","url","params","updatedAt","subtitle","undefined","_jsx","AssetCardBase","variant","CardAsset","src"],"mappings":";;;;;;;;;;;AAgBO,MAAMA,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,OAAO,GAAG,EACVC,GAAG,EACHC,WAAW,EACXC,QAAAA,GAAW,KAAK,EAChB,GAAGC,KAAAA,EACiB,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeH,WAAAA,GACjBH,SAAAA,GACAO,+CAAAA,CAAwB;QACtBC,GAAAA,EAAKR,SAAAA;QACLS,MAAAA,EAAQ;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWb,MAAAA,IAAUC,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAAA,CAAAA,CAAQ,GAAGc,SAAAA;AAE7D,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAAA,EAAUA,QAAAA;QAAUO,QAAAA,EAAUA,QAAAA;QAAUI,OAAAA,EAAQ,OAAA;AACxE,QAAA,QAAA,gBAAAF,cAAA,CAACG,sBAAAA,EAAAA;YAAUC,GAAAA,EAAKX,YAAAA;YAAcL,IAAAA,EAAMA,IAAAA;YAAMC,GAAAA,EAAKA;;;AAGrD;;;;"}
1
+ {"version":3,"file":"ImageAssetCard.js","sources":["../../../../admin/src/components/AssetCard/ImageAssetCard.tsx"],"sourcesContent":["import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n crossOrigin,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} crossOrigin={crossOrigin} />\n </AssetCardBase>\n );\n};\n"],"names":["ImageAssetCard","height","width","thumbnail","size","alt","isUrlSigned","crossOrigin","selected","props","thumbnailUrl","appendSearchParamsToUrl","url","params","updatedAt","subtitle","undefined","_jsx","AssetCardBase","variant","CardAsset","src"],"mappings":";;;;;;;;;;;AAiBO,MAAMA,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,IAAAA,GAAO,GAAG,EACVC,GAAG,EACHC,WAAW,EACXC,WAAW,EACXC,QAAAA,GAAW,KAAK,EAChB,GAAGC,KAAAA,EACiB,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeJ,WAAAA,GACjBH,SAAAA,GACAQ,+CAAAA,CAAwB;QACtBC,GAAAA,EAAKT,SAAAA;QACLU,MAAAA,EAAQ;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWd,MAAAA,IAAUC,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAAA,CAAAA,CAAQ,GAAGe,SAAAA;AAE7D,IAAA,qBACEC,cAAA,CAACC,2BAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAAA,EAAUA,QAAAA;QAAUO,QAAAA,EAAUA,QAAAA;QAAUI,OAAAA,EAAQ,OAAA;AACxE,QAAA,QAAA,gBAAAF,cAAA,CAACG,sBAAAA,EAAAA;YAAUC,GAAAA,EAAKX,YAAAA;YAAcN,IAAAA,EAAMA,IAAAA;YAAMC,GAAAA,EAAKA,GAAAA;YAAKE,WAAAA,EAAaA;;;AAGvE;;;;"}
@@ -7,7 +7,7 @@ import 'qs';
7
7
  import '../../utils/urlYupSchema.mjs';
8
8
  import { AssetCardBase } from './AssetCardBase.mjs';
9
9
 
10
- const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, selected = false, ...props })=>{
10
+ const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, crossOrigin, selected = false, ...props })=>{
11
11
  // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)
12
12
  // applied only if the url is not signed to prevent the signature from being invalidated
13
13
  const thumbnailUrl = isUrlSigned ? thumbnail : appendSearchParamsToUrl({
@@ -25,7 +25,8 @@ const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned
25
25
  children: /*#__PURE__*/ jsx(CardAsset, {
26
26
  src: thumbnailUrl,
27
27
  size: size,
28
- alt: alt
28
+ alt: alt,
29
+ crossOrigin: crossOrigin
29
30
  })
30
31
  });
31
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ImageAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/ImageAssetCard.tsx"],"sourcesContent":["import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} />\n </AssetCardBase>\n );\n};\n"],"names":["ImageAssetCard","height","width","thumbnail","size","alt","isUrlSigned","selected","props","thumbnailUrl","appendSearchParamsToUrl","url","params","updatedAt","subtitle","undefined","_jsx","AssetCardBase","variant","CardAsset","src"],"mappings":";;;;;;;;;AAgBO,MAAMA,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,OAAO,GAAG,EACVC,GAAG,EACHC,WAAW,EACXC,QAAAA,GAAW,KAAK,EAChB,GAAGC,KAAAA,EACiB,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeH,WAAAA,GACjBH,SAAAA,GACAO,uBAAAA,CAAwB;QACtBC,GAAAA,EAAKR,SAAAA;QACLS,MAAAA,EAAQ;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWb,MAAAA,IAAUC,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAAA,CAAAA,CAAQ,GAAGc,SAAAA;AAE7D,IAAA,qBACEC,GAAA,CAACC,aAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAAA,EAAUA,QAAAA;QAAUO,QAAAA,EAAUA,QAAAA;QAAUI,OAAAA,EAAQ,OAAA;AACxE,QAAA,QAAA,gBAAAF,GAAA,CAACG,SAAAA,EAAAA;YAAUC,GAAAA,EAAKX,YAAAA;YAAcL,IAAAA,EAAMA,IAAAA;YAAMC,GAAAA,EAAKA;;;AAGrD;;;;"}
1
+ {"version":3,"file":"ImageAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/ImageAssetCard.tsx"],"sourcesContent":["import { CardAsset } from '@strapi/design-system';\n\nimport { appendSearchParamsToUrl } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\ninterface ImageAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n height?: number;\n width?: number;\n size?: 'S' | 'M';\n thumbnail: string;\n alt: string;\n updatedAt?: string;\n isUrlSigned: boolean;\n crossOrigin?: 'anonymous' | 'use-credentials';\n}\n\nexport const ImageAssetCard = ({\n height,\n width,\n thumbnail,\n size = 'M',\n alt,\n isUrlSigned,\n crossOrigin,\n selected = false,\n ...props\n}: ImageAssetCardProps) => {\n // appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)\n // applied only if the url is not signed to prevent the signature from being invalidated\n const thumbnailUrl = isUrlSigned\n ? thumbnail\n : appendSearchParamsToUrl({\n url: thumbnail,\n params: { updatedAt: props.updatedAt },\n });\n const subtitle = height && width ? ` - ${width}✕${height}` : undefined;\n\n return (\n <AssetCardBase {...props} selected={selected} subtitle={subtitle} variant=\"Image\">\n <CardAsset src={thumbnailUrl} size={size} alt={alt} crossOrigin={crossOrigin} />\n </AssetCardBase>\n );\n};\n"],"names":["ImageAssetCard","height","width","thumbnail","size","alt","isUrlSigned","crossOrigin","selected","props","thumbnailUrl","appendSearchParamsToUrl","url","params","updatedAt","subtitle","undefined","_jsx","AssetCardBase","variant","CardAsset","src"],"mappings":";;;;;;;;;AAiBO,MAAMA,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,IAAAA,GAAO,GAAG,EACVC,GAAG,EACHC,WAAW,EACXC,WAAW,EACXC,QAAAA,GAAW,KAAK,EAChB,GAAGC,KAAAA,EACiB,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeJ,WAAAA,GACjBH,SAAAA,GACAQ,uBAAAA,CAAwB;QACtBC,GAAAA,EAAKT,SAAAA;QACLU,MAAAA,EAAQ;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWd,MAAAA,IAAUC,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAAA,CAAAA,CAAQ,GAAGe,SAAAA;AAE7D,IAAA,qBACEC,GAAA,CAACC,aAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAAA,EAAUA,QAAAA;QAAUO,QAAAA,EAAUA,QAAAA;QAAUI,OAAAA,EAAQ,OAAA;AACxE,QAAA,QAAA,gBAAAF,GAAA,CAACG,SAAAA,EAAAA;YAAUC,GAAAA,EAAKX,YAAAA;YAAcN,IAAAA,EAAMA,IAAAA;YAAMC,GAAAA,EAAKA,GAAAA;YAAKE,WAAAA,EAAaA;;;AAGvE;;;;"}
@@ -134,7 +134,7 @@ const EditAssetContent = ({ onClose, asset, initialFolderId = null, canUpdate =
134
134
  }
135
135
  };
136
136
  const activeFolderId = asset?.folder?.id ?? toFolderId(initialFolderId);
137
- const initialFormData = !folderStructureIsLoading && {
137
+ const initialFormData = !folderStructureIsLoading ? {
138
138
  name: asset?.name,
139
139
  alternativeText: asset?.alternativeText ?? undefined,
140
140
  caption: asset?.caption ?? undefined,
@@ -143,7 +143,7 @@ const EditAssetContent = ({ onClose, asset, initialFolderId = null, canUpdate =
143
143
  value: activeFolderId ?? undefined,
144
144
  label: findRecursiveFolderByValue.findRecursiveFolderByValue(folderStructure, activeFolderId)?.label ?? folderStructure[0].label
145
145
  }
146
- };
146
+ } : {};
147
147
  const handleClose = (values)=>{
148
148
  if (!isEqual__default.default(initialFormData, values)) {
149
149
  handleConfirmClose();