@strapi/upload 5.26.0 → 5.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +589 -0
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -0
  3. package/dist/admin/ai/components/AIAssetCard.mjs +567 -0
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -0
  5. package/dist/admin/ai/components/AIUploadModal.js +363 -0
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -0
  7. package/dist/admin/ai/components/AIUploadModal.mjs +341 -0
  8. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -0
  9. package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
  10. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  11. package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
  12. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  13. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -3
  14. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  15. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +4 -4
  16. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  17. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +5 -5
  18. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  19. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +5 -5
  20. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  21. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +2 -1
  22. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  23. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +2 -1
  24. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  25. package/dist/admin/components/SelectTree/utils/flattenTree.js +11 -6
  26. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  27. package/dist/admin/components/SelectTree/utils/flattenTree.mjs +11 -6
  28. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  29. package/dist/admin/hooks/useAiAvailability.js +22 -0
  30. package/dist/admin/hooks/useAiAvailability.js.map +1 -0
  31. package/dist/admin/hooks/useAiAvailability.mjs +20 -0
  32. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -0
  33. package/dist/admin/hooks/useBulkEdit.js +66 -0
  34. package/dist/admin/hooks/useBulkEdit.js.map +1 -0
  35. package/dist/admin/hooks/useBulkEdit.mjs +64 -0
  36. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -0
  37. package/dist/admin/hooks/useSettings.js +22 -0
  38. package/dist/admin/hooks/useSettings.js.map +1 -0
  39. package/dist/admin/hooks/useSettings.mjs +20 -0
  40. package/dist/admin/hooks/useSettings.mjs.map +1 -0
  41. package/dist/admin/hooks/useUpload.js +25 -14
  42. package/dist/admin/hooks/useUpload.js.map +1 -1
  43. package/dist/admin/hooks/useUpload.mjs +25 -14
  44. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  45. package/dist/admin/package.json.js +5 -5
  46. package/dist/admin/package.json.mjs +5 -5
  47. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +0 -1
  48. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  49. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +0 -1
  50. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  51. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +19 -5
  52. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  53. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +19 -5
  54. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  55. package/dist/admin/pages/SettingsPage/SettingsPage.js +222 -144
  56. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  57. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +225 -147
  58. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  59. package/dist/admin/pages/SettingsPage/reducer.js +9 -10
  60. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  61. package/dist/admin/pages/SettingsPage/reducer.mjs +9 -10
  62. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  63. package/dist/admin/src/ai/components/AIAssetCard.d.ts +13 -0
  64. package/dist/admin/src/ai/components/AIUploadModal.d.ts +55 -0
  65. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +3 -1
  66. package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +3 -1
  67. package/dist/admin/src/hooks/useAiAvailability.d.ts +4 -0
  68. package/dist/admin/src/hooks/useBulkEdit.d.ts +91 -0
  69. package/dist/admin/src/hooks/useSettings.d.ts +7 -0
  70. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  71. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +3 -12
  72. package/dist/admin/translations/en.json.js +7 -1
  73. package/dist/admin/translations/en.json.js.map +1 -1
  74. package/dist/admin/translations/en.json.mjs +7 -1
  75. package/dist/admin/translations/en.json.mjs.map +1 -1
  76. package/dist/admin/utils/getFolderParents.js +2 -1
  77. package/dist/admin/utils/getFolderParents.js.map +1 -1
  78. package/dist/admin/utils/getFolderParents.mjs +2 -1
  79. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  80. package/dist/server/bootstrap.js +2 -1
  81. package/dist/server/bootstrap.js.map +1 -1
  82. package/dist/server/bootstrap.mjs +2 -1
  83. package/dist/server/bootstrap.mjs.map +1 -1
  84. package/dist/server/controllers/admin-upload.js +57 -2
  85. package/dist/server/controllers/admin-upload.js.map +1 -1
  86. package/dist/server/controllers/admin-upload.mjs +59 -4
  87. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  88. package/dist/server/controllers/content-api.js +3 -1
  89. package/dist/server/controllers/content-api.js.map +1 -1
  90. package/dist/server/controllers/content-api.mjs +3 -1
  91. package/dist/server/controllers/content-api.mjs.map +1 -1
  92. package/dist/server/controllers/validation/admin/settings.js +2 -1
  93. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  94. package/dist/server/controllers/validation/admin/settings.mjs +2 -1
  95. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  96. package/dist/server/controllers/validation/admin/upload.js +8 -0
  97. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  98. package/dist/server/controllers/validation/admin/upload.mjs +8 -1
  99. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  100. package/dist/server/routes/admin.js +18 -0
  101. package/dist/server/routes/admin.js.map +1 -1
  102. package/dist/server/routes/admin.mjs +18 -0
  103. package/dist/server/routes/admin.mjs.map +1 -1
  104. package/dist/server/services/ai-metadata.js +97 -0
  105. package/dist/server/services/ai-metadata.js.map +1 -0
  106. package/dist/server/services/ai-metadata.mjs +95 -0
  107. package/dist/server/services/ai-metadata.mjs.map +1 -0
  108. package/dist/server/services/index.js +3 -1
  109. package/dist/server/services/index.js.map +1 -1
  110. package/dist/server/services/index.mjs +3 -1
  111. package/dist/server/services/index.mjs.map +1 -1
  112. package/dist/server/services/upload.js.map +1 -1
  113. package/dist/server/services/upload.mjs.map +1 -1
  114. package/dist/server/services/weekly-metrics.js +5 -1
  115. package/dist/server/services/weekly-metrics.js.map +1 -1
  116. package/dist/server/services/weekly-metrics.mjs +5 -1
  117. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  118. package/dist/server/src/bootstrap.d.ts.map +1 -1
  119. package/dist/server/src/controllers/admin-upload.d.ts +1 -0
  120. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  121. package/dist/server/src/controllers/index.d.ts +1 -0
  122. package/dist/server/src/controllers/index.d.ts.map +1 -1
  123. package/dist/server/src/controllers/validation/admin/settings.d.ts +3 -0
  124. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/admin/upload.d.ts +42 -0
  126. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  127. package/dist/server/src/index.d.ts +14 -1
  128. package/dist/server/src/index.d.ts.map +1 -1
  129. package/dist/server/src/routes/admin.d.ts.map +1 -1
  130. package/dist/server/src/services/ai-metadata.d.ts +13 -0
  131. package/dist/server/src/services/ai-metadata.d.ts.map +1 -0
  132. package/dist/server/src/services/index.d.ts +13 -1
  133. package/dist/server/src/services/index.d.ts.map +1 -1
  134. package/dist/server/src/services/upload.d.ts +2 -1
  135. package/dist/server/src/services/upload.d.ts.map +1 -1
  136. package/dist/server/src/services/weekly-metrics.d.ts +1 -0
  137. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
  138. package/dist/server/src/types.d.ts +1 -0
  139. package/dist/server/src/types.d.ts.map +1 -1
  140. package/dist/server/src/utils/index.d.ts +2 -0
  141. package/dist/server/src/utils/index.d.ts.map +1 -1
  142. package/dist/server/utils/index.js.map +1 -1
  143. package/dist/server/utils/index.mjs.map +1 -1
  144. package/dist/shared/contracts/files.d.ts +22 -0
  145. package/dist/shared/contracts/settings.d.ts +2 -0
  146. package/package.json +5 -5
