feat(builder): implement reusable media library

Media dashboard (real total/images/SVG/logos/unused/storage/alt-coverage, computed from actual assets + a bootstrap usage scan, no fabricated stats); gallery gets grid/list toggle, type filter, sort, drag-and-drop + multi-file upload with cancel/retry and friendly error mapping, lazy thumbnails, multi-select with bulk delete/download/export-metadata; asset details drawer shows real dimensions/size/format/date/usage locations (walks bootstrap config for exact URL matches, reports not-used rather than guessing) plus editable alt text/caption/description/decorative flag with missing-alt warning; shared MediaPickerComponent (already the one reusable picker used by content management) gains type filter, a recent shortcut, and keyboard grid navigation.
This commit is contained in:
sdarbinyan
2026-07-18 16:09:47 +04:00
parent b31c75214d
commit 5d52d81c7d
21 changed files with 1255 additions and 136 deletions

View File

@@ -1150,6 +1150,71 @@ export interface Translations {
confirm: string;
emptyTitle: string;
emptyDescription: string;
allFolders: string;
newFolder: string;
editTags: string;
totalAssets: string;
logos: string;
unused: string;
storageUsed: string;
altCoverage: string;
allTypes: string;
typeImage: string;
typeSvg: string;
typePdf: string;
sortRecent: string;
sortName: string;
sortSize: string;
viewMode: string;
viewGrid: string;
viewList: string;
dropHint: string;
cancelUpload: string;
retry: string;
errorTooLarge: string;
errorUnsupportedType: string;
errorGeneric: string;
selectedCount: string;
download: string;
exportMetadata: string;
bulkDelete: string;
bulkDeleteConfirm: string;
clearSelection: string;
guideCopy: string;
missingAlt: string;
usageCount: string;
detailsTitle: string;
filename: string;
format: string;
fileSize: string;
dimensions: string;
uploadDate: string;
lastUsed: string;
usageCountLabel: string;
usedIn: string;
notUsed: string;
unknownValue: string;
altText: string;
altTextHelp: string;
decorative: string;
missingAltWarning: string;
caption: string;
description: string;
usage: {
brand: string;
theme: string;
header: string;
footer: string;
staticPage: string;
homepage: string;
catalog: string;
productPage: string;
widget: string;
company: string;
seo: string;
navigation: string;
other: string;
};
};
// Sprint 28: only the new empty-state copy this sprint's skeleton/empty-
// state consistency fix introduces - NOT the full adminProducts/