node_modules ignore

This commit is contained in:
2025-05-08 23:43:47 +02:00
parent e19d52f172
commit 4574544c9f
65041 changed files with 10593536 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var constants = require('../../constants.js');
var createAssetUrl = require('../../utils/createAssetUrl.js');
require('byte-size');
require('date-fns');
require('qs');
var getFileExtension = require('../../utils/getFileExtension.js');
var prefixFileUrlWithBackendUrl = require('../../utils/prefixFileUrlWithBackendUrl.js');
require('../../utils/urlYupSchema.js');
var AudioAssetCard = require('./AudioAssetCard.js');
var DocAssetCard = require('./DocAssetCard.js');
var ImageAssetCard = require('./ImageAssetCard.js');
var VideoAssetCard = require('./VideoAssetCard.js');
const AssetCard = ({ asset, isSelected = false, onSelect, onEdit, onRemove, size = 'M', local = false })=>{
const handleSelect = onSelect ? ()=>onSelect(asset) : undefined;
const commonAssetCardProps = {
id: asset.id,
isSelectable: asset.isSelectable,
extension: getFileExtension.getFileExtension(asset.ext),
name: asset.name,
url: local ? asset.url : createAssetUrl.createAssetUrl(asset, true),
mime: asset.mime,
onEdit: onEdit ? ()=>onEdit(asset) : undefined,
onSelect: handleSelect,
onRemove: onRemove ? ()=>onRemove(asset) : undefined,
selected: isSelected,
size
};
if (asset.mime?.includes(constants.AssetType.Video)) {
return /*#__PURE__*/ jsxRuntime.jsx(VideoAssetCard.VideoAssetCard, {
...commonAssetCardProps
});
}
if (asset.mime?.includes(constants.AssetType.Image)) {
return /*#__PURE__*/ jsxRuntime.jsx(ImageAssetCard.ImageAssetCard, {
alt: asset.alternativeText || asset.name,
height: asset.height,
thumbnail: prefixFileUrlWithBackendUrl.prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url),
width: asset.width,
updatedAt: asset.updatedAt,
isUrlSigned: asset?.isUrlSigned || false,
...commonAssetCardProps
});
}
if (asset.mime?.includes(constants.AssetType.Audio)) {
return /*#__PURE__*/ jsxRuntime.jsx(AudioAssetCard.AudioAssetCard, {
...commonAssetCardProps
});
}
return /*#__PURE__*/ jsxRuntime.jsx(DocAssetCard.DocAssetCard, {
...commonAssetCardProps
});
};
exports.AssetCard = AssetCard;
//# sourceMappingURL=AssetCard.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AssetCard.js","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { AssetType } from '../../constants';\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}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\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 };\n\n if (asset.mime?.includes(AssetType.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(AssetType.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(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","AssetType","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;;;AA0BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACE,GAAA;AACf,IAAA,MAAMC,YAAeL,GAAAA,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAASQ,CAAAA,GAAAA,SAAAA;AAExD,IAAA,MAAMC,oBAAuB,GAAA;AAC3BC,QAAAA,EAAAA,EAAIV,MAAMU,EAAE;AACZC,QAAAA,YAAAA,EAAcX,MAAMW,YAAY;QAChCC,SAAWC,EAAAA,iCAAAA,CAAiBb,MAAMc,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMf,MAAMe,IAAI;AAChBC,QAAAA,GAAAA,EAAKV,KAAQN,GAAAA,KAAAA,CAAMgB,GAAG,GAAIC,8BAAejB,KAAO,EAAA,IAAA,CAAA;AAChDkB,QAAAA,IAAAA,EAAMlB,MAAMkB,IAAI;QAChBf,MAAQA,EAAAA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAASQ,CAAAA,GAAAA,SAAAA;QACvCN,QAAUK,EAAAA,YAAAA;QACVH,QAAUA,EAAAA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAASQ,CAAAA,GAAAA,SAAAA;QAC7CW,QAAUlB,EAAAA,UAAAA;AACVI,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIL,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,mBAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBAAOC,cAACC,CAAAA,6BAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B;AAEA,IAAA,IAAIT,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,mBAAAA,CAAUI,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEF,cAACG,CAAAA,6BAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK3B,KAAM4B,CAAAA,eAAe,IAAI5B,KAAAA,CAAMe,IAAI;AACxCc,YAAAA,MAAAA,EAAQ7B,MAAM6B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,wDAA4B/B,KAAOgC,EAAAA,OAAAA,EAASF,SAAWd,EAAAA,GAAAA,IAAOhB,MAAMgB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOjC,MAAMiC,KAAK;AAClBC,YAAAA,SAAAA,EAAWlC,MAAMkC,SAAS;AAC1BC,YAAAA,WAAAA,EAAanC,OAAOmC,WAAe,IAAA,KAAA;AAClC,YAAA,GAAG1B;;AAGV;AAEA,IAAA,IAAIT,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,mBAAAA,CAAUe,KAAK,CAAG,EAAA;AACzC,QAAA,qBAAOb,cAACc,CAAAA,6BAAAA,EAAAA;AAAgB,YAAA,GAAG5B;;AAC7B;AAEA,IAAA,qBAAOc,cAACe,CAAAA,yBAAAA,EAAAA;AAAc,QAAA,GAAG7B;;AAC3B;;;;"}

View File

@@ -0,0 +1,57 @@
import { jsx } from 'react/jsx-runtime';
import { AssetType } from '../../constants.mjs';
import { createAssetUrl } from '../../utils/createAssetUrl.mjs';
import 'byte-size';
import 'date-fns';
import 'qs';
import { getFileExtension } from '../../utils/getFileExtension.mjs';
import { prefixFileUrlWithBackendUrl } from '../../utils/prefixFileUrlWithBackendUrl.mjs';
import '../../utils/urlYupSchema.mjs';
import { AudioAssetCard } from './AudioAssetCard.mjs';
import { DocAssetCard } from './DocAssetCard.mjs';
import { ImageAssetCard } from './ImageAssetCard.mjs';
import { VideoAssetCard } from './VideoAssetCard.mjs';
const AssetCard = ({ asset, isSelected = false, onSelect, onEdit, onRemove, size = 'M', local = false })=>{
const handleSelect = onSelect ? ()=>onSelect(asset) : undefined;
const commonAssetCardProps = {
id: asset.id,
isSelectable: asset.isSelectable,
extension: getFileExtension(asset.ext),
name: asset.name,
url: local ? asset.url : createAssetUrl(asset, true),
mime: asset.mime,
onEdit: onEdit ? ()=>onEdit(asset) : undefined,
onSelect: handleSelect,
onRemove: onRemove ? ()=>onRemove(asset) : undefined,
selected: isSelected,
size
};
if (asset.mime?.includes(AssetType.Video)) {
return /*#__PURE__*/ jsx(VideoAssetCard, {
...commonAssetCardProps
});
}
if (asset.mime?.includes(AssetType.Image)) {
return /*#__PURE__*/ jsx(ImageAssetCard, {
alt: asset.alternativeText || asset.name,
height: asset.height,
thumbnail: prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url),
width: asset.width,
updatedAt: asset.updatedAt,
isUrlSigned: asset?.isUrlSigned || false,
...commonAssetCardProps
});
}
if (asset.mime?.includes(AssetType.Audio)) {
return /*#__PURE__*/ jsx(AudioAssetCard, {
...commonAssetCardProps
});
}
return /*#__PURE__*/ jsx(DocAssetCard, {
...commonAssetCardProps
});
};
export { AssetCard };
//# sourceMappingURL=AssetCard.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/AssetCard.tsx"],"sourcesContent":["import { AssetType } from '../../constants';\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}\n\nexport const AssetCard = ({\n asset,\n isSelected = false,\n onSelect,\n onEdit,\n onRemove,\n size = 'M',\n local = false,\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 };\n\n if (asset.mime?.includes(AssetType.Video)) {\n return <VideoAssetCard {...commonAssetCardProps} />;\n }\n\n if (asset.mime?.includes(AssetType.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(AssetType.Audio)) {\n return <AudioAssetCard {...commonAssetCardProps} />;\n }\n\n return <DocAssetCard {...commonAssetCardProps} />;\n};\n"],"names":["AssetCard","asset","isSelected","onSelect","onEdit","onRemove","size","local","handleSelect","undefined","commonAssetCardProps","id","isSelectable","extension","getFileExtension","ext","name","url","createAssetUrl","mime","selected","includes","AssetType","Video","_jsx","VideoAssetCard","Image","ImageAssetCard","alt","alternativeText","height","thumbnail","prefixFileUrlWithBackendUrl","formats","width","updatedAt","isUrlSigned","Audio","AudioAssetCard","DocAssetCard"],"mappings":";;;;;;;;;;;;;;AA0BO,MAAMA,YAAY,CAAC,EACxBC,KAAK,EACLC,UAAAA,GAAa,KAAK,EAClBC,QAAQ,EACRC,MAAM,EACNC,QAAQ,EACRC,IAAAA,GAAO,GAAG,EACVC,KAAAA,GAAQ,KAAK,EACE,GAAA;AACf,IAAA,MAAMC,YAAeL,GAAAA,QAAAA,GAAW,IAAMA,QAAAA,CAASF,KAASQ,CAAAA,GAAAA,SAAAA;AAExD,IAAA,MAAMC,oBAAuB,GAAA;AAC3BC,QAAAA,EAAAA,EAAIV,MAAMU,EAAE;AACZC,QAAAA,YAAAA,EAAcX,MAAMW,YAAY;QAChCC,SAAWC,EAAAA,gBAAAA,CAAiBb,MAAMc,GAAG,CAAA;AACrCC,QAAAA,IAAAA,EAAMf,MAAMe,IAAI;AAChBC,QAAAA,GAAAA,EAAKV,KAAQN,GAAAA,KAAAA,CAAMgB,GAAG,GAAIC,eAAejB,KAAO,EAAA,IAAA,CAAA;AAChDkB,QAAAA,IAAAA,EAAMlB,MAAMkB,IAAI;QAChBf,MAAQA,EAAAA,MAAAA,GAAS,IAAMA,MAAAA,CAAOH,KAASQ,CAAAA,GAAAA,SAAAA;QACvCN,QAAUK,EAAAA,YAAAA;QACVH,QAAUA,EAAAA,QAAAA,GAAW,IAAMA,QAAAA,CAASJ,KAASQ,CAAAA,GAAAA,SAAAA;QAC7CW,QAAUlB,EAAAA,UAAAA;AACVI,QAAAA;AACF,KAAA;AAEA,IAAA,IAAIL,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,SAAAA,CAAUC,KAAK,CAAG,EAAA;AACzC,QAAA,qBAAOC,GAACC,CAAAA,cAAAA,EAAAA;AAAgB,YAAA,GAAGf;;AAC7B;AAEA,IAAA,IAAIT,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,SAAAA,CAAUI,KAAK,CAAG,EAAA;AACzC,QAAA,qBACEF,GAACG,CAAAA,cAAAA,EAAAA;AACCC,YAAAA,GAAAA,EAAK3B,KAAM4B,CAAAA,eAAe,IAAI5B,KAAAA,CAAMe,IAAI;AACxCc,YAAAA,MAAAA,EAAQ7B,MAAM6B,MAAM;AACpBC,YAAAA,SAAAA,EAAWC,4BAA4B/B,KAAOgC,EAAAA,OAAAA,EAASF,SAAWd,EAAAA,GAAAA,IAAOhB,MAAMgB,GAAG,CAAA;AAClFiB,YAAAA,KAAAA,EAAOjC,MAAMiC,KAAK;AAClBC,YAAAA,SAAAA,EAAWlC,MAAMkC,SAAS;AAC1BC,YAAAA,WAAAA,EAAanC,OAAOmC,WAAe,IAAA,KAAA;AAClC,YAAA,GAAG1B;;AAGV;AAEA,IAAA,IAAIT,MAAMkB,IAAI,EAAEE,QAASC,CAAAA,SAAAA,CAAUe,KAAK,CAAG,EAAA;AACzC,QAAA,qBAAOb,GAACc,CAAAA,cAAAA,EAAAA;AAAgB,YAAA,GAAG5B;;AAC7B;AAEA,IAAA,qBAAOc,GAACe,CAAAA,YAAAA,EAAAA;AAAc,QAAA,GAAG7B;;AAC3B;;;;"}

