@knkcs/mediahub-ui 0.3.0 → 0.5.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/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @knkcs/mediahub-ui
2
+
3
+ Mediahub's reusable UI, published as a versioned npm package so that every host renders the same
4
+ media surfaces instead of re-implementing them.
5
+
6
+ Two hosts consume it today: knkCMS core, which embeds it as a build-time dependency, and mediahub's
7
+ own standalone app, which consumes it through the workspace.
8
+
9
+ ## Screens, not routes
10
+
11
+ A screen takes **typed paths** and emits **callbacks**; the host owns routing and draws the page
12
+ frame. No screen builds a URL, and no host builds UI a screen already owns.
13
+
14
+ That contract is the point of the package. When a host re-implements a surface instead of composing
15
+ it, the two copies diverge and bugs are fixed in one of them — see
16
+ [knkCS/mediahub#138](https://github.com/knkCS/mediahub/issues/138), which consolidated the asset-type
17
+ screens after four such bugs, and
18
+ [mediahub ADR 0008](../../docs/adr/0008-narrowing-composes-folder-collection-and-tag.md), which
19
+ removed a host-built browse switcher for the same reason.
20
+
21
+ ## What it exports
22
+
23
+ | Surface | What it is |
24
+ |---|---|
25
+ | `AssetLibrary` | The media browser: folder tree, filters, upload, and the context rail carrying Tags and Collections |
26
+ | `AssetDetail` | One asset, its versions and its metadata |
27
+ | `AssetPicker`, `CollectionPicker` | Embeddable pickers for a host's own forms |
28
+ | `AssetTypeIndex`, `AssetTypeCreate`, `AssetTypeDetail` | Asset-type administration, including the AI-processes tab |
29
+ | `CollectionIndex` | The Collections the user can see, marking the Restricted ones. Listing is not gated by authority — per [ADR 0001](../../docs/adr/0001-grant-authority-owner-or-workspace-admin.md) seeing a Collection and managing it are separate privileges |
30
+ | `CollectionCreate` | Create a Collection from a name, slug and description. **Static only** — a smart Collection's `rules` are stored and never evaluated, so no type selector and no rules editor appear ([#173](https://github.com/knkCS/mediahub/issues/173)) |
31
+ | `CollectionDetail` | One Collection's identity — name, description, delete — **and its access control**: the Restricted toggle (with the leak-guard refusal naming what it would expose) and the roster, offered only where the can-manage probe says the reader is an authority ([ADR 0001](../../docs/adr/0001-grant-authority-owner-or-workspace-admin.md): owner-on-the-Collection or admin-on-its-workspace, and grantees never see the roster). Not Curation: adding and removing assets happens in the library, where the assets are |
32
+ | `MediahubProvider` | The provider a host mounts once, holding the clients and query client |
33
+ | Clients | `createConnectMediahubClients` adapts per-service Connect clients into the domain clients the screens' hooks read, and owns the mapping — a host supplies transport only |
34
+ | Hooks and stores | The queries and mutations behind the screens, for a host composing its own view |
35
+
36
+ Everything lands at the package root (`.`). A second entry point, `./testing`, ships a stub client
37
+ and fixtures so a host can test its own composition without a server.
38
+
39
+ ## Narrowing composes
40
+
41
+ Folder, Collection and Tag narrow the library **together** — one folder, many collections, many tags.
42
+ They are not alternative modes, and a UI that makes them mutually exclusive cannot express a question
43
+ the data model permits. `AssetLibrary` accounts for what is applied with a row of dismissible filter
44
+ chips. See ADR 0008 and the `Narrowing` entry in [`CONTEXT.md`](../../CONTEXT.md).
45
+
46
+ ## Layout comes from anker
47
+
48
+ Screens use anker's templates and primitives — `IndexPageTemplate`, `DetailPageTemplate`,
49
+ `SubNavLayout`, `ContextRail` — and report their frame through anker's host contract. anker's own
50
+ guidance is explicit: if a template does not fit, file an issue rather than hand-rolling a layout.
51
+
52
+ ## Peers
53
+
54
+ Every non-trivial dependency is a **peer** the host supplies once, so a host and the package can
55
+ never load two copies of React, the query client or anker. The Rollup external list is derived from
56
+ `peerDependencies`, so declaring a peer is the whole change.
57
+
58
+ ## Releases
59
+
60
+ Versioned with release-please from conventional commits, and published to npm by CI. A commit whose
61
+ subject loses its `feat:`/`fix:` prefix — which a squash merge can do — produces no release at all,
62
+ silently ([knkCS/mediahub#185](https://github.com/knkCS/mediahub/issues/185)).
package/dist/index.d.ts CHANGED
@@ -13,6 +13,46 @@ import { UseMutateFunction } from '@tanstack/react-query';
13
13
  import { UseMutationResult } from '@tanstack/react-query';
14
14
  import { UseQueryResult } from '@tanstack/react-query';
15
15
 
16
+ /** One narrowing currently applied to the library. */
17
+ export declare interface ActiveFilterChip {
18
+ /** Stable identity for the row — never rendered. */
19
+ id: string;
20
+ /**
21
+ * What the chip says, already translated and already resolved to a name.
22
+ * A chip never carries a raw id: the caller resolves Folder, Collection
23
+ * and Tag through the data the panels load, and falls back to the kind's
24
+ * own word when a row cannot be resolved.
25
+ */
26
+ label: string;
27
+ /** Removes exactly this filter, leaving the others applied. */
28
+ onRemove: () => void;
29
+ }
30
+
31
+ /**
32
+ * The library's account of what is narrowing it (ADR 0008).
33
+ *
34
+ * Presentation only: it owns no filter state and resolves no names — it
35
+ * renders the chips it is handed and reports the dismissals, so the caller's
36
+ * single filter state stays the one source the panels also write.
37
+ *
38
+ * With nothing applied it renders `null` rather than an empty band, so the
39
+ * row costs no vertical space until there is something to account for.
40
+ *
41
+ * Each chip is anker's `Toolbar.FilterChip`, a native button — reachable by
42
+ * Tab and activated by Enter or Space with no key handling of our own.
43
+ */
44
+ export declare const ActiveFilterChips: React.FC<ActiveFilterChipsProps>;
45
+
46
+ export declare interface ActiveFilterChipsProps {
47
+ chips: ActiveFilterChip[];
48
+ onClearAll: () => void;
49
+ /** Names the group for assistive technology, e.g. "Active filters". */
50
+ groupLabel: string;
51
+ /** Said before each chip's label, so the button announces what it does. */
52
+ removeLabel: string;
53
+ clearAllLabel: string;
54
+ }
55
+
16
56
  export declare interface AddVersionVars {
17
57
  assetId: string;
18
58
  file: File;
@@ -94,6 +134,47 @@ export declare interface AIProcessClient {
94
134
  delete(id: string): Promise<void>;
95
135
  }
96
136
 
137
+ /**
138
+ * The AI-Processes tab of the packaged asset-type detail screen: the processes
139
+ * an asset type runs when an asset is analyzed, in order — listed, reordered,
140
+ * enabled/disabled, deleted, created and edited (knkCS/mediahub#157).
141
+ *
142
+ * No routing of its own: where a host's AI-connection settings live is the
143
+ * host's URL, so the "no connections" hint is text, not a link.
144
+ */
145
+ export declare function AIProcessesTab({ typeId, metadataSchema, }: AIProcessesTabProps): React.JSX.Element;
146
+
147
+ export declare namespace AIProcessesTab {
148
+ var displayName: string;
149
+ }
150
+
151
+ export declare interface AIProcessesTabProps {
152
+ /** The asset type whose processes are listed. */
153
+ typeId: string;
154
+ /** The asset type's metadata schema, source of the metadata output targets. */
155
+ metadataSchema: string | undefined;
156
+ }
157
+
158
+ /**
159
+ * Create or edit one AI process for an asset type. Packaged from the
160
+ * standalone's host-local dialog (knkCS/mediahub#157) — same behaviour, same
161
+ * mount semantics, strings under the package's i18n namespace.
162
+ */
163
+ export declare function AIProcessFormDialog({ open, onClose, assetTypeId, metadataAccessors, editProcess, }: AIProcessFormDialogProps): React.JSX.Element;
164
+
165
+ export declare namespace AIProcessFormDialog {
166
+ var displayName: string;
167
+ }
168
+
169
+ export declare interface AIProcessFormDialogProps {
170
+ open: boolean;
171
+ onClose: () => void;
172
+ assetTypeId: string;
173
+ metadataAccessors: MetadataAccessorOption[];
174
+ /** If provided, the dialog opens in edit mode for this process. */
175
+ editProcess?: AIProcessInfo;
176
+ }
177
+
97
178
  export declare interface AIProcessInfo {
98
179
  id: string;
99
180
  workspaceId: string;
@@ -523,6 +604,146 @@ export declare interface CollectionClient {
523
604
  setRestricted(id: string, restricted: boolean): Promise<CollectionInfo>;
524
605
  }
525
606
 
607
+ /**
608
+ * Create a Collection. The package owns the screen; both hosts compose it and
609
+ * keep their routing to themselves (#176, parent #174).
610
+ *
611
+ * **Static Collections only.** There is deliberately no Smart/Static selector
612
+ * and no `rules` editor, though the standalone app's form dialog offered both.
613
+ * A smart Collection's `rules` are validated as JSON, stored and returned —
614
+ * and never evaluated anywhere; membership resolves exclusively through
615
+ * explicit edges. The control would therefore do nothing at all, and this
616
+ * project does not ship a known-inert control into a second host
617
+ * (knkCS/mediahub#173). Every Collection created here is `static` with empty
618
+ * rules.
619
+ *
620
+ * The slug follows the name until it is edited by hand and then stops, and the
621
+ * server's rule (lowercase alphanumeric with hyphens, at least two characters)
622
+ * is both stated on the form and enforced before submit — without both, a name
623
+ * like `Bild Anhang` produced a bare 400 (knkcms/core#861).
624
+ */
625
+ export declare function CollectionCreate({ collectionsPath, onCreated, onCancel, }: CollectionCreateProps): default_2.JSX.Element;
626
+
627
+ export declare namespace CollectionCreate {
628
+ var displayName: string;
629
+ }
630
+
631
+ export declare interface CollectionCreateProps {
632
+ /**
633
+ * The host's Collection index path — the breadcrumb's target. A path, not a
634
+ * route: the screen never navigates, it only says where the list it belongs
635
+ * to lives (core's `docs/service-integration.md`; spec #174).
636
+ */
637
+ collectionsPath: string;
638
+ /**
639
+ * The Collection was created; the host receives its id and decides where to
640
+ * go. Id only, like `CollectionIndex`'s `onOpen` — the host needs it to
641
+ * build a detail URL, and nothing here knows what that URL looks like.
642
+ */
643
+ onCreated?: (collectionId: string) => void;
644
+ /** Called when the administrator abandons the form. */
645
+ onCancel?: () => void;
646
+ }
647
+
648
+ /**
649
+ * The packaged collection detail screen: view one Collection, correct its name
650
+ * and description, delete it behind a confirmation, and — for an authority —
651
+ * decide who may see it.
652
+ *
653
+ * **Authority, per ADR 0001**, is owner-on-the-Collection *or* admin-on-its-
654
+ * workspace, and the package already answers it: `useCanManage` probes it by
655
+ * attempting the roster read the server gates on exactly that authority. Only
656
+ * `data === true` unlocks anything — a pending probe, a denial and a failure
657
+ * all render the same screen without management controls (fail closed).
658
+ *
659
+ * **A denial is an answer, not a failure.** `canManage` reads Connect's
660
+ * *numeric* code 7 as "not an authority" and returns false. A host transport
661
+ * that flattens errors to a bare message (core's did until
662
+ * knkboor/general#814) turns that answer into a rejection — which this screen
663
+ * survives, because a rejected probe is not `true` either, so the controls
664
+ * stay hidden instead of the screen breaking for the users with least access.
665
+ * Both shapes are pinned by test.
666
+ *
667
+ * **Grantees never see the roster** (ADR 0001 again): content access and
668
+ * roster access are separate privileges, so a viewer gets the Collection's
669
+ * identity and no Manage Access affordance at all — the roster is never
670
+ * fetched for them, not merely hidden after the fact. Authority withdrawn
671
+ * *mid-session* takes the controls away at once and closes an open dialog
672
+ * through its `open` prop — the machine itself stays mounted, because
673
+ * unmounting a dialog while it is open leaks the body scroll lock over the
674
+ * whole application (CLAUDE-ANKER's Modal mount pattern). The Restricted state
675
+ * itself is on the record they already read and is shown to everyone, as the
676
+ * index and the folder tree show it.
677
+ *
678
+ * **Curation** — adding and removing assets — is not this screen's job: per
679
+ * ADR 0003 it happens in the library, where the assets are.
680
+ *
681
+ * **The patch is the whole record this screen owns, every time.**
682
+ * `UpdateCollectionRequest` carries plain proto3 scalars and the service applies
683
+ * `description` unconditionally, so a patch naming only `name` clears the
684
+ * description (knkCS/mediahub#159, the same trap as knkcms/core#863). Saving
685
+ * therefore sends both fields, and deliberately does *not* name `rules` — the
686
+ * smart-collection field this surface does not edit (knkCS/mediahub#173) — so
687
+ * the client's read-modify-write keeps whatever is stored there.
688
+ *
689
+ * **Correct against the wire, not against the declared type.** Connect omits
690
+ * empty strings from its JSON, so a description-less collection arrives with
691
+ * the key absent. Every field is defaulted where it is read, so an absent value
692
+ * renders as empty rather than flipping a controlled input to uncontrolled.
693
+ */
694
+ export declare function CollectionDetail({ collectionId, collectionsPath, onBack, onDeleted, }: CollectionDetailProps): default_2.JSX.Element;
695
+
696
+ export declare namespace CollectionDetail {
697
+ var displayName: string;
698
+ }
699
+
700
+ export declare interface CollectionDetailProps {
701
+ /** The collection to show. */
702
+ collectionId: string;
703
+ /**
704
+ * Typed path of the host's collection index, used for the breadcrumb back
705
+ * link. The screen never routes itself — the host owns its URLs
706
+ * (core's `docs/service-integration.md`).
707
+ */
708
+ collectionsPath?: string;
709
+ /**
710
+ * Navigate back to the collection index. Given one, the screen renders a
711
+ * back affordance that confirms before discarding unsaved edits — the
712
+ * breadcrumb link above is the host's own navigation and the screen cannot
713
+ * intercept it.
714
+ */
715
+ onBack?: () => void;
716
+ /** Called after a successful delete; the host decides where to go next. */
717
+ onDeleted?: () => void;
718
+ }
719
+
720
+ /**
721
+ * The workspace's Collections, listed. The package owns the screen; both hosts
722
+ * compose it and keep their own routing to themselves (#175, parent #174).
723
+ *
724
+ * Listing is deliberately NOT gated by authority: a Collection the user can see
725
+ * is listed, because per ADR 0001 seeing a Collection and managing it are
726
+ * separate privileges. Management controls arrive in later tickets and are
727
+ * gated there, on the can-manage probe — never here, on the listing.
728
+ */
729
+ export declare function CollectionIndex(props: CollectionIndexProps): React.JSX.Element;
730
+
731
+ export declare namespace CollectionIndex {
732
+ var displayName: string;
733
+ }
734
+
735
+ export declare interface CollectionIndexProps {
736
+ /**
737
+ * A collection was opened. The host decides what that means — it receives
738
+ * the id and nothing else, because this package must not know either host's
739
+ * URL structure (core's `docs/service-integration.md`; spec #138, #174).
740
+ * Screens, not routes: nothing here navigates and nothing here builds a path.
741
+ */
742
+ onOpen?: (collectionId: string) => void;
743
+ /** The reader asked for a new collection. Same contract as `onOpen`. */
744
+ onCreate?: () => void;
745
+ }
746
+
526
747
  export declare interface CollectionInfo {
527
748
  id: string;
528
749
  workspaceId: string;
@@ -1057,6 +1278,7 @@ export declare const i18nResources: {
1057
1278
  backButtonAria: string;
1058
1279
  generalTab: string;
1059
1280
  metadataTab: string;
1281
+ aiProcessesTab: string;
1060
1282
  nameLabel: string;
1061
1283
  nameRequired: string;
1062
1284
  slugLabel: string;
@@ -1082,6 +1304,41 @@ export declare const i18nResources: {
1082
1304
  discardConfirmMessage: string;
1083
1305
  discardConfirmLabel: string;
1084
1306
  };
1307
+ collectionDetail: {
1308
+ breadcrumbCollections: string;
1309
+ notFound: string;
1310
+ untitled: string;
1311
+ backButtonAria: string;
1312
+ nameLabel: string;
1313
+ nameRequired: string;
1314
+ slugLabel: string;
1315
+ descriptionLabel: string;
1316
+ descriptionPlaceholder: string;
1317
+ save: string;
1318
+ delete: string;
1319
+ saveSuccessToast: string;
1320
+ saveFailedToast: string;
1321
+ deleteConfirmTitle: string;
1322
+ deleteConfirmMessage: string;
1323
+ deleteConfirmLabel: string;
1324
+ deleteSuccessToast: string;
1325
+ deleteFailedToast: string;
1326
+ discardConfirmTitle: string;
1327
+ discardConfirmMessage: string;
1328
+ discardConfirmLabel: string;
1329
+ accessHeading: string;
1330
+ accessOpenNote: string;
1331
+ accessRestrictedNote: string;
1332
+ restrict: string;
1333
+ unrestrict: string;
1334
+ manageAccess: string;
1335
+ unrestrictConfirmTitle: string;
1336
+ unrestrictConfirmLabel: string;
1337
+ restrictSuccessToast: string;
1338
+ unrestrictSuccessToast: string;
1339
+ restrictFailedToast: string;
1340
+ unrestrictFailedToast: string;
1341
+ };
1085
1342
  assetLibrary: {
1086
1343
  pageTitle: string;
1087
1344
  uploadButton: string;
@@ -1116,6 +1373,20 @@ export declare const i18nResources: {
1116
1373
  clearStatusGroup: string;
1117
1374
  assetsLoadFailedHeader: string;
1118
1375
  noAssetsFound: string;
1376
+ activeFiltersLabel: string;
1377
+ removeFilter: string;
1378
+ clearAllFilters: string;
1379
+ chipFolder: string;
1380
+ chipFolderUnresolved: string;
1381
+ chipCollection: string;
1382
+ chipCollectionUnresolved: string;
1383
+ chipTag: string;
1384
+ chipTagUnresolved: string;
1385
+ chipStatus: string;
1386
+ chipStatusGroup: string;
1387
+ chipSearch: string;
1388
+ noAssetsMatchFilters: string;
1389
+ noAssetsMatchFiltersDescription: string;
1119
1390
  };
1120
1391
  assetPicker: {
1121
1392
  headerSingle: string;
@@ -1359,6 +1630,92 @@ export declare const i18nResources: {
1359
1630
  noMatchesDescription: string;
1360
1631
  loadFailedHeader: string;
1361
1632
  };
1633
+ collectionCreate: {
1634
+ title: string;
1635
+ breadcrumbCollections: string;
1636
+ nameLabel: string;
1637
+ namePlaceholder: string;
1638
+ nameRequired: string;
1639
+ slugLabel: string;
1640
+ slugHint: string;
1641
+ slugInvalid: string;
1642
+ descriptionLabel: string;
1643
+ descriptionPlaceholder: string;
1644
+ submit: string;
1645
+ cancel: string;
1646
+ createdToast: string;
1647
+ createFailedToast: string;
1648
+ };
1649
+ collectionIndex: {
1650
+ pageTitle: string;
1651
+ pageSubtitle: string;
1652
+ newButton: string;
1653
+ searchPlaceholder: string;
1654
+ collectionsCount: string;
1655
+ columnName: string;
1656
+ columnDescription: string;
1657
+ noCollectionsHeader: string;
1658
+ noCollectionsDescription: string;
1659
+ noMatchesHeader: string;
1660
+ noMatchesDescription: string;
1661
+ loadFailedHeader: string;
1662
+ };
1663
+ aiProcesses: {
1664
+ intro: string;
1665
+ newProcess: string;
1666
+ noConnectionsHint: string;
1667
+ empty: string;
1668
+ outputCount_one: string;
1669
+ outputCount_other: string;
1670
+ active: string;
1671
+ inactive: string;
1672
+ enableAria: string;
1673
+ disableAria: string;
1674
+ moveUpAria: string;
1675
+ moveDownAria: string;
1676
+ editAria: string;
1677
+ deleteAria: string;
1678
+ deleteConfirmTitle: string;
1679
+ deleteConfirmMessage: string;
1680
+ deleteConfirmLabel: string;
1681
+ deletedToast: string;
1682
+ deleteFailedToast: string;
1683
+ updateFailedToast: string;
1684
+ reorderFailedToast: string;
1685
+ };
1686
+ aiProcessDialog: {
1687
+ createHeader: string;
1688
+ editHeader: string;
1689
+ createLabel: string;
1690
+ saveLabel: string;
1691
+ nameLabel: string;
1692
+ namePlaceholder: string;
1693
+ nameRequired: string;
1694
+ connectionLabel: string;
1695
+ connectionPlaceholder: string;
1696
+ connectionRequired: string;
1697
+ promptLabel: string;
1698
+ promptPlaceholder: string;
1699
+ promptRequired: string;
1700
+ outputsLabel: string;
1701
+ outputKeyLabel: string;
1702
+ outputKeyPlaceholder: string;
1703
+ outputKeyRequired: string;
1704
+ outputRequired: string;
1705
+ addOutput: string;
1706
+ removeOutputAria: string;
1707
+ targetLabel: string;
1708
+ targetDescription: string;
1709
+ targetTags: string;
1710
+ targetMetadata: string;
1711
+ metadataFieldLabel: string;
1712
+ metadataFieldPlaceholder: string;
1713
+ metadataFieldRequired: string;
1714
+ createdToast: string;
1715
+ createFailedToast: string;
1716
+ updatedToast: string;
1717
+ updateFailedToast: string;
1718
+ };
1362
1719
  };
1363
1720
  };
1364
1721
  de: {
@@ -1428,6 +1785,7 @@ export declare const i18nResources: {
1428
1785
  backButtonAria: string;
1429
1786
  generalTab: string;
1430
1787
  metadataTab: string;
1788
+ aiProcessesTab: string;
1431
1789
  nameLabel: string;
1432
1790
  nameRequired: string;
1433
1791
  slugLabel: string;
@@ -1453,6 +1811,41 @@ export declare const i18nResources: {
1453
1811
  discardConfirmMessage: string;
1454
1812
  discardConfirmLabel: string;
1455
1813
  };
1814
+ collectionDetail: {
1815
+ breadcrumbCollections: string;
1816
+ notFound: string;
1817
+ untitled: string;
1818
+ backButtonAria: string;
1819
+ nameLabel: string;
1820
+ nameRequired: string;
1821
+ slugLabel: string;
1822
+ descriptionLabel: string;
1823
+ descriptionPlaceholder: string;
1824
+ save: string;
1825
+ delete: string;
1826
+ saveSuccessToast: string;
1827
+ saveFailedToast: string;
1828
+ deleteConfirmTitle: string;
1829
+ deleteConfirmMessage: string;
1830
+ deleteConfirmLabel: string;
1831
+ deleteSuccessToast: string;
1832
+ deleteFailedToast: string;
1833
+ discardConfirmTitle: string;
1834
+ discardConfirmMessage: string;
1835
+ discardConfirmLabel: string;
1836
+ accessHeading: string;
1837
+ accessOpenNote: string;
1838
+ accessRestrictedNote: string;
1839
+ restrict: string;
1840
+ unrestrict: string;
1841
+ manageAccess: string;
1842
+ unrestrictConfirmTitle: string;
1843
+ unrestrictConfirmLabel: string;
1844
+ restrictSuccessToast: string;
1845
+ unrestrictSuccessToast: string;
1846
+ restrictFailedToast: string;
1847
+ unrestrictFailedToast: string;
1848
+ };
1456
1849
  assetLibrary: {
1457
1850
  pageTitle: string;
1458
1851
  uploadButton: string;
@@ -1487,6 +1880,20 @@ export declare const i18nResources: {
1487
1880
  clearStatusGroup: string;
1488
1881
  assetsLoadFailedHeader: string;
1489
1882
  noAssetsFound: string;
1883
+ activeFiltersLabel: string;
1884
+ removeFilter: string;
1885
+ clearAllFilters: string;
1886
+ chipFolder: string;
1887
+ chipFolderUnresolved: string;
1888
+ chipCollection: string;
1889
+ chipCollectionUnresolved: string;
1890
+ chipTag: string;
1891
+ chipTagUnresolved: string;
1892
+ chipStatus: string;
1893
+ chipStatusGroup: string;
1894
+ chipSearch: string;
1895
+ noAssetsMatchFilters: string;
1896
+ noAssetsMatchFiltersDescription: string;
1490
1897
  };
1491
1898
  assetPicker: {
1492
1899
  headerSingle: string;
@@ -1730,6 +2137,92 @@ export declare const i18nResources: {
1730
2137
  noMatchesDescription: string;
1731
2138
  loadFailedHeader: string;
1732
2139
  };
2140
+ collectionCreate: {
2141
+ title: string;
2142
+ breadcrumbCollections: string;
2143
+ nameLabel: string;
2144
+ namePlaceholder: string;
2145
+ nameRequired: string;
2146
+ slugLabel: string;
2147
+ slugHint: string;
2148
+ slugInvalid: string;
2149
+ descriptionLabel: string;
2150
+ descriptionPlaceholder: string;
2151
+ submit: string;
2152
+ cancel: string;
2153
+ createdToast: string;
2154
+ createFailedToast: string;
2155
+ };
2156
+ collectionIndex: {
2157
+ pageTitle: string;
2158
+ pageSubtitle: string;
2159
+ newButton: string;
2160
+ searchPlaceholder: string;
2161
+ collectionsCount: string;
2162
+ columnName: string;
2163
+ columnDescription: string;
2164
+ noCollectionsHeader: string;
2165
+ noCollectionsDescription: string;
2166
+ noMatchesHeader: string;
2167
+ noMatchesDescription: string;
2168
+ loadFailedHeader: string;
2169
+ };
2170
+ aiProcesses: {
2171
+ intro: string;
2172
+ newProcess: string;
2173
+ noConnectionsHint: string;
2174
+ empty: string;
2175
+ outputCount_one: string;
2176
+ outputCount_other: string;
2177
+ active: string;
2178
+ inactive: string;
2179
+ enableAria: string;
2180
+ disableAria: string;
2181
+ moveUpAria: string;
2182
+ moveDownAria: string;
2183
+ editAria: string;
2184
+ deleteAria: string;
2185
+ deleteConfirmTitle: string;
2186
+ deleteConfirmMessage: string;
2187
+ deleteConfirmLabel: string;
2188
+ deletedToast: string;
2189
+ deleteFailedToast: string;
2190
+ updateFailedToast: string;
2191
+ reorderFailedToast: string;
2192
+ };
2193
+ aiProcessDialog: {
2194
+ createHeader: string;
2195
+ editHeader: string;
2196
+ createLabel: string;
2197
+ saveLabel: string;
2198
+ nameLabel: string;
2199
+ namePlaceholder: string;
2200
+ nameRequired: string;
2201
+ connectionLabel: string;
2202
+ connectionPlaceholder: string;
2203
+ connectionRequired: string;
2204
+ promptLabel: string;
2205
+ promptPlaceholder: string;
2206
+ promptRequired: string;
2207
+ outputsLabel: string;
2208
+ outputKeyLabel: string;
2209
+ outputKeyPlaceholder: string;
2210
+ outputKeyRequired: string;
2211
+ outputRequired: string;
2212
+ addOutput: string;
2213
+ removeOutputAria: string;
2214
+ targetLabel: string;
2215
+ targetDescription: string;
2216
+ targetTags: string;
2217
+ targetMetadata: string;
2218
+ metadataFieldLabel: string;
2219
+ metadataFieldPlaceholder: string;
2220
+ metadataFieldRequired: string;
2221
+ createdToast: string;
2222
+ createFailedToast: string;
2223
+ updatedToast: string;
2224
+ updateFailedToast: string;
2225
+ };
1733
2226
  };
1734
2227
  };
1735
2228
  };
@@ -1884,6 +2377,11 @@ export declare interface MediahubProviderProps {
1884
2377
  children: ReactNode;
1885
2378
  }
1886
2379
 
2380
+ export declare interface MetadataAccessorOption {
2381
+ label: string;
2382
+ value: string;
2383
+ }
2384
+
1887
2385
  /**
1888
2386
  * The asset type's fieldkit metadata schema, edited on a page with room for it
1889
2387
  * (spec knkCS/mediahub#138, story 7) rather than as a JSON textarea.