@knkcs/mediahub-ui 0.1.0 → 0.3.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.
package/dist/index.d.ts CHANGED
@@ -3,8 +3,10 @@ import { JSX } from 'react';
3
3
  import { PersistOptions } from 'zustand/middleware';
4
4
  import { QueryClient } from '@tanstack/react-query';
5
5
  import { ReactNode } from 'react';
6
+ import { Schema } from '@knkcs/fieldkit/schema';
6
7
  import { StatusInfo } from '@knkcs/statushub-ui';
7
8
  import { StoreApi } from 'zustand';
9
+ import { TFunction } from 'i18next';
8
10
  import { UseBoundStore } from 'zustand';
9
11
  import { UseMutateAsyncFunction } from '@tanstack/react-query';
10
12
  import { UseMutateFunction } from '@tanstack/react-query';
@@ -174,7 +176,7 @@ export declare interface AssetDetailProps {
174
176
  onDeleted?: () => void;
175
177
  }
176
178
 
177
- export declare function AssetDetailRail({ assetId, assetName, currentVersionId, currentMimeType, currentFilename, currentFileSize, currentVersion, assetTypeId, createdBy, createdByName, folderId, tagIds, collectionIds, statusSlug, }: AssetDetailRailProps): default_2.JSX.Element;
179
+ export declare function AssetDetailRail({ assetId, assetName, currentVersionId, currentMimeType, currentFilename, currentFileSize, currentVersion, assetTypeId, createdBy, createdByName, folderId, tagIds, collectionIds, statusSlug, t, }: AssetDetailRailProps): default_2.JSX.Element;
178
180
 