View File

@@ -0,0 +1,130 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
require('react');
var designSystem = require('@strapi/design-system');
var icons = require('@strapi/icons');
var reactIntl = require('react-intl');
var styledComponents = require('styled-components');
require('byte-size');
require('date-fns');
var getTrad = require('../../utils/getTrad.js');
require('qs');
require('../../constants.js');
require('../../utils/urlYupSchema.js');
const Extension = styledComponents.styled.span`
text-transform: uppercase;
`;
const CardActionsContainer = styledComponents.styled(designSystem.CardAction)`
opacity: 0;
&:focus-within {
opacity: 1;
}
`;
const CardContainer = styledComponents.styled(designSystem.Card)`
cursor: pointer;
&:hover {
${CardActionsContainer} {
opacity: 1;
}
}
`;
const AssetCardBase = ({ children, extension, isSelectable = false, name, onSelect, onRemove, onEdit, selected = false, subtitle = '', variant = 'Image' })=>{
const { formatMessage } = reactIntl.useIntl();
const handleClick = (e)=>{
if (onEdit) {
onEdit(e);
}
};
/**
* This is required because we need to stop the propagation of the event
* bubbling to the `CardContainer`, however the `CardCheckbox` only returns
* the `boolean` value as opposed to the event itself.
*/ const handlePropagationClick = (e)=>{
e.stopPropagation();
};
return /*#__PURE__*/ jsxRuntime.jsxs(CardContainer, {
role: "button",
height: "100%",
tabIndex: -1,
onClick: handleClick,
children: [
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardHeader, {
children: [
isSelectable && /*#__PURE__*/ jsxRuntime.jsx("div", {
onClick: handlePropagationClick,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardCheckbox, {
checked: selected,
onCheckedChange: onSelect
})
}),
(onRemove || onEdit) && /*#__PURE__*/ jsxRuntime.jsxs(CardActionsContainer, {
onClick: handlePropagationClick,
position: "end",
children: [
onRemove && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
label: formatMessage({
id: getTrad.getTrad('control-card.remove-selection'),
defaultMessage: 'Remove from selection'
}),
onClick: onRemove,
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Trash, {})
}),
onEdit && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
label: formatMessage({
id: getTrad.getTrad('control-card.edit'),
defaultMessage: 'Edit'
}),
onClick: onEdit,
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Pencil, {})
})
]
}),
children
]
}),
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardBody, {
children: [
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardContent, {
children: [
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
paddingTop: 1,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
tag: "h2",
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardTitle, {
tag: "span",
children: name
})
})
}),
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardSubtitle, {
children: [
/*#__PURE__*/ jsxRuntime.jsx(Extension, {
children: extension
}),
subtitle
]
})
]
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
paddingTop: 1,
grow: 1,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardBadge, {
children: formatMessage({
id: getTrad.getTrad(`settings.section.${variant.toLowerCase()}.label`),
defaultMessage: variant
})
})
})
]
})
]
});
};
exports.AssetCardBase = AssetCardBase;
//# sourceMappingURL=AssetCardBase.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,128 @@
import { jsxs, jsx } from 'react/jsx-runtime';
import 'react';
import { CardAction, Card, CardHeader, CardCheckbox, IconButton, CardBody, CardContent, Box, Typography, CardTitle, CardSubtitle, Flex, CardBadge } from '@strapi/design-system';
import { Trash, Pencil } from '@strapi/icons';
import { useIntl } from 'react-intl';
import { styled } from 'styled-components';
import 'byte-size';
import 'date-fns';
import { getTrad } from '../../utils/getTrad.mjs';
import 'qs';
import '../../constants.mjs';
import '../../utils/urlYupSchema.mjs';
const Extension = styled.span`
text-transform: uppercase;
`;
const CardActionsContainer = styled(CardAction)`
opacity: 0;
&:focus-within {
opacity: 1;
}
`;
const CardContainer = styled(Card)`
cursor: pointer;
&:hover {
${CardActionsContainer} {
opacity: 1;
}
}
`;
const AssetCardBase = ({ children, extension, isSelectable = false, name, onSelect, onRemove, onEdit, selected = false, subtitle = '', variant = 'Image' })=>{
const { formatMessage } = useIntl();
const handleClick = (e)=>{
if (onEdit) {
onEdit(e);
}
};
/**
* This is required because we need to stop the propagation of the event
* bubbling to the `CardContainer`, however the `CardCheckbox` only returns
* the `boolean` value as opposed to the event itself.
*/ const handlePropagationClick = (e)=>{
e.stopPropagation();
};
return /*#__PURE__*/ jsxs(CardContainer, {
role: "button",
height: "100%",
tabIndex: -1,
onClick: handleClick,
children: [
/*#__PURE__*/ jsxs(CardHeader, {
children: [
isSelectable && /*#__PURE__*/ jsx("div", {
onClick: handlePropagationClick,
children: /*#__PURE__*/ jsx(CardCheckbox, {
checked: selected,
onCheckedChange: onSelect
})
}),
(onRemove || onEdit) && /*#__PURE__*/ jsxs(CardActionsContainer, {
onClick: handlePropagationClick,
position: "end",
children: [
onRemove && /*#__PURE__*/ jsx(IconButton, {
label: formatMessage({
id: getTrad('control-card.remove-selection'),
defaultMessage: 'Remove from selection'
}),
onClick: onRemove,
children: /*#__PURE__*/ jsx(Trash, {})
}),
onEdit && /*#__PURE__*/ jsx(IconButton, {
label: formatMessage({
id: getTrad('control-card.edit'),
defaultMessage: 'Edit'
}),
onClick: onEdit,
children: /*#__PURE__*/ jsx(Pencil, {})
})
]
}),
children
]
}),
/*#__PURE__*/ jsxs(CardBody, {
children: [
/*#__PURE__*/ jsxs(CardContent, {
children: [
/*#__PURE__*/ jsx(Box, {
paddingTop: 1,
children: /*#__PURE__*/ jsx(Typography, {
tag: "h2",
children: /*#__PURE__*/ jsx(CardTitle, {
tag: "span",
children: name
})
})
}),
/*#__PURE__*/ jsxs(CardSubtitle, {
children: [
/*#__PURE__*/ jsx(Extension, {
children: extension
}),
subtitle
]
})
]
}),
/*#__PURE__*/ jsx(Flex, {
paddingTop: 1,
grow: 1,
children: /*#__PURE__*/ jsx(CardBadge, {
children: formatMessage({
id: getTrad(`settings.section.${variant.toLowerCase()}.label`),
defaultMessage: variant
})
})
})
]
})
]
});
};
export { AssetCardBase };
//# sourceMappingURL=AssetCardBase.mjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,40 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var designSystem = require('@strapi/design-system');
var styledComponents = require('styled-components');
var AssetCardBase = require('./AssetCardBase.js');
var AudioPreview = require('./AudioPreview.js');
const AudioPreviewWrapper = styledComponents.styled(designSystem.Box)`
canvas,
audio {
display: block;
max-width: 100%;
max-height: ${({ size })=>size === 'M' ? 16.4 : 8.8}rem;
}
`;
const AudioAssetCard = ({ name, url, size = 'M', selected = false, ...restProps })=>{
return /*#__PURE__*/ jsxRuntime.jsx(AssetCardBase.AssetCardBase, {
name: name,
selected: selected,
...restProps,
variant: "Audio",
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
size: size,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
alignItems: "center",
children: /*#__PURE__*/ jsxRuntime.jsx(AudioPreviewWrapper, {
size: size,
children: /*#__PURE__*/ jsxRuntime.jsx(AudioPreview.AudioPreview, {
url: url,
alt: name
})
})
})
})
});
};
exports.AudioAssetCard = AudioAssetCard;
//# sourceMappingURL=AudioAssetCard.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AudioAssetCard.js","sources":["../../../../admin/src/components/AssetCard/AudioAssetCard.tsx"],"sourcesContent":["import { Box, CardAsset, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\nimport { AudioPreview } from './AudioPreview';\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\ninterface AudioAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n url: string;\n}\n\nexport const AudioAssetCard = ({\n name,\n url,\n size = 'M',\n selected = false,\n ...restProps\n}: AudioAssetCardProps) => {\n return (\n <AssetCardBase name={name} selected={selected} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <Flex alignItems=\"center\">\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n"],"names":["AudioPreviewWrapper","styled","Box","size","AudioAssetCard","name","url","selected","restProps","_jsx","AssetCardBase","variant","CardAsset","Flex","alignItems","AudioPreview","alt"],"mappings":";;;;;;;;AAMA,MAAMA,mBAAAA,GAAsBC,uBAAOC,CAAAA,gBAAAA,CAAI;;;;;gBAKvB,EAAE,CAAC,EAAEC,IAAI,EAAE,GAAMA,IAAS,KAAA,GAAA,GAAM,OAAO,GAAK,CAAA;;AAE5D,CAAC;AAOYC,MAAAA,cAAAA,GAAiB,CAAC,EAC7BC,IAAI,EACJC,GAAG,EACHH,IAAAA,GAAO,GAAG,EACVI,QAAAA,GAAW,KAAK,EAChB,GAAGC,SACiB,EAAA,GAAA;AACpB,IAAA,qBACEC,cAACC,CAAAA,2BAAAA,EAAAA;QAAcL,IAAMA,EAAAA,IAAAA;QAAME,QAAUA,EAAAA,QAAAA;AAAW,QAAA,GAAGC,SAAS;QAAEG,OAAQ,EAAA,OAAA;AACpE,QAAA,QAAA,gBAAAF,cAACG,CAAAA,sBAAAA,EAAAA;YAAUT,IAAMA,EAAAA,IAAAA;AACf,YAAA,QAAA,gBAAAM,cAACI,CAAAA,iBAAAA,EAAAA;gBAAKC,UAAW,EAAA,QAAA;AACf,gBAAA,QAAA,gBAAAL,cAACT,CAAAA,mBAAAA,EAAAA;oBAAoBG,IAAMA,EAAAA,IAAAA;AACzB,oBAAA,QAAA,gBAAAM,cAACM,CAAAA,yBAAAA,EAAAA;wBAAaT,GAAKA,EAAAA,GAAAA;wBAAKU,GAAKX,EAAAA;;;;;;AAMzC;;;;"}