@@ -0,0 +1,567 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { ConfirmDialog } from '@strapi/admin/strapi-admin';
4
+ import { CardAction, Box, CardTimer, CardBody, Card, Grid, CardHeader, CardContent, Flex, Typography, CardTitle, CardBadge, CardSubtitle, Field, TextInput, Dialog, IconButton, Modal, CardAsset } from '@strapi/design-system';
5
+ import { Sparkle, Trash, Pencil } from '@strapi/icons';
6
+ import { useIntl } from 'react-intl';
7
+ import { styled } from 'styled-components';
8
+ import { AudioPreview } from '../../components/AssetCard/AudioPreview.mjs';
9
+ import { VideoPreview } from '../../components/AssetCard/VideoPreview.mjs';
10
+ import { EditAssetContent } from '../../components/EditAssetDialog/EditAssetContent.mjs';
11
+ import { AssetType } from '../../constants.mjs';
12
+ import { useMediaLibraryPermissions } from '../../hooks/useMediaLibraryPermissions.mjs';
13
+ import { useRemoveAsset } from '../../hooks/useRemoveAsset.mjs';
14
+ import { prefixFileUrlWithBackendUrl } from '../../utils/prefixFileUrlWithBackendUrl.mjs';
15
+ import { formatBytes } from '../../utils/formatBytes.mjs';
16
+ import { formatDuration } from '../../utils/formatDuration.mjs';
17
+ import { getTrad } from '../../utils/getTrad.mjs';
18
+ import 'qs';
19
+ import { getFileExtension } from '../../utils/getFileExtension.mjs';
20
+ import { typeFromMime } from '../../utils/typeFromMime.mjs';
21
+ import '../../utils/urlYupSchema.mjs';
22
+ import { useAIUploadModalContext } from './AIUploadModal.mjs';
23
+
24
+ const CardActionsContainer = styled(CardAction)`
25
+ opacity: 0;
26
+ z-index: 1;
27
+
28
+ &:focus-within {
29
+ opacity: 1;
30
+ }
31
+ `;
32
+ const CardContainer = styled(Box)`
33
+ background: ${({ theme })=>theme.colors.neutral0};
34
+ border: 1px solid ${({ theme })=>theme.colors.neutral150};
35
+ border-radius: ${({ theme })=>theme.borderRadius};
36
+
37
+ &:hover {
38
+ ${CardActionsContainer} {
39
+ opacity: 1;
40
+ }
41
+ }
42
+ `;
43
+ /* -------------------------------------------------------------------------------------------------
44
+ * AssetCardActions
45
+ * -----------------------------------------------------------------------------------------------*/ const AssetCardActions = ({ asset })=>{
46
+ const { formatMessage } = useIntl();
47
+ const dispatch = useAIUploadModalContext('AssetCardActions', (s)=>s.dispatch);
48
+ const state = useAIUploadModalContext('AssetCardActions', (s)=>s.state);
49
+ const onClose = useAIUploadModalContext('AssetCardActions', (s)=>s.onClose);
50
+ const { canUpdate, canCopyLink, canDownload } = useMediaLibraryPermissions();
51
+ const [isEditModalOpen, setIsEditModalOpen] = React.useState(false);
52
+ const { removeAsset } = useRemoveAsset(()=>{});
53
+ const handleConfirmRemove = async (event)=>{
54
+ event?.preventDefault();
55
+ await removeAsset(asset.id);
56
+ dispatch({
57
+ type: 'remove_uploaded_asset',
58
+ payload: {
59
+ id: asset.id
60
+ }
61
+ });
62
+ // Close modal if this was the last asset
63
+ if (state.uploadedAssets.length === 1) {
64
+ onClose();
65
+ }
66
+ };
67
+ const handlePropagationClick = (event)=>{
68
+ event.stopPropagation();
69
+ };
70
+ const handleEditAsset = (editedAsset)=>{
71
+ if (editedAsset) {
72
+ dispatch({
73
+ type: 'edit_uploaded_asset',
74
+ payload: {
75
+ editedAsset
76
+ }
77
+ });
78
+ setIsEditModalOpen(false);
79
+ }
80
+ };
81
+ return /*#__PURE__*/ jsxs(CardActionsContainer, {
82
+ onClick: handlePropagationClick,
83
+ position: "end",
84
+ children: [
85
+ /*#__PURE__*/ jsxs(Dialog.Root, {
86
+ children: [
87
+ /*#__PURE__*/ jsx(Dialog.Trigger, {
88
+ children: /*#__PURE__*/ jsx(IconButton, {
89
+ label: formatMessage({
90
+ id: getTrad('control-card.remove-selection'),
91
+ defaultMessage: 'Remove from selection'
92
+ }),
93
+ children: /*#__PURE__*/ jsx(Trash, {})
94
+ })
95
+ }),
96
+ /*#__PURE__*/ jsx(ConfirmDialog, {
97
+ onConfirm: handleConfirmRemove
98
+ })
99
+ ]
100
+ }),
101
+ /*#__PURE__*/ jsxs(Modal.Root, {
102
+ open: isEditModalOpen,
103
+ onOpenChange: setIsEditModalOpen,
104
+ children: [
105
+ /*#__PURE__*/ jsx(Modal.Trigger, {
106
+ children: /*#__PURE__*/ jsx(IconButton, {
107
+ label: formatMessage({
108
+ id: getTrad('control-card.edit'),
109
+ defaultMessage: 'Edit'
110
+ }),
111
+ children: /*#__PURE__*/ jsx(Pencil, {})
112
+ })
113
+ }),
114
+ /*#__PURE__*/ jsx(Modal.Content, {
115
+ children: /*#__PURE__*/ jsx(EditAssetContent, {
116
+ // Is Local must be set to false to trigger the correct branch of logic in the EditAssetContent on submit
117
+ asset: {
118
+ ...asset,
119
+ isLocal: false,
120
+ folder: typeof asset.folder === 'number' ? {
121
+ id: asset.folder
122
+ } : asset.folder
123
+ },
124
+ onClose: (arg)=>handleEditAsset(arg),
125
+ canUpdate: canUpdate,
126
+ canCopyLink: canCopyLink,
127
+ canDownload: canDownload,
128
+ omitFields: [
129
+ 'caption',
130
+ 'alternativeText'
131
+ ],
132
+ omitActions: [
133
+ 'replace'
134
+ ]
135
+ })
136
+ })
137
+ ]
138
+ })
139
+ ]
140
+ });
141
+ };
142
+ const Extension = styled.span`
143
+ text-transform: uppercase;
144
+ `;
145
+ const VideoPreviewWrapper = styled(Box)`
146
+ position: relative;
147
+ height: 100%;
148
+ overflow: hidden;
149
+
150
+ canvas,
151
+ video {
152
+ display: block;
153
+ pointer-events: none;
154
+ width: 100%;
155
+ height: 100%;
156
+ object-fit: cover;
157
+ border-radius: ${({ theme })=>theme.borderRadius};
158
+ }
159
+ `;
160
+ const VideoTimerOverlay = styled(CardTimer)`
161
+ position: absolute;
162
+ bottom: 0.5rem;
163
+ right: 0.5rem;
164
+ `;
165
+ const AudioPreviewWrapper = styled(Box)`
166
+ height: 100%;
167
+ overflow: hidden;
168
+ display: flex;
169
+ align-items: center;
170
+ justify-content: center;
171
+
172
+ canvas,
173
+ audio {
174
+ display: block;
175
+ max-width: 100%;
176
+ max-height: 100%;
177
+ }
178
+ `;
179
+ const Asset = ({ assetType, thumbnailUrl, assetUrl, asset })=>{
180
+ const [duration, setDuration] = React.useState();
181
+ const formattedDuration = duration ? formatDuration(duration) : undefined;
182
+ switch(assetType){
183
+ case AssetType.Image:
184
+ return /*#__PURE__*/ jsx(CardAsset, {
185
+ src: thumbnailUrl,
186
+ size: "S",
187
+ alt: asset.alternativeText || asset.name
188
+ });
189
+ case AssetType.Video:
190
+ return /*#__PURE__*/ jsx(CardAsset, {
191
+ size: "S",
192
+ children: /*#__PURE__*/ jsxs(VideoPreviewWrapper, {
193
+ children: [
194
+ /*#__PURE__*/ jsx(VideoPreview, {
195
+ url: assetUrl,
196
+ mime: asset.mime || 'video/mp4',
197
+ onLoadDuration: setDuration,
198
+ alt: asset.alternativeText || asset.name
199
+ }),
200
+ formattedDuration && /*#__PURE__*/ jsx(VideoTimerOverlay, {
201
+ children: formattedDuration
202
+ })
203
+ ]
204
+ })
205
+ });
206
+ case AssetType.Audio:
207
+ return /*#__PURE__*/ jsx(CardAsset, {
208
+ size: "S",
209
+ children: /*#__PURE__*/ jsx(AudioPreviewWrapper, {
210
+ children: /*#__PURE__*/ jsx(AudioPreview, {
211
+ url: assetUrl,
212
+ alt: asset.alternativeText || asset.name
213
+ })
214
+ })
215
+ });
216
+ default:
217
+ return /*#__PURE__*/ jsx(CardAsset, {
218
+ src: thumbnailUrl,
219
+ size: "S",
220
+ alt: asset.alternativeText || asset.name
221
+ });
222
+ }
223
+ };
224
+ /* -------------------------------------------------------------------------------------------------
225
+ * AssetCard
226
+ * -----------------------------------------------------------------------------------------------*/ const StyledCardBody = styled(CardBody)`
227
+ display: flex;
228
+ padding: ${({ theme })=>theme.spaces[2]} ${({ theme })=>theme.spaces[1]};
229
+ `;
230
+ const StyledCard = styled(Card)`
231
+ width: 100%;
232
+ height: 100%;
233
+ border: none;
234
+ box-shadow: none;
235
+ border-radius: 0;
236
+ padding: 0;
237
+ `;
238
+ const getAssetBadgeLabel = (assetType)=>{
239
+ switch(assetType){
240
+ case AssetType.Image:
241
+ return {
242
+ id: getTrad('settings.section.image.label'),
243
+ defaultMessage: 'IMAGE'
244
+ };
245
+ case AssetType.Video:
246
+ return {
247
+ id: getTrad('settings.section.video.label'),
248
+ defaultMessage: 'VIDEO'
249
+ };
250
+ case AssetType.Audio:
251
+ return {
252
+ id: getTrad('settings.section.audio.label'),
253
+ defaultMessage: 'AUDIO'
254
+ };
255
+ default:
256
+ return {
257
+ id: getTrad('settings.section.doc.label'),
258
+ defaultMessage: 'DOC'
259
+ };
260
+ }
261
+ };
262
+ const AIAssetCard = ({ asset, onCaptionChange, onAltTextChange, wasAltTextChanged, wasCaptionChanged })=>{
263
+ const { formatMessage } = useIntl();
264
+ const assetType = typeFromMime(asset.mime || '');
265
+ const thumbnailUrl = prefixFileUrlWithBackendUrl(asset?.formats?.thumbnail?.url || asset.url) || '';
266
+ const assetUrl = prefixFileUrlWithBackendUrl(asset.url) || '';
267
+ const subtitle = asset.height && asset.width ? ` - ${asset.width}x${asset.height}` : '';
268
+ const formattedSize = asset.size ? formatBytes(asset.size) : '';
269
+ const fullSubtitle = `${subtitle}${subtitle && formattedSize ? ' - ' : ''}${formattedSize}`;
270
+ const [caption, setCaption] = React.useState(asset.caption || '');
271
+ React.useEffect(()=>{
272
+ onCaptionChange(caption);
273
+ }, [
274
+ caption,
275
+ onCaptionChange
276
+ ]);
277
+ const [altText, setAltText] = React.useState(asset.alternativeText || '');
278
+ React.useEffect(()=>{
279
+ onAltTextChange(altText);
280
+ }, [
281
+ altText,
282
+ onAltTextChange
283
+ ]);
284
+ return /*#__PURE__*/ jsx(CardContainer, {
285
+ children: /*#__PURE__*/ jsxs(Grid.Root, {
286
+ children: [
287
+ /*#__PURE__*/ jsx(Grid.Item, {
288
+ col: 5,
289
+ alignItems: "stretch",
290
+ children: /*#__PURE__*/ jsxs(StyledCard, {
291
+ width: "100%",
292
+ height: "100%",
293
+ shadow: "none",
294
+ borderRadius: 0,
295
+ padding: 0,
296
+ children: [
297
+ /*#__PURE__*/ jsxs(CardHeader, {
298
+ style: {
299
+ borderStyle: 'none'
300
+ },
301
+ children: [
302
+ /*#__PURE__*/ jsx(AssetCardActions, {
303
+ asset: asset
304
+ }),
305
+ /*#__PURE__*/ jsx(Asset, {
306
+ assetType: assetType,
307
+ thumbnailUrl: thumbnailUrl,
308
+ assetUrl: assetUrl,
309
+ asset: asset
310
+ })
311
+ ]
312
+ }),
313
+ /*#__PURE__*/ jsx(StyledCardBody, {
314
+ children: /*#__PURE__*/ jsxs(CardContent, {
315
+ width: "100%",
316
+ children: [
317
+ /*#__PURE__*/ jsxs(Flex, {
318
+ justifyContent: "space-between",
319
+ alignItems: "start",
320
+ children: [
321
+ /*#__PURE__*/ jsx(Typography, {
322
+ tag: "h2",
323
+ children: /*#__PURE__*/ jsx(CardTitle, {
324
+ tag: "span",
325
+ children: asset.name
326
+ })
327
+ }),
328
+ /*#__PURE__*/ jsx(CardBadge, {
329
+ children: formatMessage(getAssetBadgeLabel(assetType))
330
+ })
331
+ ]
332
+ }),
333
+ /*#__PURE__*/ jsx(Flex, {
334
+ children: /*#__PURE__*/ jsxs(CardSubtitle, {
335
+ children: [
336
+ /*#__PURE__*/ jsx(Extension, {
337
+ children: getFileExtension(asset.ext)
338
+ }),
339
+ fullSubtitle
340
+ ]
341
+ })
342
+ })
343
+ ]
344
+ })
345
+ })
346
+ ]
347
+ })
348
+ }),
349
+ /*#__PURE__*/ jsx(Grid.Item, {
350
+ col: 7,
351
+ flex: 1,
352
+ children: /*#__PURE__*/ jsxs(Flex, {
353
+ direction: "column",
354
+ height: "100%",
355
+ alignItems: "stretch",
356
+ flex: 1,
357
+ padding: 4,
358
+ gap: 2,
359
+ children: [
360
+ /*#__PURE__*/ jsxs(Field.Root, {
361
+ name: "caption",
362
+ children: [
363
+ /*#__PURE__*/ jsx(Flex, {
364
+ alignItems: "center",
365
+ gap: 2,
366
+ children: /*#__PURE__*/ jsx(Field.Label, {
367
+ children: formatMessage({
368
+ id: getTrad('form.input.label.file-caption'),
369
+ defaultMessage: 'Caption'
370
+ })
371
+ })
372
+ }),
373
+ /*#__PURE__*/ jsx(TextInput, {
374
+ value: caption,
375
+ onChange: (e)=>setCaption(e.target.value),
376
+ placeholder: formatMessage({
377
+ id: getTrad('form.input.placeholder.file-caption'),
378
+ defaultMessage: 'Enter caption'
379
+ }),
380
+ endAction: !wasCaptionChanged && asset.caption && /*#__PURE__*/ jsx(Sparkle, {
381
+ width: "16px",
382
+ height: "16px",
383
+ fill: "#AC73E6"
384
+ })
385
+ })
386
+ ]
387
+ }),
388
+ /*#__PURE__*/ jsxs(Field.Root, {
389
+ name: "alternativeText",
390
+ hint: formatMessage({
391
+ id: getTrad('form.input.description.file-alt'),
392
+ defaultMessage: "This text will be displayed if the asset can't be shown."
393
+ }),
394
+ children: [
395
+ /*#__PURE__*/ jsx(Flex, {
396
+ alignItems: "center",
397
+ gap: 2,
398
+ children: /*#__PURE__*/ jsx(Field.Label, {
399
+ children: formatMessage({
400
+ id: getTrad('form.input.label.file-alt'),
401
+ defaultMessage: 'Alternative text'
402
+ })
403
+ })
404
+ }),
405
+ /*#__PURE__*/ jsx(TextInput, {
406
+ value: altText,
407
+ onChange: (e)=>setAltText(e.target.value),
408
+ placeholder: formatMessage({
409
+ id: getTrad('form.input.placeholder.file-alt'),
410
+ defaultMessage: 'Enter alternative text'
411
+ }),
412
+ endAction: !wasAltTextChanged && asset.alternativeText && /*#__PURE__*/ jsx(Sparkle, {
413
+ width: "16px",
414
+ height: "16px",
415
+ fill: "#AC73E6"
416
+ })
417
+ }),
418
+ /*#__PURE__*/ jsx(Field.Hint, {})
419
+ ]
420
+ })
421
+ ]
422
+ })
423
+ })
424
+ ]
425
+ })
426
+ });
427
+ };
428
+ /* -------------------------------------------------------------------------------------------------
429
+ * AssetCardSkeletons
430
+ * -----------------------------------------------------------------------------------------------*/ const SkeletonBox = styled(Box)`
431
+ background: linear-gradient(
432
+ 90deg,
433
+ ${({ theme })=>theme.colors.neutral100} 25%,
434
+ ${({ theme })=>theme.colors.neutral150} 50%,
435
+ ${({ theme })=>theme.colors.neutral100} 75%
436
+ );
437
+ background-size: 200% 100%;
438
+ animation: loading 1.5s infinite;
439
+ border-radius: ${({ theme })=>theme.borderRadius};
440
+ width: ${({ width })=>width || '100%'};
441
+ height: ${({ height })=>height || '1rem'};
442
+
443
+ @keyframes loading {
444
+ 0% {
445
+ background-position: 200% 0;
446
+ }
447
+ 100% {
448
+ background-position: -200% 0;
449
+ }
450
+ }
451
+ `;
452
+ const AIAssetCardSkeletons = ({ count = 1 })=>{
453
+ const skeletons = Array.from({
454
+ length: count
455
+ }, (_, i)=>i);
456
+ return skeletons.map((index)=>/*#__PURE__*/ jsx(Box, {
457
+ background: "neutral0",
458
+ borderColor: "neutral150",
459
+ borderStyle: "solid",
460
+ borderWidth: "1px",
461
+ borderRadius: "4px",
462
+ marginBottom: 4,
463
+ children: /*#__PURE__*/ jsxs(Grid.Root, {
464
+ children: [
465
+ /*#__PURE__*/ jsx(Grid.Item, {
466
+ col: 5,
467
+ alignItems: "stretch",
468
+ children: /*#__PURE__*/ jsxs(Card, {
469
+ height: "100%",
470
+ width: "100%",
471
+ borderStyle: "none",
472
+ shadow: "none",
473
+ borderRadius: 0,
474
+ padding: 2,
475
+ children: [
476
+ /*#__PURE__*/ jsx(Box, {
477
+ height: "150px",
478
+ padding: 2,
479
+ children: /*#__PURE__*/ jsx(SkeletonBox, {
480
+ height: "100%"
481
+ })
482
+ }),
483
+ /*#__PURE__*/ jsx(CardBody, {
484
+ style: {
485
+ display: 'flex',
486
+ padding: '8px 4px'
487
+ },
488
+ children: /*#__PURE__*/ jsxs(CardContent, {
489
+ width: "100%",
490
+ children: [
491
+ /*#__PURE__*/ jsxs(Flex, {
492
+ justifyContent: "space-between",
493
+ alignItems: "start",
494
+ marginBottom: 1,
495
+ children: [
496
+ /*#__PURE__*/ jsx(SkeletonBox, {
497
+ width: "60%",
498
+ height: "18px"
499
+ }),
500
+ /*#__PURE__*/ jsx(SkeletonBox, {
501
+ width: "40px",
502
+ height: "16px"
503
+ })
504
+ ]
505
+ }),
506
+ /*#__PURE__*/ jsx(SkeletonBox, {
507
+ width: "80%",
508
+ height: "14px"
509
+ })
510
+ ]
511
+ })
512
+ })
513
+ ]
514
+ })
515
+ }),
516
+ /*#__PURE__*/ jsx(Grid.Item, {
517
+ col: 7,
518
+ flex: 1,
519
+ children: /*#__PURE__*/ jsxs(Flex, {
520
+ direction: "column",
521
+ height: "100%",
522
+ alignItems: "stretch",
523
+ flex: 1,
524
+ padding: 4,
525
+ gap: 2,
526
+ children: [
527
+ /*#__PURE__*/ jsxs(Box, {
528
+ children: [
529
+ /*#__PURE__*/ jsx(SkeletonBox, {
530
+ width: "60px",
531
+ height: "16px",
532
+ marginBottom: 1
533
+ }),
534
+ /*#__PURE__*/ jsx(SkeletonBox, {
535
+ height: "32px"
536
+ })
537
+ ]
538
+ }),
539
+ /*#__PURE__*/ jsxs(Box, {
540
+ children: [
541
+ /*#__PURE__*/ jsx(SkeletonBox, {
542
+ width: "100px",
543
+ height: "16px",
544
+ marginBottom: 1
545
+ }),
546
+ /*#__PURE__*/ jsx(SkeletonBox, {
547
+ height: "32px"
548
+ }),
549
+ /*#__PURE__*/ jsx(Box, {
550
+ marginTop: 1,
551
+ children: /*#__PURE__*/ jsx(SkeletonBox, {
552
+ width: "70%",
553
+ height: "12px"
554
+ })
555
+ })
556
+ ]
557
+ })
558
+ ]
559
+ })
560
+ })
561
+ ]
562
+ })
563
+ }, index));
564
+ };
565
+
566
+ export { AIAssetCard, AIAssetCardSkeletons };
567
+ //# sourceMappingURL=AIAssetCard.mjs.map
@@ -0,0 +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 } from '../../constants';\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;\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 AssetType.Image:\n return <CardAsset src={thumbnailUrl} size=\"S\" alt={asset.alternativeText || asset.name} />;\n case AssetType.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 AssetType.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) => {\n switch (assetType) {\n case AssetType.Image:\n return { id: getTrad('settings.section.image.label'), defaultMessage: 'IMAGE' };\n case AssetType.Video:\n return { id: getTrad('settings.section.video.label'), defaultMessage: 'VIDEO' };\n case AssetType.Audio:\n return { id: getTrad('settings.section.audio.label'), defaultMessage: 'AUDIO' };\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 col={5} 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 col={7} 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 />\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 />\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 col={7} 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","AssetType","Image","CardAsset","src","size","alt","alternativeText","name","Video","VideoPreview","url","mime","onLoadDuration","Audio","AudioPreview","StyledCardBody","CardBody","spaces","StyledCard","Card","getAssetBadgeLabel","AIAssetCard","onCaptionChange","onAltTextChange","wasAltTextChanged","wasCaptionChanged","typeFromMime","prefixFileUrlWithBackendUrl","formats","thumbnail","subtitle","height","width","formattedSize","formatBytes","fullSubtitle","caption","setCaption","useEffect","altText","setAltText","Grid","Item","col","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","display","marginTop"],"mappings":"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"}