179
181
  export declare namespace AssetDetailRail {
180
182
  var displayName: string;
@@ -195,6 +197,7 @@ declare interface AssetDetailRailProps {
195
197
  tagIds: string[];
196
198
  collectionIds: string[];
197
199
  statusSlug: string;
200
+ t: TFunction;
198
201
  }
199
202
 
200
203
  export declare interface AssetFilters {
@@ -264,11 +267,6 @@ export declare interface AssetPickerProps {
264
267
  accept?: string[];
265
268
  /** Initial/locked filters (e.g. a fixed assetTypeId). */
266
269
  initialFilters?: AssetFilters;
267
- headerLabel?: string;
268
- searchPlaceholder?: string;
269
- insertLabel?: string;
270
- cancelLabel?: string;
271
- emptyLabel?: string;
272
270
  }
273
271
 
274
272
  export declare const AssetPreview: React.FC<AssetPreviewProps>;
@@ -368,6 +366,97 @@ export declare interface AssetTypeClient {
368
366
  delete(id: string): Promise<void>;
369
367
  }
370
368
 
369
+ /**
370
+ * Create an asset type. The screen the package owns, replacing the
371
+ * standalone's create dialog and core's create page (knkCS/mediahub#137/#140).
372
+ *
373
+ * The slug follows the name until it is edited by hand and then stops — the
374
+ * unconditional overwrite the standalone had silently discarded a slug someone
375
+ * typed on purpose. The server's rule (lowercase alphanumeric with hyphens, at
376
+ * least two characters) is stated on the form and enforced before submit,
377
+ * because without both a name like `Bild Anhang` produced a bare 400
378
+ * (knkcms/core#861).
379
+ */
380
+ export declare function AssetTypeCreate({ assetTypesPath, onCreated, onCancel, }: AssetTypeCreateProps): default_2.JSX.Element;
381
+
382
+ export declare namespace AssetTypeCreate {
383
+ var displayName: string;
384
+ }
385
+
386
+ export declare interface AssetTypeCreateProps {
387
+ /**
388
+ * The host's asset-type index path — used as the breadcrumb's target. A
389
+ * path, not a route: the screen never navigates, it only says where the
390
+ * list it belongs to lives (core's `docs/service-integration.md`).
391
+ */
392
+ assetTypesPath: string;
393
+ /** Called with the created asset type; the host decides where to go. */
394
+ onCreated?: (assetType: AssetTypeInfo) => void;
395
+ /** Called when the administrator abandons the form. */
396
+ onCancel?: () => void;
397
+ }
398
+
399
+ /**
400
+ * The packaged asset-type detail screen: view, edit and delete one asset type,
401
+ * with its fieldkit metadata schema on a second tab.
402
+ *
403
+ * **Correct against the wire, not against the declared type.** Connect omits
404
+ * empty repeated fields and empty strings from its JSON, and a host client that
405
+ * returns the wire object unmapped therefore delivers `undefined` where
406
+ * `AssetTypeInfo` promises `string` or `string[]`. Reading one of those
407
+ * unguarded is what took core's detail page down (knkcms/core#862, #863).
408
+ * Every field below is defaulted at the one place it is read, so an absent
409
+ * value renders as empty rather than throwing — and never flips a controlled
410
+ * input to uncontrolled, which is the quieter version of the same bug.
411
+ */
412
+ export declare function AssetTypeDetail({ typeId, assetTypesPath, onBack, onDeleted, }: AssetTypeDetailProps): default_2.JSX.Element;
413
+
414
+ export declare namespace AssetTypeDetail {
415
+ var displayName: string;
416
+ }
417
+
418
+ export declare interface AssetTypeDetailProps {
419
+ /** The asset type to show. */
420
+ typeId: string;
421
+ /**
422
+ * Typed path of the host's asset-type index, used for the breadcrumb back
423
+ * link. The screen never routes itself — the host owns its URLs
424
+ * (core's `docs/service-integration.md`).
425
+ */
426
+ assetTypesPath?: string;
427
+ /**
428
+ * Navigate back to the asset-type index. Given one, the screen renders a
429
+ * back affordance that confirms before discarding unsaved edits — the
430
+ * breadcrumb link above is the host's own navigation and the screen cannot
431
+ * intercept it.
432
+ */
433
+ onBack?: () => void;
434
+ /** Called after a successful delete; the host decides where to go next. */
435
+ onDeleted?: () => void;
436
+ }
437
+
438
+ /**
439
+ * The workspace's asset types, listed. The package owns the screen; both hosts
440
+ * compose it and keep their own routing to themselves (#142, parent #138).
441
+ */
442
+ export declare function AssetTypeIndex(props: AssetTypeIndexProps): React.JSX.Element;
443
+
444
+ export declare namespace AssetTypeIndex {
445
+ var displayName: string;
446
+ }
447
+
448
+ export declare interface AssetTypeIndexProps {
449
+ /**
450
+ * An asset type was opened. The host decides what that means — it receives
451
+ * the id and nothing else, because this package must not know either host's
452
+ * URL structure (core's `docs/service-integration.md`; spec #138). Screens,
453
+ * not routes: nothing here navigates and nothing here builds a path.
454
+ */
455
+ onOpen?: (assetTypeId: string) => void;
456
+ /** The reader asked for a new asset type. Same contract as `onOpen`. */
457
+ onCreate?: () => void;
458
+ }
459
+
371
460
  export declare interface AssetTypeInfo {
372
461
  id: string;
373
462
  workspaceId: string;
@@ -399,10 +488,7 @@ export declare interface AuthzClient {
399
488
  canManage(resourceType: GrantResourceType, resourceId: string): Promise<boolean>;
400
489
  }
401
490
 
402
- export declare const BulkActionBar: React.FC<BulkActionBarProps>;
403
-
404
- declare interface BulkActionBarProps {
405
- }
491
+ export declare const BulkActionBar: React.FC;
406
492
 
407
493
  export declare const CollectionChipField: React.FC<CollectionChipFieldProps>;
408
494
 
@@ -470,12 +556,6 @@ export declare interface CollectionPickerProps {
470
556
  onSelect: (selection: CollectionSelection) => void;
471
557
  /** Show the inline "New collection" affordance. @default false */
472
558
  allowCreate?: boolean;
473
- headerLabel?: string;
474
- searchPlaceholder?: string;
475
- confirmLabel?: string;
476
- cancelLabel?: string;
477
- emptyLabel?: string;
478
- createLabel?: string;
479
559
  }
480
560
 
481
561
  /** Result of confirming a CollectionPicker selection. */
@@ -852,6 +932,19 @@ declare interface FolderTreeProps {
852
932
  onFolderSelect: (folderId: string) => void;
853
933
  }
854
934
 
935
+ /**
936
+ * Takes `string[] | undefined` although `AssetTypeInfo.allowedMimeTypes` is
937
+ * declared `string[]`, because a host client may return the wire object
938
+ * unmapped under that type. Connect omits an empty repeated field from the
939
+ * JSON, so an asset type with no MIME types arrives without the key at all and
940
+ * the declared type is a lie. The package's own client maps through
941
+ * `mapAssetType`, which defaults it; core's did not, and the detail page went
942
+ * down on "Cannot read properties of undefined (reading 'join')"
943
+ * (knkcms/core#863). Tolerating the absent list here is the fix, kept in one
944
+ * place for every host.
945
+ */
946
+ export declare const formatMimeTypeList: (value: string[] | undefined) => string;
947
+
855
948
  export declare interface GetUploadUrlParams {
856
949
  assetId: string;
857
950
  filename: string;
@@ -894,6 +987,753 @@ export declare interface GrantRoster {
894
987
  grants: GrantEntry[];
895
988
  }
896
989
 
990
+ /** The package's bundled translations, keyed by language, then by
991
+ * `MEDIAHUB_UI_NS`. */
992
+ export declare const i18nResources: {
993
+ en: {
994
+ "mediahub-ui": {
995
+ common: {
996
+ selectedCount: string;
997
+ assetPreviewAlt: string;
998
+ };
999
+ assetDetail: {
1000
+ backButtonAria: string;
1001
+ moreActionsAria: string;
1002
+ breadcrumbAssets: string;
1003
+ enhanceWithAi: string;
1004
+ download: string;
1005
+ discard: string;
1006
+ save: string;
1007
+ moveAction: string;
1008
+ manageAccessAction: string;
1009
+ deleteAction: string;
1010
+ overviewTab: string;
1011
+ versionsTab: string;
1012
+ discardConfirmTitle: string;
1013
+ discardConfirmMessage: string;
1014
+ discardConfirmLabel: string;
1015
+ saveSuccessToast: string;
1016
+ saveFailedToast: string;
1017
+ downloadFailedToast: string;
1018
+ metadataEnhancedToast: string;
1019
+ enhanceFailedToast: string;
1020
+ deleteConfirmTitle: string;
1021
+ deleteConfirmMessage: string;
1022
+ deleteConfirmLabel: string;
1023
+ deleteSuccessToast: string;
1024
+ deleteFailedToast: string;
1025
+ notFound: string;
1026
+ noVersions: string;
1027
+ versionColumn: string;
1028
+ fileColumn: string;
1029
+ sizeColumn: string;
1030
+ authorColumn: string;
1031
+ dateColumn: string;
1032
+ currentVersionTooltip: string;
1033
+ downloadVersion: string;
1034
+ rail: {
1035
+ assetEyebrow: string;
1036
+ statusSection: string;
1037
+ newVersionSection: string;
1038
+ dropHint: string;
1039
+ uploading: string;
1040
+ detailsSection: string;
1041
+ typeLabel: string;
1042
+ formatLabel: string;
1043
+ sizeLabel: string;
1044
+ versionLabel: string;
1045
+ createdByLabel: string;
1046
+ folderLabel: string;
1047
+ tagsSection: string;
1048
+ collectionsSection: string;
1049
+ aiProcessingSection: string;
1050
+ unknownValue: string;
1051
+ };
1052
+ };
1053
+ assetTypeDetail: {
1054
+ breadcrumbAssetTypes: string;
1055
+ notFound: string;
1056
+ untitled: string;
1057
+ backButtonAria: string;
1058
+ generalTab: string;
1059
+ metadataTab: string;
1060
+ nameLabel: string;
1061
+ nameRequired: string;
1062
+ slugLabel: string;
1063
+ descriptionLabel: string;
1064
+ descriptionPlaceholder: string;
1065
+ allowedMimeTypesLabel: string;
1066
+ allowedMimeTypesDescription: string;
1067
+ activeLabel: string;
1068
+ save: string;
1069
+ delete: string;
1070
+ saveSuccessToast: string;
1071
+ saveFailedToast: string;
1072
+ schemaSavedToast: string;
1073
+ deleteConfirmTitle: string;
1074
+ deleteConfirmMessage: string;
1075
+ deleteConfirmLabel: string;
1076
+ deleteSuccessToast: string;
1077
+ deleteFailedToast: string;
1078
+ discardSchemaConfirmTitle: string;
1079
+ discardSchemaConfirmMessage: string;
1080
+ discardSchemaConfirmLabel: string;
1081
+ discardConfirmTitle: string;
1082
+ discardConfirmMessage: string;
1083
+ discardConfirmLabel: string;
1084
+ };
1085
+ assetLibrary: {
1086
+ pageTitle: string;
1087
+ uploadButton: string;
1088
+ searchPlaceholder: string;
1089
+ behaviorAll: string;
1090
+ behaviorActive: string;
1091
+ behaviorArchived: string;
1092
+ behaviorInactive: string;
1093
+ behaviorDeleted: string;
1094
+ viewModeList: string;
1095
+ viewModeGrid: string;
1096
+ statusFilterAll: string;
1097
+ assetsCount: string;
1098
+ allAssets: string;
1099
+ uploadSection: string;
1100
+ tagsSection: string;
1101
+ collectionsSection: string;
1102
+ columnName: string;
1103
+ columnType: string;
1104
+ columnStatus: string;
1105
+ columnUpdated: string;
1106
+ columnUpdatedBy: string;
1107
+ actionDownload: string;
1108
+ actionDelete: string;
1109
+ deleteConfirmTitle: string;
1110
+ deleteConfirmMessage: string;
1111
+ deleteConfirmLabel: string;
1112
+ deleteSuccessToast: string;
1113
+ deleteFailedToast: string;
1114
+ statusesUnavailableHeader: string;
1115
+ statusesUnavailableDescription: string;
1116
+ clearStatusGroup: string;
1117
+ assetsLoadFailedHeader: string;
1118
+ noAssetsFound: string;
1119
+ };
1120
+ assetPicker: {
1121
+ headerSingle: string;
1122
+ headerMulti: string;
1123
+ searchPlaceholder: string;
1124
+ statusLabel: string;
1125
+ statusFilterAll: string;
1126
+ insert: string;
1127
+ insertCount: string;
1128
+ cancel: string;
1129
+ emptyLabel: string;
1130
+ moreCount: string;
1131
+ selectedCount: string;
1132
+ previewAlt: string;
1133
+ };
1134
+ collectionPicker: {
1135
+ headerSingle: string;
1136
+ headerMulti: string;
1137
+ searchPlaceholder: string;
1138
+ confirm: string;
1139
+ confirmCount: string;
1140
+ cancel: string;
1141
+ emptyLabel: string;
1142
+ createPlaceholder: string;
1143
+ createButton: string;
1144
+ createSuccessToast: string;
1145
+ createFailedToast: string;
1146
+ selectedCount: string;
1147
+ };
1148
+ assetGrid: {
1149
+ previewAlt: string;
1150
+ categoryImage: string;
1151
+ categoryVideo: string;
1152
+ categoryAudio: string;
1153
+ categoryPdf: string;
1154
+ categoryUnknown: string;
1155
+ };
1156
+ bulkActionBar: {
1157
+ deleteConfirmTitle: string;
1158
+ deleteConfirmMessage_one: string;
1159
+ deleteConfirmMessage_other: string;
1160
+ deleteConfirmLabel: string;
1161
+ deleteSuccessToast_one: string;
1162
+ deleteSuccessToast_other: string;
1163
+ deletePartialFailureToast: string;
1164
+ tagsUpdatedToast: string;
1165
+ addedToCollectionToast: string;
1166
+ errorToast: string;
1167
+ countSelected: string;
1168
+ addTagsAction: string;
1169
+ noTagsAvailable: string;
1170
+ addToCollectionAction: string;
1171
+ noCollectionsAvailable: string;
1172
+ deleteAction: string;
1173
+ };
1174
+ folderTree: {
1175
+ allAssets: string;
1176
+ allAssetsMenuAria: string;
1177
+ newRestrictedFolder: string;
1178
+ folderMenuAria: string;
1179
+ rename: string;
1180
+ move: string;
1181
+ manageAccess: string;
1182
+ restrict: string;
1183
+ unrestrict: string;
1184
+ delete: string;
1185
+ newFolderPlaceholder: string;
1186
+ newFolder: string;
1187
+ deleteConfirmTitle: string;
1188
+ deleteConfirmMessage: string;
1189
+ deleteConfirmLabel: string;
1190
+ unrestrictConfirmTitle: string;
1191
+ unrestrictConfirmMessage: string;
1192
+ unrestrictConfirmLabel: string;
1193
+ deleteSuccessToast: string;
1194
+ deleteFailedToast: string;
1195
+ renameSuccessToast: string;
1196
+ renameFailedToast: string;
1197
+ folderRestrictedToast: string;
1198
+ folderUnrestrictedToast: string;
1199
+ restrictFailedToast: string;
1200
+ unrestrictFailedToast: string;
1201
+ createSuccessToast: string;
1202
+ createFailedToast: string;
1203
+ };
1204
+ manageAccessDialog: {
1205
+ header: string;
1206
+ doneLabel: string;
1207
+ ownerBadgeLabel: string;
1208
+ addPersonLabel: string;
1209
+ grantLabel: string;
1210
+ viewerLabel: string;
1211
+ editorLabel: string;
1212
+ openAccessNote: {
1213
+ asset: string;
1214
+ folder: string;
1215
+ collection: string;
1216
+ };
1217
+ restrictedAccessNote: {
1218
+ asset: string;
1219
+ folder: string;
1220
+ collection: string;
1221
+ };
1222
+ accessLevelForAria: string;
1223
+ revokeAccessForAria: string;
1224
+ addPersonAria: string;
1225
+ accessLevelAria: string;
1226
+ couldntLoadAccess: string;
1227
+ grantFailedToast: string;
1228
+ updateFailedToast: string;
1229
+ revokeFailedToast: string;
1230
+ accessGrantedToast: string;
1231
+ accessUpdatedToast: string;
1232
+ accessRevokedToast: string;
1233
+ };
1234
+ moveDialog: {
1235
+ header: string;
1236
+ confirmLabel: string;
1237
+ cancelLabel: string;
1238
+ rootLabel: string;
1239
+ currentLocationLabel: string;
1240
+ selfLocationLabel: string;
1241
+ blockedAssetLabel: string;
1242
+ blockedFolderLabel: string;
1243
+ expandAria: string;
1244
+ collapseAria: string;
1245
+ moveFailedToast: string;
1246
+ folderMovedToast: string;
1247
+ assetMovedToast: string;
1248
+ };
1249
+ uploadDialog: {
1250
+ header_one: string;
1251
+ header_other: string;
1252
+ uploadButton: string;
1253
+ assetTypeLabel: string;
1254
+ selectAssetType: string;
1255
+ assetTypeHint: string;
1256
+ analyzeWithAi: string;
1257
+ selectType: string;
1258
+ changeType: string;
1259
+ };
1260
+ collectionPanel: {
1261
+ createPlaceholder: string;
1262
+ createLabel: string;
1263
+ emptyText: string;
1264
+ createSuccessToast: string;
1265
+ errorToast: string;
1266
+ };
1267
+ tagPanel: {
1268
+ createPlaceholder: string;
1269
+ createLabel: string;
1270
+ emptyText: string;
1271
+ createSuccessToast: string;
1272
+ errorToast: string;
1273
+ };
1274
+ collectionChipField: {
1275
+ addLabel: string;
1276
+ emptyLabel: string;
1277
+ errorToast: string;
1278
+ };
1279
+ tagChipField: {
1280
+ addLabel: string;
1281
+ emptyLabel: string;
1282
+ errorToast: string;
1283
+ };
1284
+ assetStatusControl: {
1285
+ transitionFailedToast: string;
1286
+ };
1287
+ restrictedFolderDialog: {
1288
+ header: string;
1289
+ createLabel: string;
1290
+ namePlaceholder: string;
1291
+ createSuccessToast: string;
1292
+ createFailedToast: string;
1293
+ };
1294
+ folderBreadcrumbs: {
1295
+ rootLabel: string;
1296
+ };
1297
+ restricted: {
1298
+ containerWarning: {
1299
+ folder: string;
1300
+ collection: string;
1301
+ };
1302
+ unrestrictDisclosure: {
1303
+ folder: string;
1304
+ collection: string;
1305
+ };
1306
+ lockBadgeAria: string;
1307
+ };
1308
+ assetPreview: {
1309
+ previewNotAvailable: string;
1310
+ download: string;
1311
+ };
1312
+ leakGuardRefusalDialog: {
1313
+ closeLabel: string;
1314
+ resolveHint: string;
1315
+ };
1316
+ assetTypeCreate: {
1317
+ title: string;
1318
+ breadcrumbAssetTypes: string;
1319
+ nameLabel: string;
1320
+ namePlaceholder: string;
1321
+ nameRequired: string;
1322
+ slugLabel: string;
1323
+ slugHint: string;
1324
+ slugInvalid: string;
1325
+ descriptionLabel: string;
1326
+ descriptionPlaceholder: string;
1327
+ allowedMimeTypesLabel: string;
1328
+ allowedMimeTypesHint: string;
1329
+ allowedMimeTypesPlaceholder: string;
1330
+ metadataSchemaLabel: string;
1331
+ metadataSchemaHint: string;
1332
+ submit: string;
1333
+ cancel: string;
1334
+ createdToast: string;
1335
+ createFailedToast: string;
1336
+ };
1337
+ assetTypeIndex: {
1338
+ pageTitle: string;
1339
+ pageSubtitle: string;
1340
+ newButton: string;
1341
+ searchPlaceholder: string;
1342
+ typesCount: string;
1343
+ columnName: string;
1344
+ columnSlug: string;
1345
+ columnMimeTypes: string;
1346
+ columnFields: string;
1347
+ columnStatus: string;
1348
+ statusActive: string;
1349
+ statusInactive: string;
1350
+ actionDelete: string;
1351
+ deleteConfirmTitle: string;
1352
+ deleteConfirmMessage: string;
1353
+ deleteConfirmLabel: string;
1354
+ deleteSuccessToast: string;
1355
+ deleteFailedToast: string;
1356
+ noAssetTypesHeader: string;
1357
+ noAssetTypesDescription: string;
1358
+ noMatchesHeader: string;
1359
+ noMatchesDescription: string;
1360
+ loadFailedHeader: string;
1361
+ };
1362
+ };
1363
+ };
1364
+ de: {
1365
+ "mediahub-ui": {
1366
+ common: {
1367
+ selectedCount: string;
1368
+ assetPreviewAlt: string;
1369
+ };
1370
+ assetDetail: {
1371
+ backButtonAria: string;
1372
+ moreActionsAria: string;
1373
+ breadcrumbAssets: string;
1374
+ enhanceWithAi: string;
1375
+ download: string;
1376
+ discard: string;
1377
+ save: string;
1378
+ moveAction: string;
1379
+ manageAccessAction: string;
1380
+ deleteAction: string;
1381
+ overviewTab: string;
1382
+ versionsTab: string;
1383
+ discardConfirmTitle: string;
1384
+ discardConfirmMessage: string;
1385
+ discardConfirmLabel: string;
1386
+ saveSuccessToast: string;
1387
+ saveFailedToast: string;
1388
+ downloadFailedToast: string;
1389
+ metadataEnhancedToast: string;
1390
+ enhanceFailedToast: string;
1391
+ deleteConfirmTitle: string;
1392
+ deleteConfirmMessage: string;
1393
+ deleteConfirmLabel: string;
1394
+ deleteSuccessToast: string;
1395
+ deleteFailedToast: string;
1396
+ notFound: string;
1397
+ noVersions: string;
1398
+ versionColumn: string;
1399
+ fileColumn: string;
1400
+ sizeColumn: string;
1401
+ authorColumn: string;
1402
+ dateColumn: string;
1403
+ currentVersionTooltip: string;
1404
+ downloadVersion: string;
1405
+ rail: {
1406
+ assetEyebrow: string;
1407
+ statusSection: string;
1408
+ newVersionSection: string;
1409
+ dropHint: string;
1410
+ uploading: string;
1411
+ detailsSection: string;
1412
+ typeLabel: string;
1413
+ formatLabel: string;
1414
+ sizeLabel: string;
1415
+ versionLabel: string;
1416
+ createdByLabel: string;
1417
+ folderLabel: string;
1418
+ tagsSection: string;
1419
+ collectionsSection: string;
1420
+ aiProcessingSection: string;
1421
+ unknownValue: string;
1422
+ };
1423
+ };
1424
+ assetTypeDetail: {
1425
+ breadcrumbAssetTypes: string;
1426
+ notFound: string;
1427
+ untitled: string;
1428
+ backButtonAria: string;
1429
+ generalTab: string;
1430
+ metadataTab: string;
1431
+ nameLabel: string;
1432
+ nameRequired: string;
1433
+ slugLabel: string;
1434
+ descriptionLabel: string;
1435
+ descriptionPlaceholder: string;
1436
+ allowedMimeTypesLabel: string;
1437
+ allowedMimeTypesDescription: string;
1438
+ activeLabel: string;
1439
+ save: string;
1440
+ delete: string;
1441
+ saveSuccessToast: string;
1442
+ saveFailedToast: string;
1443
+ schemaSavedToast: string;
1444
+ deleteConfirmTitle: string;
1445
+ deleteConfirmMessage: string;
1446
+ deleteConfirmLabel: string;
1447
+ deleteSuccessToast: string;
1448
+ deleteFailedToast: string;
1449
+ discardSchemaConfirmTitle: string;
1450
+ discardSchemaConfirmMessage: string;
1451
+ discardSchemaConfirmLabel: string;
1452
+ discardConfirmTitle: string;
1453
+ discardConfirmMessage: string;
1454
+ discardConfirmLabel: string;
1455
+ };
1456
+ assetLibrary: {
1457
+ pageTitle: string;
1458
+ uploadButton: string;
1459
+ searchPlaceholder: string;
1460
+ behaviorAll: string;
1461
+ behaviorActive: string;
1462
+ behaviorArchived: string;
1463
+ behaviorInactive: string;
1464
+ behaviorDeleted: string;
1465
+ viewModeList: string;
1466
+ viewModeGrid: string;
1467
+ statusFilterAll: string;
1468
+ assetsCount: string;
1469
+ allAssets: string;
1470
+ uploadSection: string;
1471
+ tagsSection: string;
1472
+ collectionsSection: string;
1473
+ columnName: string;
1474
+ columnType: string;
1475
+ columnStatus: string;
1476
+ columnUpdated: string;
1477
+ columnUpdatedBy: string;
1478
+ actionDownload: string;
1479
+ actionDelete: string;
1480
+ deleteConfirmTitle: string;
1481
+ deleteConfirmMessage: string;
1482
+ deleteConfirmLabel: string;
1483
+ deleteSuccessToast: string;
1484
+ deleteFailedToast: string;
1485
+ statusesUnavailableHeader: string;
1486
+ statusesUnavailableDescription: string;
1487
+ clearStatusGroup: string;
1488
+ assetsLoadFailedHeader: string;
1489
+ noAssetsFound: string;
1490
+ };
1491
+ assetPicker: {
1492
+ headerSingle: string;
1493
+ headerMulti: string;
1494
+ searchPlaceholder: string;
1495
+ statusLabel: string;
1496
+ statusFilterAll: string;
1497
+ insert: string;
1498
+ insertCount: string;
1499
+ cancel: string;
1500
+ emptyLabel: string;
1501
+ moreCount: string;
1502
+ selectedCount: string;
1503
+ previewAlt: string;
1504
+ };
1505
+ collectionPicker: {
1506
+ headerSingle: string;
1507
+ headerMulti: string;
1508
+ searchPlaceholder: string;
1509
+ confirm: string;
1510
+ confirmCount: string;
1511
+ cancel: string;
1512
+ emptyLabel: string;
1513
+ createPlaceholder: string;
1514
+ createButton: string;
1515
+ createSuccessToast: string;
1516
+ createFailedToast: string;
1517
+ selectedCount: string;
1518
+ };
1519
+ assetGrid: {
1520
+ previewAlt: string;
1521
+ categoryImage: string;
1522
+ categoryVideo: string;
1523
+ categoryAudio: string;
1524
+ categoryPdf: string;
1525
+ categoryUnknown: string;
1526
+ };
1527
+ bulkActionBar: {
1528
+ deleteConfirmTitle: string;
1529
+ deleteConfirmMessage_one: string;
1530
+ deleteConfirmMessage_other: string;
1531
+ deleteConfirmLabel: string;
1532
+ deleteSuccessToast_one: string;
1533
+ deleteSuccessToast_other: string;
1534
+ deletePartialFailureToast: string;
1535
+ tagsUpdatedToast: string;
1536
+ addedToCollectionToast: string;
1537
+ errorToast: string;
1538
+ countSelected: string;
1539
+ addTagsAction: string;
1540
+ noTagsAvailable: string;
1541
+ addToCollectionAction: string;
1542
+ noCollectionsAvailable: string;
1543
+ deleteAction: string;
1544
+ };
1545
+ folderTree: {
1546
+ allAssets: string;
1547
+ allAssetsMenuAria: string;
1548
+ newRestrictedFolder: string;
1549
+ folderMenuAria: string;
1550
+ rename: string;
1551
+ move: string;
1552
+ manageAccess: string;
1553
+ restrict: string;
1554
+ unrestrict: string;
1555
+ delete: string;
1556
+ newFolderPlaceholder: string;
1557
+ newFolder: string;
1558
+ deleteConfirmTitle: string;
1559
+ deleteConfirmMessage: string;
1560
+ deleteConfirmLabel: string;
1561
+ unrestrictConfirmTitle: string;
1562
+ unrestrictConfirmMessage: string;
1563
+ unrestrictConfirmLabel: string;
1564
+ deleteSuccessToast: string;
1565
+ deleteFailedToast: string;
1566
+ renameSuccessToast: string;
1567
+ renameFailedToast: string;
1568
+ folderRestrictedToast: string;
1569
+ folderUnrestrictedToast: string;
1570
+ restrictFailedToast: string;
1571
+ unrestrictFailedToast: string;
1572
+ createSuccessToast: string;
1573
+ createFailedToast: string;
1574
+ };
1575
+ manageAccessDialog: {
1576
+ header: string;
1577
+ doneLabel: string;
1578
+ ownerBadgeLabel: string;
1579
+ addPersonLabel: string;
1580
+ grantLabel: string;
1581
+ viewerLabel: string;
1582
+ editorLabel: string;
1583
+ openAccessNote: {
1584
+ asset: string;
1585
+ folder: string;
1586
+ collection: string;
1587
+ };
1588
+ restrictedAccessNote: {
1589
+ asset: string;
1590
+ folder: string;
1591
+ collection: string;
1592
+ };
1593
+ accessLevelForAria: string;
1594
+ revokeAccessForAria: string;
1595
+ addPersonAria: string;
1596
+ accessLevelAria: string;
1597
+ couldntLoadAccess: string;
1598
+ grantFailedToast: string;
1599
+ updateFailedToast: string;
1600
+ revokeFailedToast: string;
1601
+ accessGrantedToast: string;
1602
+ accessUpdatedToast: string;
1603
+ accessRevokedToast: string;
1604
+ };
1605
+ moveDialog: {
1606
+ header: string;
1607
+ confirmLabel: string;
1608
+ cancelLabel: string;
1609
+ rootLabel: string;
1610
+ currentLocationLabel: string;
1611
+ selfLocationLabel: string;
1612
+ blockedAssetLabel: string;
1613
+ blockedFolderLabel: string;
1614
+ expandAria: string;
1615
+ collapseAria: string;
1616
+ moveFailedToast: string;
1617
+ folderMovedToast: string;
1618
+ assetMovedToast: string;
1619
+ };
1620
+ uploadDialog: {
1621
+ header_one: string;
1622
+ header_other: string;
1623
+ uploadButton: string;
1624
+ assetTypeLabel: string;
1625
+ selectAssetType: string;
1626
+ assetTypeHint: string;
1627
+ analyzeWithAi: string;
1628
+ selectType: string;
1629
+ changeType: string;
1630
+ };
1631
+ collectionPanel: {
1632
+ createPlaceholder: string;
1633
+ createLabel: string;
1634
+ emptyText: string;
1635
+ createSuccessToast: string;
1636
+ errorToast: string;
1637
+ };
1638
+ tagPanel: {
1639
+ createPlaceholder: string;
1640
+ createLabel: string;
1641
+ emptyText: string;
1642
+ createSuccessToast: string;
1643
+ errorToast: string;
1644
+ };
1645
+ collectionChipField: {
1646
+ addLabel: string;
1647
+ emptyLabel: string;
1648
+ errorToast: string;
1649
+ };
1650
+ tagChipField: {
1651
+ addLabel: string;
1652
+ emptyLabel: string;
1653
+ errorToast: string;
1654
+ };
1655
+ assetStatusControl: {
1656
+ transitionFailedToast: string;
1657
+ };
1658
+ restrictedFolderDialog: {
1659
+ header: string;
1660
+ createLabel: string;
1661
+ namePlaceholder: string;
1662
+ createSuccessToast: string;
1663
+ createFailedToast: string;
1664
+ };
1665
+ folderBreadcrumbs: {
1666
+ rootLabel: string;
1667
+ };
1668
+ restricted: {
1669
+ containerWarning: {
1670
+ folder: string;
1671
+ collection: string;
1672
+ };
1673
+ unrestrictDisclosure: {
1674
+ folder: string;
1675
+ collection: string;
1676
+ };
1677
+ lockBadgeAria: string;
1678
+ };
1679
+ assetPreview: {
1680
+ previewNotAvailable: string;
1681
+ download: string;
1682
+ };
1683
+ leakGuardRefusalDialog: {
1684
+ closeLabel: string;
1685
+ resolveHint: string;
1686
+ };
1687
+ assetTypeCreate: {
1688
+ title: string;
1689
+ breadcrumbAssetTypes: string;
1690
+ nameLabel: string;
1691
+ namePlaceholder: string;
1692
+ nameRequired: string;
1693
+ slugLabel: string;
1694
+ slugHint: string;
1695
+ slugInvalid: string;
1696
+ descriptionLabel: string;
1697
+ descriptionPlaceholder: string;
1698
+ allowedMimeTypesLabel: string;
1699
+ allowedMimeTypesHint: string;
1700
+ allowedMimeTypesPlaceholder: string;
1701
+ metadataSchemaLabel: string;
1702
+ metadataSchemaHint: string;
1703
+ submit: string;
1704
+ cancel: string;
1705
+ createdToast: string;
1706
+ createFailedToast: string;
1707
+ };
1708
+ assetTypeIndex: {
1709
+ pageTitle: string;
1710
+ pageSubtitle: string;
1711
+ newButton: string;
1712
+ searchPlaceholder: string;
1713
+ typesCount: string;
1714
+ columnName: string;
1715
+ columnSlug: string;
1716
+ columnMimeTypes: string;
1717
+ columnFields: string;
1718
+ columnStatus: string;
1719
+ statusActive: string;
1720
+ statusInactive: string;
1721
+ actionDelete: string;
1722
+ deleteConfirmTitle: string;
1723
+ deleteConfirmMessage: string;
1724
+ deleteConfirmLabel: string;
1725
+ deleteSuccessToast: string;
1726
+ deleteFailedToast: string;
1727
+ noAssetTypesHeader: string;
1728
+ noAssetTypesDescription: string;
1729
+ noMatchesHeader: string;
1730
+ noMatchesDescription: string;
1731
+ loadFailedHeader: string;
1732
+ };
1733
+ };
1734
+ };
1735
+ };
1736
+
897
1737
  /**
898
1738
  * Thin wrapper around anker's InlineEdit that adds async save with error handling.
899
1739
  * On error, the value reverts to the previous value automatically.
@@ -948,9 +1788,6 @@ export declare interface LeakGuardRefusalDialogProps {
948
1788
  refusal: RpcErrorDescription | null;
949
1789
  open: boolean;
950
1790
  onClose: () => void;
951
- closeLabel?: string;
952
- /** Line under the pair list telling the user how to proceed. */
953
- resolveHint?: string;
954
1791
  }
955
1792
 
956
1793
  /**
@@ -971,17 +1808,6 @@ export declare interface ManageAccessDialogProps {
971
1808
  open: boolean;
972
1809
  onOpenChange: (open: boolean) => void;
973
1810
  subject: ManageAccessSubject;
974
- headerLabel?: string;
975
- doneLabel?: string;
976
- ownerBadgeLabel?: string;
977
- addPersonLabel?: string;
978
- grantLabel?: string;
979
- viewerLabel?: string;
980
- editorLabel?: string;
981
- /** Derived-Access note on open content. */
982
- openAccessNote?: string;
983
- /** Derived-Access note on Restricted content (explicit Grants only). */
984
- restrictedAccessNote?: string;
985
1811
  }
986
1812
 
987
1813
  /** What the panel manages access to: the full record is carried so the
@@ -998,6 +1824,16 @@ export declare type ManageAccessSubject = {
998
1824
  collection: CollectionInfo;
999
1825
  };
1000
1826
 
1827
+ /**
1828
+ * The i18next namespace every string in this package is looked up under. A
1829
+ * host merges `i18nResources` and lists this constant among its namespaces —
1830
+ * never the literal, so a rename here fails the host's compile rather than
1831
+ * rendering raw keys (knkcms/core ADR 0005's provider checklist; #807). The
1832
+ * package's own `useTranslation` calls name the same string, which
1833
+ * `resources.test.ts` holds them to.
1834
+ */
1835
+ export declare const MEDIAHUB_UI_NS = "mediahub-ui";
1836
+
1001
1837
  /**
1002
1838
  * @knkcs/mediahub-ui — reusable mediahub asset-management surfaces.
1003
1839
  *
@@ -1048,6 +1884,23 @@ export declare interface MediahubProviderProps {
1048
1884
  children: ReactNode;
1049
1885
  }
1050
1886
 
1887
+ /**
1888
+ * The asset type's fieldkit metadata schema, edited on a page with room for it
1889
+ * (spec knkCS/mediahub#138, story 7) rather than as a JSON textarea.
1890
+ */
1891
+ export declare const MetadataSchemaEditor: default_2.FC<MetadataSchemaEditorProps>;
1892
+
1893
+ export declare interface MetadataSchemaEditorProps {
1894
+ typeId: string;
1895
+ /**
1896
+ * The committed schema — SpecEditor's baseline. Content-equal re-parses on
1897
+ * background refetches are ignored by the editor's stability contract.
1898
+ */
1899
+ initialSchema: Schema;
1900
+ /** Wire into the screen's unsaved-changes tab guard. */
1901
+ onDirtyChange?: (dirty: boolean) => void;
1902
+ }
1903
+
1051
1904
  /**
1052
1905
  * Destination folder picker for moving a folder or an asset. Destinations
1053
1906
  * that would trip the server's leak guard (moving exposed content into a
@@ -1067,14 +1920,6 @@ export declare interface MoveDialogProps {
1067
1920
  /** Called after a successful move with the destination folder id
1068
1921
  * ("" = workspace root). */
1069
1922
  onMoved?: (destinationId: string) => void;
1070
- headerLabel?: string;
1071
- confirmLabel?: string;
1072
- cancelLabel?: string;
1073
- rootLabel?: string;
1074
- currentLocationLabel?: string;
1075
- selfLocationLabel?: string;
1076
- /** Reason shown on leak-guarded destinations. */
1077
- blockedLabel?: string;
1078
1923
  }
1079
1924
 
1080
1925
  /** What the dialog moves: a folder (from the tree's context menu) or an
@@ -1095,6 +1940,14 @@ export declare interface Page<T> {
1095
1940
  totalPages: number;
1096
1941
  }
1097
1942
 
1943
+ /**
1944
+ * A comma-separated MIME type field, both directions: the asset-type create and
1945
+ * detail screens edit `AssetTypeInfo.allowedMimeTypes` (a `string[]`) as one
1946
+ * plain-text input, so both parse the same way back into the array the mutation
1947
+ * sends.
1948
+ */
1949
+ export declare const parseMimeTypeList: (value: string) => string[];
1950
+
1098
1951
  declare interface PreferencesActions {
1099
1952
  toggleSidebar: () => void;
1100
1953
  setViewMode: (mode: "list" | "grid") => void;
@@ -1113,8 +1966,9 @@ declare type ProtoResponse = {
1113
1966
 
1114
1967
  /** The shared Restricted-container warning (guardian#48): shown when creating
1115
1968
  * a Restricted folder and, with the other noun, on the collection dialog's
1116
- * Restricted switch. */
1117
- export declare function restrictedContainerWarning(kind: "folder" | "collection"): string;
1969
+ * Restricted switch. Takes `t` explicitly (rather than calling
1970
+ * `useTranslation` itself) so it stays callable from non-component code. */
1971
+ export declare function restrictedContainerWarning(kind: "folder" | "collection", t: TFunction): string;
1118
1972
 
1119
1973
  /** Deliberate-path dialog for creating a Restricted folder. The everyday
1120
1974
  * inline "New Folder" input stays the fast path for ordinary folders. */
@@ -1181,6 +2035,19 @@ declare type SelectionStore = SelectionState & SelectionActions;
1181
2035
  */
1182
2036
  export declare function showRpcErrorToast(err: unknown, fallbackTitle: string): void;
1183
2037
 
2038
+ /**
2039
+ * Convert a display name into a slug mediahub accepts: lowercase alphanumeric
2040
+ * with hyphens.
2041
+ *
2042
+ * Non-ASCII is a separator, not transliterated — "Bürgerdaten" becomes
2043
+ * "b-rgerdaten" — because the server's rule is the ASCII one and a
2044
+ * transliteration would produce a slug the user never saw derived.
2045
+ *
2046
+ * Both hosts carried their own copy of this (knkCS/mediahub#137); the package
2047
+ * owns it now so the asset-type screens share one derivation.
2048
+ */
2049
+ export declare function slugify(name: string): string;
2050
+
1184
2051
  export declare interface StatusCountInfo {
1185
2052
  statusSlug: string;
1186
2053
  name: string;
@@ -1225,7 +2092,7 @@ declare interface TagPanelProps {
1225
2092
 
1226
2093
  /** The explicit unrestrict disclosure (guardian#55): spelled out before the
1227
2094
  * toggle because it widens the audience to the whole workspace. */
1228
- export declare function unrestrictDisclosure(kind: "folder" | "collection", name: string): string;
2095
+ export declare function unrestrictDisclosure(kind: "folder" | "collection", name: string, t: TFunction): string;
1229
2096
 
1230
2097
  declare interface UploadActions {
1231
2098
  addFiles: (files: File[]) => void;