View File

@@ -0,0 +1,38 @@
import { jsx } from 'react/jsx-runtime';
import { Box, CardAsset, Flex } from '@strapi/design-system';
import { styled } from 'styled-components';
import { AssetCardBase } from './AssetCardBase.mjs';
import { AudioPreview } from './AudioPreview.mjs';
const AudioPreviewWrapper = styled(Box)`
canvas,
audio {
display: block;
max-width: 100%;
max-height: ${({ size })=>size === 'M' ? 16.4 : 8.8}rem;
}
`;
const AudioAssetCard = ({ name, url, size = 'M', selected = false, ...restProps })=>{
return /*#__PURE__*/ jsx(AssetCardBase, {
name: name,
selected: selected,
...restProps,
variant: "Audio",
children: /*#__PURE__*/ jsx(CardAsset, {
size: size,
children: /*#__PURE__*/ jsx(Flex, {
alignItems: "center",
children: /*#__PURE__*/ jsx(AudioPreviewWrapper, {
size: size,
children: /*#__PURE__*/ jsx(AudioPreview, {
url: url,
alt: name
})
})
})
})
});
};
export { AudioAssetCard };
//# sourceMappingURL=AudioAssetCard.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AudioAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/AudioAssetCard.tsx"],"sourcesContent":["import { Box, CardAsset, Flex } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\nimport { AudioPreview } from './AudioPreview';\n\nconst AudioPreviewWrapper = styled(Box)`\n canvas,\n audio {\n display: block;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\ninterface AudioAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n url: string;\n}\n\nexport const AudioAssetCard = ({\n name,\n url,\n size = 'M',\n selected = false,\n ...restProps\n}: AudioAssetCardProps) => {\n return (\n <AssetCardBase name={name} selected={selected} {...restProps} variant=\"Audio\">\n <CardAsset size={size}>\n <Flex alignItems=\"center\">\n <AudioPreviewWrapper size={size}>\n <AudioPreview url={url} alt={name} />\n </AudioPreviewWrapper>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n"],"names":["AudioPreviewWrapper","styled","Box","size","AudioAssetCard","name","url","selected","restProps","_jsx","AssetCardBase","variant","CardAsset","Flex","alignItems","AudioPreview","alt"],"mappings":";;;;;;AAMA,MAAMA,mBAAAA,GAAsBC,MAAOC,CAAAA,GAAAA,CAAI;;;;;gBAKvB,EAAE,CAAC,EAAEC,IAAI,EAAE,GAAMA,IAAS,KAAA,GAAA,GAAM,OAAO,GAAK,CAAA;;AAE5D,CAAC;AAOYC,MAAAA,cAAAA,GAAiB,CAAC,EAC7BC,IAAI,EACJC,GAAG,EACHH,IAAAA,GAAO,GAAG,EACVI,QAAAA,GAAW,KAAK,EAChB,GAAGC,SACiB,EAAA,GAAA;AACpB,IAAA,qBACEC,GAACC,CAAAA,aAAAA,EAAAA;QAAcL,IAAMA,EAAAA,IAAAA;QAAME,QAAUA,EAAAA,QAAAA;AAAW,QAAA,GAAGC,SAAS;QAAEG,OAAQ,EAAA,OAAA;AACpE,QAAA,QAAA,gBAAAF,GAACG,CAAAA,SAAAA,EAAAA;YAAUT,IAAMA,EAAAA,IAAAA;AACf,YAAA,QAAA,gBAAAM,GAACI,CAAAA,IAAAA,EAAAA;gBAAKC,UAAW,EAAA,QAAA;AACf,gBAAA,QAAA,gBAAAL,GAACT,CAAAA,mBAAAA,EAAAA;oBAAoBG,IAAMA,EAAAA,IAAAA;AACzB,oBAAA,QAAA,gBAAAM,GAACM,CAAAA,YAAAA,EAAAA;wBAAaT,GAAKA,EAAAA,GAAAA;wBAAKU,GAAKX,EAAAA;;;;;;AAMzC;;;;"}

View File

@@ -0,0 +1,17 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var designSystem = require('@strapi/design-system');
const AudioPreview = ({ url, alt })=>{
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
children: /*#__PURE__*/ jsxRuntime.jsx("audio", {
controls: true,
src: url,
children: alt
})
});
};
exports.AudioPreview = AudioPreview;
//# sourceMappingURL=AudioPreview.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AudioPreview.js","sources":["../../../../admin/src/components/AssetCard/AudioPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport { Box } from '@strapi/design-system';\n\ninterface AudioPreviewProps {\n alt: string;\n url: string;\n}\n\nexport const AudioPreview = ({ url, alt }: AudioPreviewProps) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n"],"names":["AudioPreview","url","alt","_jsx","Box","audio","controls","src"],"mappings":";;;;;MAQaA,YAAe,GAAA,CAAC,EAAEC,GAAG,EAAEC,GAAG,EAAqB,GAAA;AAC1D,IAAA,qBACEC,cAACC,CAAAA,gBAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAD,cAACE,CAAAA,OAAAA,EAAAA;YAAMC,QAAQ,EAAA,IAAA;YAACC,GAAKN,EAAAA,GAAAA;AAClBC,YAAAA,QAAAA,EAAAA;;;AAIT;;;;"}

View File

@@ -0,0 +1,15 @@
import { jsx } from 'react/jsx-runtime';
import { Box } from '@strapi/design-system';
const AudioPreview = ({ url, alt })=>{
return /*#__PURE__*/ jsx(Box, {
children: /*#__PURE__*/ jsx("audio", {
controls: true,
src: url,
children: alt
})
});
};
export { AudioPreview };
//# sourceMappingURL=AudioPreview.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AudioPreview.mjs","sources":["../../../../admin/src/components/AssetCard/AudioPreview.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/media-has-caption */\nimport { Box } from '@strapi/design-system';\n\ninterface AudioPreviewProps {\n alt: string;\n url: string;\n}\n\nexport const AudioPreview = ({ url, alt }: AudioPreviewProps) => {\n return (\n <Box>\n <audio controls src={url}>\n {alt}\n </audio>\n </Box>\n );\n};\n"],"names":["AudioPreview","url","alt","_jsx","Box","audio","controls","src"],"mappings":";;;MAQaA,YAAe,GAAA,CAAC,EAAEC,GAAG,EAAEC,GAAG,EAAqB,GAAA;AAC1D,IAAA,qBACEC,GAACC,CAAAA,GAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAD,GAACE,CAAAA,OAAAA,EAAAA;YAAMC,QAAQ,EAAA,IAAA;YAACC,GAAKN,EAAAA,GAAAA;AAClBC,YAAAA,QAAAA,EAAAA;;;AAIT;;;;"}

View File

@@ -0,0 +1,61 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var designSystem = require('@strapi/design-system');
var icons = require('@strapi/icons');
var reactIntl = require('react-intl');
var styledComponents = require('styled-components');
var AssetCardBase = require('./AssetCardBase.js');
const CardAsset = styledComponents.styled(designSystem.Flex)`
border-radius: ${({ theme })=>theme.borderRadius} ${({ theme })=>theme.borderRadius} 0 0;
background: linear-gradient(
180deg,
${({ theme })=>theme.colors.neutral0} 0%,
${({ theme })=>theme.colors.neutral100} 121.48%
);
`;
const DocAssetCard = ({ name, extension, size = 'M', selected = false, ...restProps })=>{
const { formatMessage } = reactIntl.useIntl();
return /*#__PURE__*/ jsxRuntime.jsx(AssetCardBase.AssetCardBase, {
name: name,
extension: extension,
selected: selected,
...restProps,
variant: "Doc",
children: /*#__PURE__*/ jsxRuntime.jsx(CardAsset, {
width: "100%",
height: size === 'S' ? `8.8rem` : `16.4rem`,
justifyContent: "center",
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
gap: 2,
direction: "column",
alignItems: "center",
children: [
extension === 'pdf' ? /*#__PURE__*/ jsxRuntime.jsx(icons.FilePdf, {
"aria-label": name,
fill: "neutral500",
width: 24,
height: 24
}) : /*#__PURE__*/ jsxRuntime.jsx(icons.File, {
"aria-label": name,
fill: "neutral500",
width: 24,
height: 24
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
textColor: "neutral500",
variant: "pi",
children: formatMessage({
id: 'noPreview',
defaultMessage: 'No preview available'
})
})
]
})
})
});
};
exports.DocAssetCard = DocAssetCard;
//# sourceMappingURL=DocAssetCard.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocAssetCard.js","sources":["../../../../admin/src/components/AssetCard/DocAssetCard.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface DocAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n extension: string;\n}\n\nexport const DocAssetCard = ({\n name,\n extension,\n size = 'M',\n selected = false,\n ...restProps\n}: DocAssetCardProps) => {\n const { formatMessage } = useIntl();\n return (\n <AssetCardBase\n name={name}\n extension={extension}\n selected={selected}\n {...restProps}\n variant=\"Doc\"\n >\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n {extension === 'pdf' ? (\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n ) : (\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n )}\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","DocAssetCard","name","extension","size","selected","restProps","formatMessage","useIntl","_jsx","AssetCardBase","variant","width","height","justifyContent","_jsxs","gap","direction","alignItems","FilePdf","aria-label","fill","File","Typography","textColor","id","defaultMessage"],"mappings":";;;;;;;;;AAOA,MAAMA,SAAAA,GAAYC,uBAAOC,CAAAA,iBAAAA,CAAK;AACb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAME,CAAAA,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAME,CAAAA,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAOYC,MAAAA,YAAAA,GAAe,CAAC,EAC3BC,IAAI,EACJC,SAAS,EACTC,IAAAA,GAAO,GAAG,EACVC,QAAAA,GAAW,KAAK,EAChB,GAAGC,SACe,EAAA,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,qBACEC,cAACC,CAAAA,2BAAAA,EAAAA;QACCR,IAAMA,EAAAA,IAAAA;QACNC,SAAWA,EAAAA,SAAAA;QACXE,QAAUA,EAAAA,QAAAA;AACT,QAAA,GAAGC,SAAS;QACbK,OAAQ,EAAA,KAAA;AAER,QAAA,QAAA,gBAAAF,cAAChB,CAAAA,SAAAA,EAAAA;YAAUmB,KAAM,EAAA,MAAA;YAAOC,MAAQT,EAAAA,IAAAA,KAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YAAEU,cAAe,EAAA,QAAA;AAClF,YAAA,QAAA,gBAAAC,eAACpB,CAAAA,iBAAAA,EAAAA;gBAAKqB,GAAK,EAAA,CAAA;gBAAGC,SAAU,EAAA,QAAA;gBAASC,UAAW,EAAA,QAAA;;AACzCf,oBAAAA,SAAAA,KAAc,sBACbM,cAACU,CAAAA,aAAAA,EAAAA;wBAAQC,YAAYlB,EAAAA,IAAAA;wBAAMmB,IAAK,EAAA,YAAA;wBAAaT,KAAO,EAAA,EAAA;wBAAIC,MAAQ,EAAA;uCAEhEJ,cAACa,CAAAA,UAAAA,EAAAA;wBAAKF,YAAYlB,EAAAA,IAAAA;wBAAMmB,IAAK,EAAA,YAAA;wBAAaT,KAAO,EAAA,EAAA;wBAAIC,MAAQ,EAAA;;kCAG/DJ,cAACc,CAAAA,uBAAAA,EAAAA;wBAAWC,SAAU,EAAA,YAAA;wBAAab,OAAQ,EAAA,IAAA;kCACxCJ,aAAc,CAAA;4BACbkB,EAAI,EAAA,WAAA;4BACJC,cAAgB,EAAA;AAClB,yBAAA;;;;;;AAMZ;;;;"}

View File

@@ -0,0 +1,59 @@
import { jsx, jsxs } from 'react/jsx-runtime';
import { Flex, Typography } from '@strapi/design-system';
import { FilePdf, File } from '@strapi/icons';
import { useIntl } from 'react-intl';
import { styled } from 'styled-components';
import { AssetCardBase } from './AssetCardBase.mjs';
const CardAsset = styled(Flex)`
border-radius: ${({ theme })=>theme.borderRadius} ${({ theme })=>theme.borderRadius} 0 0;
background: linear-gradient(
180deg,
${({ theme })=>theme.colors.neutral0} 0%,
${({ theme })=>theme.colors.neutral100} 121.48%
);
`;
const DocAssetCard = ({ name, extension, size = 'M', selected = false, ...restProps })=>{
const { formatMessage } = useIntl();
return /*#__PURE__*/ jsx(AssetCardBase, {
name: name,
extension: extension,
selected: selected,
...restProps,
variant: "Doc",
children: /*#__PURE__*/ jsx(CardAsset, {
width: "100%",
height: size === 'S' ? `8.8rem` : `16.4rem`,
justifyContent: "center",
children: /*#__PURE__*/ jsxs(Flex, {
gap: 2,
direction: "column",
alignItems: "center",
children: [
extension === 'pdf' ? /*#__PURE__*/ jsx(FilePdf, {
"aria-label": name,
fill: "neutral500",
width: 24,
height: 24
}) : /*#__PURE__*/ jsx(File, {
"aria-label": name,
fill: "neutral500",
width: 24,
height: 24
}),
/*#__PURE__*/ jsx(Typography, {
textColor: "neutral500",
variant: "pi",
children: formatMessage({
id: 'noPreview',
defaultMessage: 'No preview available'
})
})
]
})
})
});
};
export { DocAssetCard };
//# sourceMappingURL=DocAssetCard.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DocAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/DocAssetCard.tsx"],"sourcesContent":["import { Flex, Typography } from '@strapi/design-system';\nimport { File, FilePdf } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\n\nconst CardAsset = styled(Flex)`\n border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;\n background: linear-gradient(\n 180deg,\n ${({ theme }) => theme.colors.neutral0} 0%,\n ${({ theme }) => theme.colors.neutral100} 121.48%\n );\n`;\n\ninterface DocAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n size?: 'S' | 'M';\n extension: string;\n}\n\nexport const DocAssetCard = ({\n name,\n extension,\n size = 'M',\n selected = false,\n ...restProps\n}: DocAssetCardProps) => {\n const { formatMessage } = useIntl();\n return (\n <AssetCardBase\n name={name}\n extension={extension}\n selected={selected}\n {...restProps}\n variant=\"Doc\"\n >\n <CardAsset width=\"100%\" height={size === 'S' ? `8.8rem` : `16.4rem`} justifyContent=\"center\">\n <Flex gap={2} direction=\"column\" alignItems=\"center\">\n {extension === 'pdf' ? (\n <FilePdf aria-label={name} fill=\"neutral500\" width={24} height={24} />\n ) : (\n <File aria-label={name} fill=\"neutral500\" width={24} height={24} />\n )}\n\n <Typography textColor=\"neutral500\" variant=\"pi\">\n {formatMessage({\n id: 'noPreview',\n defaultMessage: 'No preview available',\n })}\n </Typography>\n </Flex>\n </CardAsset>\n </AssetCardBase>\n );\n};\n"],"names":["CardAsset","styled","Flex","theme","borderRadius","colors","neutral0","neutral100","DocAssetCard","name","extension","size","selected","restProps","formatMessage","useIntl","_jsx","AssetCardBase","variant","width","height","justifyContent","_jsxs","gap","direction","alignItems","FilePdf","aria-label","fill","File","Typography","textColor","id","defaultMessage"],"mappings":";;;;;;;AAOA,MAAMA,SAAAA,GAAYC,MAAOC,CAAAA,IAAAA,CAAK;AACb,iBAAA,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAAA,CAAMC,YAAY,CAAC;;;IAGtF,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAME,CAAAA,MAAM,CAACC,QAAQ,CAAC;IACvC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAME,CAAAA,MAAM,CAACE,UAAU,CAAC;;AAE7C,CAAC;AAOYC,MAAAA,YAAAA,GAAe,CAAC,EAC3BC,IAAI,EACJC,SAAS,EACTC,IAAAA,GAAO,GAAG,EACVC,QAAAA,GAAW,KAAK,EAChB,GAAGC,SACe,EAAA,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,qBACEC,GAACC,CAAAA,aAAAA,EAAAA;QACCR,IAAMA,EAAAA,IAAAA;QACNC,SAAWA,EAAAA,SAAAA;QACXE,QAAUA,EAAAA,QAAAA;AACT,QAAA,GAAGC,SAAS;QACbK,OAAQ,EAAA,KAAA;AAER,QAAA,QAAA,gBAAAF,GAAChB,CAAAA,SAAAA,EAAAA;YAAUmB,KAAM,EAAA,MAAA;YAAOC,MAAQT,EAAAA,IAAAA,KAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YAAEU,cAAe,EAAA,QAAA;AAClF,YAAA,QAAA,gBAAAC,IAACpB,CAAAA,IAAAA,EAAAA;gBAAKqB,GAAK,EAAA,CAAA;gBAAGC,SAAU,EAAA,QAAA;gBAASC,UAAW,EAAA,QAAA;;AACzCf,oBAAAA,SAAAA,KAAc,sBACbM,GAACU,CAAAA,OAAAA,EAAAA;wBAAQC,YAAYlB,EAAAA,IAAAA;wBAAMmB,IAAK,EAAA,YAAA;wBAAaT,KAAO,EAAA,EAAA;wBAAIC,MAAQ,EAAA;uCAEhEJ,GAACa,CAAAA,IAAAA,EAAAA;wBAAKF,YAAYlB,EAAAA,IAAAA;wBAAMmB,IAAK,EAAA,YAAA;wBAAaT,KAAO,EAAA,EAAA;wBAAIC,MAAQ,EAAA;;kCAG/DJ,GAACc,CAAAA,UAAAA,EAAAA;wBAAWC,SAAU,EAAA,YAAA;wBAAab,OAAQ,EAAA,IAAA;kCACxCJ,aAAc,CAAA;4BACbkB,EAAI,EAAA,WAAA;4BACJC,cAAgB,EAAA;AAClB,yBAAA;;;;;;AAMZ;;;;"}

View File

@@ -0,0 +1,37 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var designSystem = require('@strapi/design-system');
var appendSearchParamsToUrl = require('../../utils/appendSearchParamsToUrl.js');
require('byte-size');
require('date-fns');
require('qs');
require('../../constants.js');
require('../../utils/urlYupSchema.js');
var AssetCardBase = require('./AssetCardBase.js');
const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, selected = false, ...props })=>{
// appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)
// applied only if the url is not signed to prevent the signature from being invalidated
const thumbnailUrl = isUrlSigned ? thumbnail : appendSearchParamsToUrl.appendSearchParamsToUrl({
url: thumbnail,
params: {
updatedAt: props.updatedAt
}
});
const subtitle = height && width ? ` - ${width}${height}` : undefined;
return /*#__PURE__*/ jsxRuntime.jsx(AssetCardBase.AssetCardBase, {
...props,
selected: selected,
subtitle: subtitle,
variant: "Image",
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
src: thumbnailUrl,
size: size,
alt: alt
})
});
};
exports.ImageAssetCard = ImageAssetCard;
//# sourceMappingURL=ImageAssetCard.js.map

View File

@@ -0,0 +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,QAAW,GAAA,KAAK,EAChB,GAAGC,KACiB,EAAA,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeH,WACjBH,GAAAA,SAAAA,GACAO,+CAAwB,CAAA;QACtBC,GAAKR,EAAAA,SAAAA;QACLS,MAAQ,EAAA;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWb,MAAUC,IAAAA,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAO,CAAA,CAAC,GAAGc,SAAAA;AAE7D,IAAA,qBACEC,cAACC,CAAAA,2BAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAUA,EAAAA,QAAAA;QAAUO,QAAUA,EAAAA,QAAAA;QAAUI,OAAQ,EAAA,OAAA;AACxE,QAAA,QAAA,gBAAAF,cAACG,CAAAA,sBAAAA,EAAAA;YAAUC,GAAKX,EAAAA,YAAAA;YAAcL,IAAMA,EAAAA,IAAAA;YAAMC,GAAKA,EAAAA;;;AAGrD;;;;"}

View File

@@ -0,0 +1,35 @@
import { jsx } from 'react/jsx-runtime';
import { CardAsset } from '@strapi/design-system';
import { appendSearchParamsToUrl } from '../../utils/appendSearchParamsToUrl.mjs';
import 'byte-size';
import 'date-fns';
import 'qs';
import '../../constants.mjs';
import '../../utils/urlYupSchema.mjs';
import { AssetCardBase } from './AssetCardBase.mjs';
const ImageAssetCard = ({ height, width, thumbnail, size = 'M', alt, isUrlSigned, selected = false, ...props })=>{
// appending the updatedAt param to the thumbnail URL prevents it from being cached by the browser (cache busting)
// applied only if the url is not signed to prevent the signature from being invalidated
const thumbnailUrl = isUrlSigned ? thumbnail : appendSearchParamsToUrl({
url: thumbnail,
params: {
updatedAt: props.updatedAt
}
});
const subtitle = height && width ? ` - ${width}${height}` : undefined;
return /*#__PURE__*/ jsx(AssetCardBase, {
...props,
selected: selected,
subtitle: subtitle,
variant: "Image",
children: /*#__PURE__*/ jsx(CardAsset, {
src: thumbnailUrl,
size: size,
alt: alt
})
});
};
export { ImageAssetCard };
//# sourceMappingURL=ImageAssetCard.mjs.map

View File

@@ -0,0 +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,QAAW,GAAA,KAAK,EAChB,GAAGC,KACiB,EAAA,GAAA;;;IAGpB,MAAMC,YAAAA,GAAeH,WACjBH,GAAAA,SAAAA,GACAO,uBAAwB,CAAA;QACtBC,GAAKR,EAAAA,SAAAA;QACLS,MAAQ,EAAA;AAAEC,YAAAA,SAAAA,EAAWL,MAAMK;AAAU;AACvC,KAAA,CAAA;IACJ,MAAMC,QAAAA,GAAWb,MAAUC,IAAAA,KAAAA,GAAQ,CAAC,GAAG,EAAEA,KAAAA,CAAM,CAAC,EAAED,MAAO,CAAA,CAAC,GAAGc,SAAAA;AAE7D,IAAA,qBACEC,GAACC,CAAAA,aAAAA,EAAAA;AAAe,QAAA,GAAGT,KAAK;QAAED,QAAUA,EAAAA,QAAAA;QAAUO,QAAUA,EAAAA,QAAAA;QAAUI,OAAQ,EAAA,OAAA;AACxE,QAAA,QAAA,gBAAAF,GAACG,CAAAA,SAAAA,EAAAA;YAAUC,GAAKX,EAAAA,YAAAA;YAAcL,IAAMA,EAAAA,IAAAA;YAAMC,GAAKA,EAAAA;;;AAGrD;;;;"}

View File

@@ -0,0 +1,152 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var React = require('react');
var designSystem = require('@strapi/design-system');
var reactIntl = require('react-intl');
var styledComponents = require('styled-components');
var constants = require('../../constants.js');
var useUpload = require('../../hooks/useUpload.js');
require('byte-size');
require('date-fns');
var getTrad = require('../../utils/getTrad.js');
require('qs');
require('../../utils/urlYupSchema.js');
var UploadProgress = require('../UploadProgress/UploadProgress.js');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
const UploadProgressWrapper = styledComponents.styled.div`
height: 8.8rem;
width: 100%;
`;
const Extension = styledComponents.styled.span`
text-transform: uppercase;
`;
const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles, folderId = null })=>{
const { upload, cancel, error, progress, status } = useUpload.useUpload();
const { formatMessage } = reactIntl.useIntl();
let badgeContent = formatMessage({
id: getTrad.getTrad('settings.section.doc.label'),
defaultMessage: 'Doc'
});
if (asset.type === constants.AssetType.Image) {
badgeContent = formatMessage({
id: getTrad.getTrad('settings.section.image.label'),
defaultMessage: 'Image'
});
} else if (asset.type === constants.AssetType.Video) {
badgeContent = formatMessage({
id: getTrad.getTrad('settings.section.video.label'),
defaultMessage: 'Video'
});
} else if (asset.type === constants.AssetType.Audio) {
badgeContent = formatMessage({
id: getTrad.getTrad('settings.section.audio.label'),
defaultMessage: 'Audio'
});
}
React__namespace.useEffect(()=>{
const uploadFile = async ()=>{
const files = await upload(asset, folderId ? Number(folderId) : null);
if (addUploadedFiles) {
addUploadedFiles(files);
}
};
uploadFile();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
React__namespace.useEffect(()=>{
onStatusChange(status);
}, [
status,
onStatusChange
]);
const handleCancel = ()=>{
cancel();
onCancel(asset.rawFile);
};
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
direction: "column",
alignItems: "stretch",
gap: 1,
children: [
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Card, {
borderColor: error ? 'danger600' : 'neutral150',
children: [
/*#__PURE__*/ jsxRuntime.jsx(designSystem.CardHeader, {
children: /*#__PURE__*/ jsxRuntime.jsx(UploadProgressWrapper, {
children: /*#__PURE__*/ jsxRuntime.jsx(UploadProgress.UploadProgress, {
error: error || undefined,
onCancel: handleCancel,
progress: progress
})
})
}),
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardBody, {
children: [
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.CardContent, {
children: [
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
paddingTop: 1,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
tag: "h2",
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardTitle, {
tag: "span",
children: asset.name
})
})
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.CardSubtitle, {
children: /*#__PURE__*/ jsxRuntime.jsx(Extension, {
children: asset.ext
})
})
]
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
paddingTop: 1,
grow: 1,
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.CardBadge, {
children: badgeContent
})
})
]
})
]
}),
error ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
variant: "pi",
fontWeight: "bold",
textColor: "danger600",
children: formatMessage(error?.message ? {
id: getTrad.getTrad(`apiError.${error.message}`),
defaultMessage: error.message
} : {
id: getTrad.getTrad('upload.generic-error'),
defaultMessage: 'An error occured while uploading the file.'
})
}) : undefined
]
});
};
exports.UploadingAssetCard = UploadingAssetCard;
//# sourceMappingURL=UploadingAssetCard.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,131 @@
import { jsxs, jsx } from 'react/jsx-runtime';
import * as React from 'react';
import { Flex, Card, CardHeader, CardBody, CardContent, Box, Typography, CardTitle, CardSubtitle, CardBadge } from '@strapi/design-system';
import { useIntl } from 'react-intl';
import { styled } from 'styled-components';
import { AssetType } from '../../constants.mjs';
import { useUpload } from '../../hooks/useUpload.mjs';
import 'byte-size';
import 'date-fns';
import { getTrad } from '../../utils/getTrad.mjs';
import 'qs';
import '../../utils/urlYupSchema.mjs';
import { UploadProgress } from '../UploadProgress/UploadProgress.mjs';
const UploadProgressWrapper = styled.div`
height: 8.8rem;
width: 100%;
`;
const Extension = styled.span`
text-transform: uppercase;
`;
const UploadingAssetCard = ({ asset, onCancel, onStatusChange, addUploadedFiles, folderId = null })=>{
const { upload, cancel, error, progress, status } = useUpload();
const { formatMessage } = useIntl();
let badgeContent = formatMessage({
id: getTrad('settings.section.doc.label'),
defaultMessage: 'Doc'
});
if (asset.type === AssetType.Image) {
badgeContent = formatMessage({
id: getTrad('settings.section.image.label'),
defaultMessage: 'Image'
});
} else if (asset.type === AssetType.Video) {
badgeContent = formatMessage({
id: getTrad('settings.section.video.label'),
defaultMessage: 'Video'
});
} else if (asset.type === AssetType.Audio) {
badgeContent = formatMessage({
id: getTrad('settings.section.audio.label'),
defaultMessage: 'Audio'
});
}
React.useEffect(()=>{
const uploadFile = async ()=>{
const files = await upload(asset, folderId ? Number(folderId) : null);
if (addUploadedFiles) {
addUploadedFiles(files);
}
};
uploadFile();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
React.useEffect(()=>{
onStatusChange(status);
}, [
status,
onStatusChange
]);
const handleCancel = ()=>{
cancel();
onCancel(asset.rawFile);
};
return /*#__PURE__*/ jsxs(Flex, {
direction: "column",
alignItems: "stretch",
gap: 1,
children: [
/*#__PURE__*/ jsxs(Card, {
borderColor: error ? 'danger600' : 'neutral150',
children: [
/*#__PURE__*/ jsx(CardHeader, {
children: /*#__PURE__*/ jsx(UploadProgressWrapper, {
children: /*#__PURE__*/ jsx(UploadProgress, {
error: error || undefined,
onCancel: handleCancel,
progress: progress
})
})
}),
/*#__PURE__*/ jsxs(CardBody, {
children: [
/*#__PURE__*/ jsxs(CardContent, {
children: [
/*#__PURE__*/ jsx(Box, {
paddingTop: 1,
children: /*#__PURE__*/ jsx(Typography, {
tag: "h2",
children: /*#__PURE__*/ jsx(CardTitle, {
tag: "span",
children: asset.name
})
})
}),
/*#__PURE__*/ jsx(CardSubtitle, {
children: /*#__PURE__*/ jsx(Extension, {
children: asset.ext
})
})
]
}),
/*#__PURE__*/ jsx(Flex, {
paddingTop: 1,
grow: 1,
children: /*#__PURE__*/ jsx(CardBadge, {
children: badgeContent
})
})
]
})
]
}),
error ? /*#__PURE__*/ jsx(Typography, {
variant: "pi",
fontWeight: "bold",
textColor: "danger600",
children: formatMessage(error?.message ? {
id: getTrad(`apiError.${error.message}`),
defaultMessage: error.message
} : {
id: getTrad('upload.generic-error'),
defaultMessage: 'An error occured while uploading the file.'
})
}) : undefined
]
});
};
export { UploadingAssetCard };
//# sourceMappingURL=UploadingAssetCard.mjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,72 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
var React = require('react');
var designSystem = require('@strapi/design-system');
var styledComponents = require('styled-components');
require('byte-size');
var formatDuration = require('../../utils/formatDuration.js');
require('qs');
require('../../constants.js');
require('../../utils/urlYupSchema.js');
var AssetCardBase = require('./AssetCardBase.js');
var VideoPreview = require('./VideoPreview.js');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
const VideoPreviewWrapper = styledComponents.styled(designSystem.Box)`
canvas,
video {
display: block;
pointer-events: none;
max-width: 100%;
max-height: ${({ size })=>size === 'M' ? 16.4 : 8.8}rem;
}
`;
const VideoAssetCard = ({ name, url, mime, size = 'M', selected = false, ...props })=>{
const [duration, setDuration] = React__namespace.useState();
const formattedDuration = duration && formatDuration.formatDuration(duration);
return /*#__PURE__*/ jsxRuntime.jsxs(AssetCardBase.AssetCardBase, {
selected: selected,
name: name,
...props,
variant: "Video",
children: [
/*#__PURE__*/ jsxRuntime.jsx(designSystem.CardAsset, {
size: size,
children: /*#__PURE__*/ jsxRuntime.jsx(VideoPreviewWrapper, {
size: size,
children: /*#__PURE__*/ jsxRuntime.jsx(VideoPreview.VideoPreview, {
url: url,
mime: mime,
onLoadDuration: setDuration,
alt: name
})
})
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.CardTimer, {
children: formattedDuration || '...'
})
]
});
};
exports.VideoAssetCard = VideoAssetCard;
//# sourceMappingURL=VideoAssetCard.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VideoAssetCard.js","sources":["../../../../admin/src/components/AssetCard/VideoAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\nimport { VideoPreview } from './VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n display: block;\n pointer-events: none;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\ninterface VideoAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n mime: string;\n url: string;\n size?: 'S' | 'M';\n}\n\nexport const VideoAssetCard = ({\n name,\n url,\n mime,\n size = 'M',\n selected = false,\n ...props\n}: VideoAssetCardProps) => {\n const [duration, setDuration] = React.useState<number>();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase selected={selected} name={name} {...props} variant=\"Video\">\n <CardAsset size={size}>\n <VideoPreviewWrapper size={size}>\n <VideoPreview url={url} mime={mime} onLoadDuration={setDuration} alt={name} />\n </VideoPreviewWrapper>\n </CardAsset>\n <CardTimer>{formattedDuration || '...'}</CardTimer>\n </AssetCardBase>\n );\n};\n"],"names":["VideoPreviewWrapper","styled","Box","size","VideoAssetCard","name","url","mime","selected","props","duration","setDuration","React","useState","formattedDuration","formatDuration","_jsxs","AssetCardBase","variant","_jsx","CardAsset","VideoPreview","onLoadDuration","alt","CardTimer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,MAAMA,mBAAAA,GAAsBC,uBAAOC,CAAAA,gBAAAA,CAAI;;;;;;gBAMvB,EAAE,CAAC,EAAEC,IAAI,EAAE,GAAMA,IAAS,KAAA,GAAA,GAAM,OAAO,GAAK,CAAA;;AAE5D,CAAC;MAQYC,cAAiB,GAAA,CAAC,EAC7BC,IAAI,EACJC,GAAG,EACHC,IAAI,EACJJ,OAAO,GAAG,EACVK,WAAW,KAAK,EAChB,GAAGC,KACiB,EAAA,GAAA;AACpB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAY,CAAA,GAAGC,iBAAMC,QAAQ,EAAA;IAE9C,MAAMC,iBAAAA,GAAoBJ,YAAYK,6BAAeL,CAAAA,QAAAA,CAAAA;AAErD,IAAA,qBACEM,eAACC,CAAAA,2BAAAA,EAAAA;QAAcT,QAAUA,EAAAA,QAAAA;QAAUH,IAAMA,EAAAA,IAAAA;AAAO,QAAA,GAAGI,KAAK;QAAES,OAAQ,EAAA,OAAA;;0BAChEC,cAACC,CAAAA,sBAAAA,EAAAA;gBAAUjB,IAAMA,EAAAA,IAAAA;AACf,gBAAA,QAAA,gBAAAgB,cAACnB,CAAAA,mBAAAA,EAAAA;oBAAoBG,IAAMA,EAAAA,IAAAA;AACzB,oBAAA,QAAA,gBAAAgB,cAACE,CAAAA,yBAAAA,EAAAA;wBAAaf,GAAKA,EAAAA,GAAAA;wBAAKC,IAAMA,EAAAA,IAAAA;wBAAMe,cAAgBX,EAAAA,WAAAA;wBAAaY,GAAKlB,EAAAA;;;;0BAG1Ec,cAACK,CAAAA,sBAAAA,EAAAA;0BAAWV,iBAAqB,IAAA;;;;AAGvC;;;;"}

View File

@@ -0,0 +1,51 @@
import { jsxs, jsx } from 'react/jsx-runtime';
import * as React from 'react';
import { Box, CardAsset, CardTimer } from '@strapi/design-system';
import { styled } from 'styled-components';
import 'byte-size';
import { formatDuration } from '../../utils/formatDuration.mjs';
import 'qs';
import '../../constants.mjs';
import '../../utils/urlYupSchema.mjs';
import { AssetCardBase } from './AssetCardBase.mjs';
import { VideoPreview } from './VideoPreview.mjs';
const VideoPreviewWrapper = styled(Box)`
canvas,
video {
display: block;
pointer-events: none;
max-width: 100%;
max-height: ${({ size })=>size === 'M' ? 16.4 : 8.8}rem;
}
`;
const VideoAssetCard = ({ name, url, mime, size = 'M', selected = false, ...props })=>{
const [duration, setDuration] = React.useState();
const formattedDuration = duration && formatDuration(duration);
return /*#__PURE__*/ jsxs(AssetCardBase, {
selected: selected,
name: name,
...props,
variant: "Video",
children: [
/*#__PURE__*/ jsx(CardAsset, {
size: size,
children: /*#__PURE__*/ jsx(VideoPreviewWrapper, {
size: size,
children: /*#__PURE__*/ jsx(VideoPreview, {
url: url,
mime: mime,
onLoadDuration: setDuration,
alt: name
})
})
}),
/*#__PURE__*/ jsx(CardTimer, {
children: formattedDuration || '...'
})
]
});
};
export { VideoAssetCard };
//# sourceMappingURL=VideoAssetCard.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VideoAssetCard.mjs","sources":["../../../../admin/src/components/AssetCard/VideoAssetCard.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, CardAsset, CardTimer } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { formatDuration } from '../../utils';\n\nimport { AssetCardBase, AssetCardBaseProps } from './AssetCardBase';\nimport { VideoPreview } from './VideoPreview';\n\nconst VideoPreviewWrapper = styled(Box)`\n canvas,\n video {\n display: block;\n pointer-events: none;\n max-width: 100%;\n max-height: ${({ size }) => (size === 'M' ? 16.4 : 8.8)}rem;\n }\n`;\n\ninterface VideoAssetCardProps extends Omit<AssetCardBaseProps, 'variant' | 'children'> {\n mime: string;\n url: string;\n size?: 'S' | 'M';\n}\n\nexport const VideoAssetCard = ({\n name,\n url,\n mime,\n size = 'M',\n selected = false,\n ...props\n}: VideoAssetCardProps) => {\n const [duration, setDuration] = React.useState<number>();\n\n const formattedDuration = duration && formatDuration(duration);\n\n return (\n <AssetCardBase selected={selected} name={name} {...props} variant=\"Video\">\n <CardAsset size={size}>\n <VideoPreviewWrapper size={size}>\n <VideoPreview url={url} mime={mime} onLoadDuration={setDuration} alt={name} />\n </VideoPreviewWrapper>\n </CardAsset>\n <CardTimer>{formattedDuration || '...'}</CardTimer>\n </AssetCardBase>\n );\n};\n"],"names":["VideoPreviewWrapper","styled","Box","size","VideoAssetCard","name","url","mime","selected","props","duration","setDuration","React","useState","formattedDuration","formatDuration","_jsxs","AssetCardBase","variant","_jsx","CardAsset","VideoPreview","onLoadDuration","alt","CardTimer"],"mappings":";;;;;;;;;;;;AAUA,MAAMA,mBAAAA,GAAsBC,MAAOC,CAAAA,GAAAA,CAAI;;;;;;gBAMvB,EAAE,CAAC,EAAEC,IAAI,EAAE,GAAMA,IAAS,KAAA,GAAA,GAAM,OAAO,GAAK,CAAA;;AAE5D,CAAC;MAQYC,cAAiB,GAAA,CAAC,EAC7BC,IAAI,EACJC,GAAG,EACHC,IAAI,EACJJ,OAAO,GAAG,EACVK,WAAW,KAAK,EAChB,GAAGC,KACiB,EAAA,GAAA;AACpB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAY,CAAA,GAAGC,MAAMC,QAAQ,EAAA;IAE9C,MAAMC,iBAAAA,GAAoBJ,YAAYK,cAAeL,CAAAA,QAAAA,CAAAA;AAErD,IAAA,qBACEM,IAACC,CAAAA,aAAAA,EAAAA;QAAcT,QAAUA,EAAAA,QAAAA;QAAUH,IAAMA,EAAAA,IAAAA;AAAO,QAAA,GAAGI,KAAK;QAAES,OAAQ,EAAA,OAAA;;0BAChEC,GAACC,CAAAA,SAAAA,EAAAA;gBAAUjB,IAAMA,EAAAA,IAAAA;AACf,gBAAA,QAAA,gBAAAgB,GAACnB,CAAAA,mBAAAA,EAAAA;oBAAoBG,IAAMA,EAAAA,IAAAA;AACzB,oBAAA,QAAA,gBAAAgB,GAACE,CAAAA,YAAAA,EAAAA;wBAAaf,GAAKA,EAAAA,GAAAA;wBAAKC,IAAMA,EAAAA,IAAAA;wBAAMe,cAAgBX,EAAAA,WAAAA;wBAAaY,GAAKlB,EAAAA;;;;0BAG1Ec,GAACK,CAAAA,SAAAA,EAAAA;0BAAWV,iBAAqB,IAAA;;;;AAGvC;;;;"}

View File

@@ -0,0 +1,50 @@
'use strict';
var jsxRuntime = require('react/jsx-runtime');
require('react');
var designSystem = require('@strapi/design-system');
// According to MDN
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value
const HAVE_FUTURE_DATA = 3;
const VideoPreview = ({ url, mime, onLoadDuration = ()=>{}, alt, ...props })=>{
const handleTimeUpdate = (e)=>{
if (e.currentTarget.currentTime > 0) {
const video = e.currentTarget;
const canvas = document.createElement('canvas');
canvas.height = video.videoHeight;
canvas.width = video.videoWidth;
canvas.getContext('2d')?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
video.replaceWith(canvas);
onLoadDuration && onLoadDuration(video.duration);
}
};
const handleThumbnailVisibility = (e)=>{
const video = e.currentTarget;
if (video.readyState < HAVE_FUTURE_DATA) return;
video.play();
};
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
tag: "figure",
...props,
children: [
/*#__PURE__*/ jsxRuntime.jsx("video", {
muted: true,
onLoadedData: handleThumbnailVisibility,
src: url,
crossOrigin: "anonymous",
onTimeUpdate: handleTimeUpdate,
children: /*#__PURE__*/ jsxRuntime.jsx("source", {
type: mime
})
}),
/*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
tag: "figcaption",
children: alt
})
]
}, url);
};
exports.VideoPreview = VideoPreview;
//# sourceMappingURL=VideoPreview.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VideoPreview.js","sources":["../../../../admin/src/components/AssetCard/VideoPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\ninterface VideoPreviewProps {\n alt: string;\n url: string;\n mime: string;\n onLoadDuration?: (duration?: number) => void;\n size?: 'S' | 'M';\n}\n\nexport const VideoPreview = ({\n url,\n mime,\n onLoadDuration = () => {},\n alt,\n ...props\n}: VideoPreviewProps) => {\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (e.currentTarget.currentTime > 0) {\n const video = e.currentTarget;\n const canvas = document.createElement('canvas');\n\n canvas.height = video.videoHeight;\n canvas.width = video.videoWidth;\n canvas.getContext('2d')?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n\n video.replaceWith(canvas);\n onLoadDuration && onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" key={url} {...props}>\n <video\n muted\n onLoadedData={handleThumbnailVisibility}\n src={url}\n crossOrigin=\"anonymous\"\n onTimeUpdate={handleTimeUpdate}\n >\n <source type={mime} />\n </video>\n <VisuallyHidden tag=\"figcaption\">{alt}</VisuallyHidden>\n </Box>\n );\n};\n"],"names":["HAVE_FUTURE_DATA","VideoPreview","url","mime","onLoadDuration","alt","props","handleTimeUpdate","e","currentTarget","currentTime","video","canvas","document","createElement","height","videoHeight","width","videoWidth","getContext","drawImage","replaceWith","duration","handleThumbnailVisibility","readyState","play","_jsxs","Box","tag","_jsx","muted","onLoadedData","src","crossOrigin","onTimeUpdate","source","type","VisuallyHidden"],"mappings":";;;;;;AAIA;AACA;AACA,MAAMA,gBAAmB,GAAA,CAAA;AAUZC,MAAAA,YAAAA,GAAe,CAAC,EAC3BC,GAAG,EACHC,IAAI,EACJC,cAAAA,GAAiB,MAAQ,EACzBC,GAAG,EACH,GAAGC,KACe,EAAA,GAAA;AAClB,IAAA,MAAMC,mBAAmB,CAACC,CAAAA,GAAAA;AACxB,QAAA,IAAIA,CAAEC,CAAAA,aAAa,CAACC,WAAW,GAAG,CAAG,EAAA;YACnC,MAAMC,KAAAA,GAAQH,EAAEC,aAAa;YAC7B,MAAMG,MAAAA,GAASC,QAASC,CAAAA,aAAa,CAAC,QAAA,CAAA;YAEtCF,MAAOG,CAAAA,MAAM,GAAGJ,KAAAA,CAAMK,WAAW;YACjCJ,MAAOK,CAAAA,KAAK,GAAGN,KAAAA,CAAMO,UAAU;YAC/BN,MAAOO,CAAAA,UAAU,CAAC,IAAA,CAAA,EAAOC,SAAUT,CAAAA,KAAAA,EAAO,CAAG,EAAA,CAAA,EAAGA,KAAMO,CAAAA,UAAU,EAAEP,KAAAA,CAAMK,WAAW,CAAA;AAEnFL,YAAAA,KAAAA,CAAMU,WAAW,CAACT,MAAAA,CAAAA;YAClBR,cAAkBA,IAAAA,cAAAA,CAAeO,MAAMW,QAAQ,CAAA;AACjD;AACF,KAAA;AAEA,IAAA,MAAMC,4BAA4B,CAACf,CAAAA,GAAAA;QACjC,MAAMG,KAAAA,GAAQH,EAAEC,aAAa;QAE7B,IAAIE,KAAAA,CAAMa,UAAU,GAAGxB,gBAAkB,EAAA;AAEzCW,QAAAA,KAAAA,CAAMc,IAAI,EAAA;AACZ,KAAA;AAEA,IAAA,qBACEC,eAACC,CAAAA,gBAAAA,EAAAA;QAAIC,GAAI,EAAA,QAAA;AAAoB,QAAA,GAAGtB,KAAK;;0BACnCuB,cAAClB,CAAAA,OAAAA,EAAAA;gBACCmB,KAAK,EAAA,IAAA;gBACLC,YAAcR,EAAAA,yBAAAA;gBACdS,GAAK9B,EAAAA,GAAAA;gBACL+B,WAAY,EAAA,WAAA;gBACZC,YAAc3B,EAAAA,gBAAAA;AAEd,gBAAA,QAAA,gBAAAsB,cAACM,CAAAA,QAAAA,EAAAA;oBAAOC,IAAMjC,EAAAA;;;0BAEhB0B,cAACQ,CAAAA,2BAAAA,EAAAA;gBAAeT,GAAI,EAAA,YAAA;AAAcvB,gBAAAA,QAAAA,EAAAA;;;AAVbH,KAAAA,EAAAA,GAAAA,CAAAA;AAa3B;;;;"}

View File

@@ -0,0 +1,48 @@
import { jsxs, jsx } from 'react/jsx-runtime';
import 'react';
import { Box, VisuallyHidden } from '@strapi/design-system';
// According to MDN
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value
const HAVE_FUTURE_DATA = 3;
const VideoPreview = ({ url, mime, onLoadDuration = ()=>{}, alt, ...props })=>{
const handleTimeUpdate = (e)=>{
if (e.currentTarget.currentTime > 0) {
const video = e.currentTarget;
const canvas = document.createElement('canvas');
canvas.height = video.videoHeight;
canvas.width = video.videoWidth;
canvas.getContext('2d')?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
video.replaceWith(canvas);
onLoadDuration && onLoadDuration(video.duration);
}
};
const handleThumbnailVisibility = (e)=>{
const video = e.currentTarget;
if (video.readyState < HAVE_FUTURE_DATA) return;
video.play();
};
return /*#__PURE__*/ jsxs(Box, {
tag: "figure",
...props,
children: [
/*#__PURE__*/ jsx("video", {
muted: true,
onLoadedData: handleThumbnailVisibility,
src: url,
crossOrigin: "anonymous",
onTimeUpdate: handleTimeUpdate,
children: /*#__PURE__*/ jsx("source", {
type: mime
})
}),
/*#__PURE__*/ jsx(VisuallyHidden, {
tag: "figcaption",
children: alt
})
]
}, url);
};
export { VideoPreview };
//# sourceMappingURL=VideoPreview.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VideoPreview.mjs","sources":["../../../../admin/src/components/AssetCard/VideoPreview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, VisuallyHidden } from '@strapi/design-system';\n\n// According to MDN\n// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState#value\nconst HAVE_FUTURE_DATA = 3;\n\ninterface VideoPreviewProps {\n alt: string;\n url: string;\n mime: string;\n onLoadDuration?: (duration?: number) => void;\n size?: 'S' | 'M';\n}\n\nexport const VideoPreview = ({\n url,\n mime,\n onLoadDuration = () => {},\n alt,\n ...props\n}: VideoPreviewProps) => {\n const handleTimeUpdate = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n if (e.currentTarget.currentTime > 0) {\n const video = e.currentTarget;\n const canvas = document.createElement('canvas');\n\n canvas.height = video.videoHeight;\n canvas.width = video.videoWidth;\n canvas.getContext('2d')?.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\n\n video.replaceWith(canvas);\n onLoadDuration && onLoadDuration(video.duration);\n }\n };\n\n const handleThumbnailVisibility = (e: React.SyntheticEvent<HTMLVideoElement>) => {\n const video = e.currentTarget;\n\n if (video.readyState < HAVE_FUTURE_DATA) return;\n\n video.play();\n };\n\n return (\n <Box tag=\"figure\" key={url} {...props}>\n <video\n muted\n onLoadedData={handleThumbnailVisibility}\n src={url}\n crossOrigin=\"anonymous\"\n onTimeUpdate={handleTimeUpdate}\n >\n <source type={mime} />\n </video>\n <VisuallyHidden tag=\"figcaption\">{alt}</VisuallyHidden>\n </Box>\n );\n};\n"],"names":["HAVE_FUTURE_DATA","VideoPreview","url","mime","onLoadDuration","alt","props","handleTimeUpdate","e","currentTarget","currentTime","video","canvas","document","createElement","height","videoHeight","width","videoWidth","getContext","drawImage","replaceWith","duration","handleThumbnailVisibility","readyState","play","_jsxs","Box","tag","_jsx","muted","onLoadedData","src","crossOrigin","onTimeUpdate","source","type","VisuallyHidden"],"mappings":";;;;AAIA;AACA;AACA,MAAMA,gBAAmB,GAAA,CAAA;AAUZC,MAAAA,YAAAA,GAAe,CAAC,EAC3BC,GAAG,EACHC,IAAI,EACJC,cAAAA,GAAiB,MAAQ,EACzBC,GAAG,EACH,GAAGC,KACe,EAAA,GAAA;AAClB,IAAA,MAAMC,mBAAmB,CAACC,CAAAA,GAAAA;AACxB,QAAA,IAAIA,CAAEC,CAAAA,aAAa,CAACC,WAAW,GAAG,CAAG,EAAA;YACnC,MAAMC,KAAAA,GAAQH,EAAEC,aAAa;YAC7B,MAAMG,MAAAA,GAASC,QAASC,CAAAA,aAAa,CAAC,QAAA,CAAA;YAEtCF,MAAOG,CAAAA,MAAM,GAAGJ,KAAAA,CAAMK,WAAW;YACjCJ,MAAOK,CAAAA,KAAK,GAAGN,KAAAA,CAAMO,UAAU;YAC/BN,MAAOO,CAAAA,UAAU,CAAC,IAAA,CAAA,EAAOC,SAAUT,CAAAA,KAAAA,EAAO,CAAG,EAAA,CAAA,EAAGA,KAAMO,CAAAA,UAAU,EAAEP,KAAAA,CAAMK,WAAW,CAAA;AAEnFL,YAAAA,KAAAA,CAAMU,WAAW,CAACT,MAAAA,CAAAA;YAClBR,cAAkBA,IAAAA,cAAAA,CAAeO,MAAMW,QAAQ,CAAA;AACjD;AACF,KAAA;AAEA,IAAA,MAAMC,4BAA4B,CAACf,CAAAA,GAAAA;QACjC,MAAMG,KAAAA,GAAQH,EAAEC,aAAa;QAE7B,IAAIE,KAAAA,CAAMa,UAAU,GAAGxB,gBAAkB,EAAA;AAEzCW,QAAAA,KAAAA,CAAMc,IAAI,EAAA;AACZ,KAAA;AAEA,IAAA,qBACEC,IAACC,CAAAA,GAAAA,EAAAA;QAAIC,GAAI,EAAA,QAAA;AAAoB,QAAA,GAAGtB,KAAK;;0BACnCuB,GAAClB,CAAAA,OAAAA,EAAAA;gBACCmB,KAAK,EAAA,IAAA;gBACLC,YAAcR,EAAAA,yBAAAA;gBACdS,GAAK9B,EAAAA,GAAAA;gBACL+B,WAAY,EAAA,WAAA;gBACZC,YAAc3B,EAAAA,gBAAAA;AAEd,gBAAA,QAAA,gBAAAsB,GAACM,CAAAA,QAAAA,EAAAA;oBAAOC,IAAMjC,EAAAA;;;0BAEhB0B,GAACQ,CAAAA,cAAAA,EAAAA;gBAAeT,GAAI,EAAA,YAAA;AAAcvB,gBAAAA,QAAAA,EAAAA;;;AAVbH,KAAAA,EAAAA,GAAAA,CAAAA;AAa3B;;;;"}