@datocms/product-scenes 0.1.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/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import React, { ComponentProps, FunctionComponent, ReactElement, ReactNode } from "react";
1
+ import React, { ComponentProps, FunctionComponent, ReactElement, ReactNode, SyntheticEvent } from "react";
2
2
  //#region ../../node_modules/@floating-ui/utils/dist/floating-ui.utils.d.mts
3
3
  declare type AlignedPlacement = `${Side}-${Alignment}`;
4
4
  declare type Alignment = 'start' | 'end';
@@ -6,11 +6,11 @@ declare type Placement = Prettify<Side | AlignedPlacement>;
6
6
  declare type Prettify<T> = { [K in keyof T]: T[K]; } & {};
7
7
  declare type Side = 'top' | 'right' | 'bottom' | 'left';
8
8
  //#endregion
9
- //#region ../ui/src/Message.d.ts
9
+ //#region ../ui-public/src/Message.d.ts
10
10
  /**
11
11
  * A translation key with its values, for example `{ id: 'button.save' }`.
12
12
  * The texts adapter of the host gives the text of the key: the resources of
13
- * i18next in the apps, the texts of ui and the `texts` map in
13
+ * i18next in the apps, the texts of ui-public and the `texts` map in
14
14
  * `BundledTexts`. See the "Texts provider" docs page.
15
15
  */
16
16
  type IntlMessage = {
@@ -34,7 +34,7 @@ type Message = string | ReactElement | IntlMessage | HtmlMessage;
34
34
  */
35
35
  type TextMessage = string | IntlMessage;
36
36
  //#endregion
37
- //#region ../ui/src/utils/types.d.ts
37
+ //#region ../ui-public/src/utils/types.d.ts
38
38
  /**
39
39
  * Type for SVG icons imported via vite-plugin-svgr.
40
40
  * Matches the type from vite-plugin-svgr/client.d.ts
@@ -46,7 +46,7 @@ type SvgIcon = FunctionComponent<ComponentProps<'svg'> & {
46
46
  descId?: string;
47
47
  }>;
48
48
  //#endregion
49
- //#region ../ui/src/actions/disabledReason.d.ts
49
+ //#region ../ui-public/src/actions/disabledReason.d.ts
50
50
  /**
51
51
  * A disabled control that tells why. It keeps the focus and the hover
52
52
  * ("aria-disabled" in place of "disabled"), thus its tooltip shows the
@@ -61,7 +61,7 @@ type DisabledWithReason = {
61
61
  /** Give a reason when the user must know why the control is disabled */
62
62
  type Disabled = boolean | DisabledWithReason;
63
63
  //#endregion
64
- //#region ../ui/src/actions/Button.d.ts
64
+ //#region ../ui-public/src/actions/Button.d.ts
65
65
  /**
66
66
  * "overlay" and "on-primary" are for a colored bar (the navigation bar, a
67
67
  * floating bar): "overlay" has a light translucent fill, "on-primary" has a
@@ -85,7 +85,7 @@ type WithLabel = {
85
85
  tooltip?: ActionTooltipOptions;
86
86
  };
87
87
  /**
88
- * The name and the keys of an action of the registry (`ui/Actions`), in
88
+ * The name and the keys of an action of the registry (`ui-public/Actions`), in
89
89
  * the tooltip. An icon-only button shows its label in place of the name.
90
90
  * When the action has no keys or does not exist, the tooltip has no keys:
91
91
  * an icon-only button shows its label, and a button with a label shows no
@@ -141,7 +141,10 @@ type ButtonElementState = {
141
141
  * "onClick" that returns a promise sets it automatically.
142
142
  */
143
143
  busy?: boolean;
144
- /** The state of a toggle button (for example the filter toggle) */
144
+ /**
145
+ * The state of a toggle button (for example the filter toggle). Only the
146
+ * soft and the ghost tones show it: a toggle is never the main action.
147
+ */
145
148
  pressed?: boolean;
146
149
  };
147
150
  /** A link has no busy or pressed state */
@@ -232,7 +235,75 @@ type ButtonProps = {
232
235
  */
233
236
  declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLElement>>;
234
237
  //#endregion
235
- //#region ../ui/src/lists/InfoList.d.ts
238
+ //#region ../ui-public/src/lists/InfoList/Value.d.ts
239
+ type InfoListValueProps = {
240
+ /** The value, for example the file name of an asset */
241
+ label: Message;
242
+ };
243
+ type InfoListValueTriggerProps = {
244
+ /** The value, for example the collection of an asset */
245
+ label: Message;
246
+ /** The menu is open. Dropdown gives it. */
247
+ open: boolean;
248
+ /** Opens or closes the menu. Dropdown gives it. */
249
+ onTrigger: (event: SyntheticEvent) => void;
250
+ };
251
+ //#endregion
252
+ //#region ../ui-public/src/content/Avatar.d.ts
253
+ /** The image of the avatar: a URL, or the Gravatar image of the email */
254
+ type AvatarImage =
255
+ /** An image URL */
256
+ {
257
+ /**
258
+ * The URL of the image. When it is missing or when it does not load,
259
+ * the avatar shows the initials of the name.
260
+ */
261
+ imageUrl?: string | null;
262
+ gravatar?: never;
263
+ } |
264
+ /** The Gravatar image of the email */
265
+ {
266
+ /**
267
+ * Shows the Gravatar image of the email, with two image pixels for
268
+ * each CSS pixel. When the email has no Gravatar image or when there is
269
+ * no email, the avatar shows the initials of the name.
270
+ */
271
+ gravatar: true;
272
+ imageUrl?: never;
273
+ };
274
+ /** The person of the avatar: the name, the email and the image */
275
+ type AvatarIdentity = AvatarImage & {
276
+ /** The name of the person, for example "Jane Doe". It gives the initials. */
277
+ name: string | null | undefined;
278
+ /** Picks the color of the initials. Falls back to the name when missing. */
279
+ email?: string | null;
280
+ };
281
+ //#endregion
282
+ //#region ../ui-public/src/lists/InfoList/User.d.ts
283
+ /** The user to show: the name, the email and the image of the avatar */
284
+ type InfoListUserData = AvatarIdentity;
285
+ type InfoListUserProps = {
286
+ user: InfoListUserData;
287
+ /**
288
+ * A text about the user, for example the type of the user. It goes in a
289
+ * tooltip at the left, thus the text does not wrap in a narrow column.
290
+ * Without it, there is no tooltip.
291
+ */
292
+ tooltip?: Message;
293
+ };
294
+ type InfoListUserTriggerProps = InfoListUserProps & {
295
+ /** The menu is open. Dropdown gives it. */
296
+ open: boolean;
297
+ /** Opens or closes the menu. Dropdown gives it. */
298
+ onTrigger: (event: SyntheticEvent) => void;
299
+ /**
300
+ * The pointer or the keyboard focus is on the trigger: the user will
301
+ * possibly open the menu. Use it to start to load the options of the menu.
302
+ */
303
+ onIntent?: () => void;
304
+ };
305
+ //#endregion
306
+ //#region ../ui-public/src/lists/InfoList/index.d.ts
236
307
  type InfoListProps = {
237
308
  className?: string;
238
309
  /** The rows (InfoList.Row) and the groups (InfoList.Group) */
@@ -265,6 +336,8 @@ declare function Group({ title, children }: InfoListGroupProps): React.JSX.Eleme
265
336
  * A list of facts about an element: one row for each fact, with its title
266
337
  * and its value. Use InfoList.Row for a row and InfoList.Group for rows
267
338
  * with a title. It renders a real description list (dl, dt and dd).
339
+ * InfoList.Value and InfoList.User are values for a row, with a variant that
340
+ * opens a menu.
268
341
  *
269
342
  * Use an InfoList for facts to read. For things that the user acts on (a
270
343
  * rule, a webhook), use CardList.
@@ -274,9 +347,19 @@ declare const InfoList: React.NamedExoticComponent<InfoListProps> & {
274
347
  } & {
275
348
  Row: React.MemoExoticComponent<typeof Row>;
276
349
  Group: React.MemoExoticComponent<typeof Group>;
350
+ Value: React.NamedExoticComponent<InfoListValueProps> & {
351
+ readonly type: ({ label }: InfoListValueProps) => React.JSX.Element;
352
+ } & {
353
+ Trigger: React.MemoExoticComponent<({ label, open, onTrigger }: InfoListValueTriggerProps) => React.JSX.Element>;
354
+ };
355
+ User: React.NamedExoticComponent<InfoListUserProps> & {
356
+ readonly type: ({ user, tooltip }: InfoListUserProps) => React.JSX.Element;
357
+ } & {
358
+ Trigger: React.MemoExoticComponent<({ user, tooltip, open, onTrigger, onIntent }: InfoListUserTriggerProps) => React.JSX.Element>;
359
+ };
277
360
  };
278
361
  //#endregion
279
- //#region ../ui/src/content/Pill.d.ts
362
+ //#region ../ui-public/src/content/Pill.d.ts
280
363
  /** The color of a pill */
281
364
  type PillTone = 'neutral' | 'accent' | 'soft' | 'danger' | 'warning' | 'success';
282
365
  /** A pill that opens a page. It is a link. */
@@ -322,337 +405,3313 @@ type PillProps = {
322
405
  declare function Pill({ tone, icon, tooltip, children, to, onClick }: PillProps): React.JSX.Element;
323
406
  declare const _default: React.MemoExoticComponent<typeof Pill>;
324
407
  //#endregion
325
- //#region src/parts/ContentSidebar/ContentSidebar.d.ts
326
- /** A folder of the menu */
327
- type ContentSidebarFolder = {
328
- kind: 'folder';
329
- /** A key that is unique in the menu */
330
- id: string;
331
- /** The name of the folder. An emoji at the start becomes the icon. */
332
- name: string;
408
+ //#region src/kit/recordStatus.d.ts
409
+ /** The publishing status of a record, with the names of the cms */
410
+ type RecordStatus = 'draft' | 'updated' | 'published';
411
+ //#endregion
412
+ //#region ../ui-static/src/content/fieldTypeGroups.d.ts
413
+ /** The `field_type` of a field in the CMA */
414
+ type FieldType = 'boolean' | 'color' | 'date' | 'date_time' | 'file' | 'float' | 'gallery' | 'integer' | 'json' | 'lat_lon' | 'link' | 'links' | 'rich_text' | 'seo' | 'single_block' | 'slug' | 'string' | 'structured_text' | 'text' | 'video';
415
+ //#endregion
416
+ //#region src/Stage/Stage.d.ts
417
+ /** The hue of the default theme of the cms */
418
+ export declare const DEFAULT_HUE = 290;
419
+ type ColorScheme = 'light' | 'dark';
420
+ /**
421
+ * The scheme of a stage. `page` follows the page: the screen is dark when
422
+ * the root element of the page has `data-product-scenes-scheme="dark"`,
423
+ * else light. CSS changes it, thus the page needs no script for the scenes.
424
+ */
425
+ type StageScheme = ColorScheme | 'page';
426
+ /**
427
+ * The steps of an interaction that the page can play in a loop: a part of
428
+ * the kit exports them (for example `ADD_BLOCK_SEQUENCE`). The page sets
429
+ * the name of the step in `data-step` on the screen, and the CSS of the
430
+ * part shows that step. The last step is the picture without `data-step`:
431
+ * the page shows it without JS and with reduced motion.
432
+ */
433
+ type StageSequence = {
434
+ /** The steps, in order, each with its time on screen in ms */
435
+ steps: readonly {
436
+ name: string;
437
+ ms: number;
438
+ }[];
439
+ };
440
+ type StageProps = {
333
441
  /**
334
- * The folder shows its items. A closed folder shows only its chevron.
335
- * @default false
442
+ * What the scene shows, for a screen reader. The scene itself is hidden
443
+ * from assistive technology.
336
444
  */
337
- open?: boolean;
338
- /** The items in the folder. Only an open folder shows them. */
339
- items?: ContentSidebarItem[];
340
- };
341
- /** A model of the menu: it opens the records of the model */
342
- type ContentSidebarModel = {
343
- kind: 'model';
344
- /** A key that is unique in the menu */
345
- id: string;
445
+ description: string;
446
+ /** @default 'light' */
447
+ scheme?: StageScheme;
346
448
  /**
347
- * The name of the model. An emoji at the start becomes the icon, as in
348
- * the cms.
449
+ * The hue of the brand color, from 0 to 360
450
+ * @default 290
349
451
  */
350
- name: string;
452
+ hue?: number;
351
453
  /**
352
- * The model has one record. Without an emoji, the icon is the one of a
353
- * single record.
354
- * @default false
454
+ * The strength of the hue on the surfaces and the borders. It multiplies
455
+ * the chroma of the wash ramp of the cms. Use a value above 1 to make the
456
+ * hue show more, mostly in the dark scheme. The text does not get it: it
457
+ * keeps the chroma of the cms.
458
+ * @default 1
355
459
  */
356
- singleton?: boolean;
460
+ tint?: number;
357
461
  /**
358
- * The row of the page that the scene shows
462
+ * The most chroma of the brand color, in OKLCH (0 to about 0.3). It caps
463
+ * the pigment ramp of the cms: the primary buttons, the focus rings, the
464
+ * selected rows. Without it the ramp is as vivid as the gamut allows, as
465
+ * in the cms. Cap it on a page where the accent of the cms must not win
466
+ * over the page around the scene.
467
+ * @default no cap
468
+ */
469
+ chroma?: number;
470
+ /**
471
+ * The height of the screen in px, before the zoom
472
+ * @default 900
473
+ */
474
+ height?: number;
475
+ /**
476
+ * The width of the screen in px. Without it, the screen is the cms: it
477
+ * takes the width of the stage, and it is `minWidth` wide at least. With
478
+ * it, the screen is exactly this wide, and the stage is as wide as the
479
+ * screen at its zoom.
480
+ *
481
+ * Use it only for a scene without `RecordEditorLayout`: a form alone or a
482
+ * panel alone.
483
+ */
484
+ width?: number;
485
+ /**
486
+ * The smallest width of the screen of the cms in px. On a narrower stage
487
+ * the screen stays this wide, and the zoom makes it as wide as the stage.
488
+ * Not for a screen with `width`: that width is also its smallest width.
489
+ * @default 1025
490
+ */
491
+ minWidth?: number;
492
+ /**
493
+ * The zoom makes the screen smaller on a stage that is narrower than the
494
+ * smallest width of the screen. Without it, the screen keeps its zoom,
495
+ * and the page clips it.
496
+ * @default true without `width`, false with `width`
497
+ */
498
+ fit?: boolean;
499
+ /**
500
+ * For the development of the website only. When true, the screen is not
501
+ * inert and not hidden from assistive technology, and it lets the pointer
502
+ * and the selection through, thus the browser devtools can inspect it.
503
+ * Never set it in production: a screen reader reads the fake interface.
359
504
  * @default false
360
505
  */
361
- active?: boolean;
362
- /** An icon in place of the emoji or of the icon of the kind */
363
- icon?: ReactNode;
506
+ inspectable?: boolean;
507
+ /**
508
+ * The steps that the page can play. The screen gets them in
509
+ * `data-scene-steps` ("name:ms name:ms"), for the script of the page,
510
+ * and the time of each step in `--scene-step-<name>`, for the CSS of the
511
+ * part.
512
+ */
513
+ sequence?: StageSequence;
514
+ /**
515
+ * The cascade layer of the styles that the scene writes when it renders
516
+ * (react-select writes them with Emotion, in `<style data-emotion>`). Give
517
+ * the layer of `product-scenes.css`, thus the CSS of the kit beats them.
518
+ * A host without layers keeps the default: its CSS without a layer beats
519
+ * the layer, and the CSS of the kit has no layer.
520
+ * @default 'vendor'
521
+ */
522
+ cssLayer?: string;
523
+ /** The content of the screen: a scene */
524
+ children: ReactNode;
364
525
  };
365
- /** An item of the menu of the models */
366
- type ContentSidebarItem = ContentSidebarFolder | ContentSidebarModel;
367
- /** The props of `ContentSidebar` */
368
- type ContentSidebarProps = {
526
+ /**
527
+ * The frame of a product scene. The screen takes the width of the frame, as
528
+ * the cms takes the width of the window. On a frame narrower than the
529
+ * smallest width of the screen, CSS zooms the screen down. The page can
530
+ * give the zoom, the alignment, the corners and the ring of the screen
531
+ * with custom properties (see "The CSS contract of the stage" in the
532
+ * README). The content is a picture: it gets no focus, no pointer events
533
+ * and no selection.
534
+ */
535
+ export declare function Stage({ description, scheme, hue, tint, chroma, height, width, minWidth, fit, inspectable, sequence, cssLayer, children }: StageProps): React.JSX.Element;
536
+ //#endregion
537
+ //#region src/parts/AddFieldMenu/AddFieldMenu.d.ts
538
+ /**
539
+ * The steps of the menu "Add new field", for the `sequence` of `Stage`: the
540
+ * toolbar at rest, the menu open, the option under the pointer, its card.
541
+ * The card opens after 300ms on the option, as the HoverCard of the cms.
542
+ * The last step is the picture at rest.
543
+ */
544
+ export declare const ADD_FIELD_SEQUENCE: StageSequence;
545
+ /**
546
+ * The steps of the menu "Add new field" open, with the pointer that goes on
547
+ * three field types in turn, for the `sequence` of `Stage`: give
548
+ * `AddFieldMenu` the three types in `hovered`. The pointer goes on the
549
+ * second type, then the third, then the first. A card is always open: in
550
+ * the cms, when a card is open, the card of the next option opens
551
+ * immediately, without the delay of HoverCard. The last step is the picture
552
+ * at rest: the first type with its card.
553
+ */
554
+ export declare const HOVER_FIELD_TYPES_SEQUENCE: StageSequence;
555
+ /** The props of `AddFieldMenu` */
556
+ type AddFieldMenuProps = {
557
+ /** The model of the page: its name without the emoji, for example "Products" */
558
+ model: TextMessage;
559
+ /** The emoji of the model, before its name in the title */
560
+ emoji?: string;
369
561
  /**
370
- * The title of the pane
371
- * @default 'Content'
562
+ * The field type under the pointer. The option has the highlight, and its
563
+ * card opens at the left of the option, with the name and the hint of the
564
+ * type, as in the cms. Without it, the menu is open with nothing hovered.
565
+ * A list of three types is for HOVER_FIELD_TYPES_SEQUENCE: the pointer
566
+ * goes on each type in turn, and the picture at rest shows the first.
372
567
  */
373
- title?: TextMessage;
374
- /** The items at the first level of the menu */
375
- items: ContentSidebarItem[];
568
+ hovered?: FieldType | readonly FieldType[];
569
+ /**
570
+ * The content of the page, under the toolbar. The menu goes over it.
571
+ */
572
+ children?: ReactNode;
376
573
  };
377
- /** The menu of the models: the same parts as the sidebar of the cms */
378
- export declare function ContentSidebar({ title, items }: ContentSidebarProps): React.JSX.Element;
574
+ /**
575
+ * The page of a model in the schema of the cms, with the menu "Add new
576
+ * field" open: the toolbar of the page, then the menu with the search field
577
+ * and the field types in their groups, in the order of the cms. The cms
578
+ * places the menu with JS (useFloating), in a portal, under the right end
579
+ * of the button; the picture puts it there too. The menu has its full height,
580
+ * about 1350px from the top of the screen: the cms makes it scroll when the
581
+ * window is shorter, and a shorter screen cuts it at its bottom edge.
582
+ */
583
+ export declare function AddFieldMenu({ model, emoji, hovered, children }: AddFieldMenuProps): React.JSX.Element;
379
584
  //#endregion
380
- //#region src/parts/InfoAside/InfoAside.d.ts
381
- /** The publishing status of a record, with the names of the cms */
382
- type RecordStatus = 'draft' | 'updated' | 'published';
383
- /** The props of `InfoAside` */
384
- type InfoAsideProps = {
385
- /** The panels: `InfoAside.RecordInfo`, `InfoAside.Panel` and the others */
386
- children: ReactNode;
585
+ //#region ../ui-static/src/form/FocalPointInput.d.ts
586
+ /** A point of the image, as fractions (0 to 1) of its width and height */
587
+ type FocalPoint = {
588
+ x: number;
589
+ y: number;
387
590
  };
388
- /** The props of `InfoAside.Panel` */
389
- type InfoAsidePanelProps = {
390
- /** The title of the panel */
391
- title: Message;
591
+ //#endregion
592
+ //#region ../ui-public/src/color/types.d.ts
593
+ type RgbaColor = {
594
+ red: number;
595
+ green: number;
596
+ blue: number;
597
+ alpha: number;
598
+ };
599
+ //#endregion
600
+ //#region ../ui-static/src/content/UploadDetails.d.ts
601
+ type GpsLocation = {
602
+ latitude: number;
603
+ longitude: number;
604
+ };
605
+ /** The EXIF data of an image, as the API gives it */
606
+ type ExifInfo = {
607
+ model?: string;
608
+ lens_model?: string;
609
+ f_number?: number;
610
+ focal_length?: number;
611
+ exposure_time?: number;
612
+ iso?: number;
613
+ flash_mode?: number;
614
+ gps_location?: GpsLocation;
615
+ };
616
+ /**
617
+ * The technical data of an asset, with the names of the attributes of the
618
+ * API: the cms gives the attributes of the upload
619
+ */
620
+ type UploadDetailsValue = {
621
+ mime_type?: string | null;
622
+ /** The size of the file, in bytes */
623
+ size: number;
624
+ width?: number | null;
625
+ height?: number | null;
626
+ /** A video of Mux: the width and the height are the maximum resolution */
627
+ mux_playback_id?: string | null;
628
+ /** The duration of a video or an audio, in seconds */
629
+ duration?: number | null;
630
+ frame_rate?: number | null;
631
+ exif_info?: ExifInfo | null;
632
+ /** The main colors of an image */
633
+ colors?: RgbaColor[] | null;
634
+ };
635
+ type UploadDetailsProps = {
636
+ value: UploadDetailsValue;
637
+ };
638
+ //#endregion
639
+ //#region src/parts/AssetDetail/Categorization.d.ts
640
+ /** The props of `AssetDetail.Categorization` */
641
+ type AssetDetailCategorizationProps = {
642
+ author?: string;
643
+ copyright?: string;
644
+ /** The tags of the asset, that the users give */
645
+ tags?: string[];
646
+ notes?: string;
392
647
  /**
393
- * The content touches the sides of the panel, for a list of rows
648
+ * The user closed the panel: only its title shows
394
649
  * @default false
395
650
  */
396
- flush?: boolean;
397
- /** The content of the panel */
398
- children: ReactNode;
651
+ closed?: boolean;
399
652
  };
400
- /** The props of `InfoAside.Blank` */
401
- type InfoAsideBlankProps = {
402
- /** The text that tells that the panel is empty */
403
- message: Message;
653
+ /** The panel "Categorization": the author, the copyright, the tags, the notes */
654
+ declare function Categorization({ author, copyright, tags, notes, closed }: AssetDetailCategorizationProps): React.JSX.Element;
655
+ //#endregion
656
+ //#region src/parts/AssetDetail/DefaultMetadata.d.ts
657
+ /** The props of `AssetDetail.DefaultMetadata` */
658
+ type AssetDetailDefaultMetadataProps = {
659
+ /**
660
+ * The names of the locales of the project. With more than one, the panel
661
+ * has the menu of the language, as in the cms.
662
+ */
663
+ locales?: string[];
664
+ /**
665
+ * The locale of the fields, a name of `locales`
666
+ * @default the first locale
667
+ */
668
+ locale?: string;
669
+ /** The menu of the language is open */
670
+ menu?: boolean;
671
+ /** The default title of the asset, in the locale */
672
+ title?: string;
673
+ /** The default alternate text of the asset, in the locale */
674
+ alt?: string;
675
+ /** The custom data of the asset, in the locale */
676
+ customData?: {
677
+ key: string;
678
+ value: string;
679
+ }[];
680
+ /**
681
+ * The user closed the panel: only its title shows
682
+ * @default false
683
+ */
684
+ closed?: boolean;
404
685
  };
405
- /** The props of `InfoAside.RecordInfo` */
406
- type InfoAsideRecordInfoProps = {
407
- /** The ID of the record */
686
+ declare function DefaultMetadata({ locales, locale, menu, title, alt, customData, closed }: AssetDetailDefaultMetadataProps): React.JSX.Element;
687
+ //#endregion
688
+ //#region src/parts/AssetDetail/Info.d.ts
689
+ /** A row of `AssetDetail.Info` */
690
+ type AssetDetailInfoRow = 'filename' | 'id' | 'url' | 'collection' | 'createdAt' | 'updatedAt' | 'createdBy' | 'smartTags';
691
+ /** The props of `AssetDetail.Info` */
692
+ type AssetDetailInfoProps = {
693
+ /** The name of the file */
694
+ filename: string;
695
+ /** The ID of the asset */
408
696
  id: string;
409
- status: RecordStatus;
410
- /** The date of creation, as the cms formats it: "09/21/2025, 13:34" */
697
+ /** The URL of the file, without "https://" */
698
+ url: string;
699
+ /** The collection of the asset. Without it, the asset is in none. */
700
+ collection?: string;
701
+ /** The date of the upload, as the cms formats it: "09/21/2025, 13:34" */
411
702
  createdAt: string;
412
703
  /** The date of the last change, as the cms formats it */
413
704
  updatedAt: string;
414
- /** The row "Currently used blocks", for example "0/10000 (0%)". Without it, the row does not show. */
415
- blocks?: string;
416
- /** The user that made the record */
705
+ /** The user that uploaded the asset */
417
706
  createdBy: {
418
707
  name: string;
419
708
  imageUrl?: string;
420
709
  };
421
- };
422
- /** A page of the website, in the panel "Related website pages" */
423
- type InfoAsideWebsitePage = {
424
- /** The name of the frontend, for example "Production" */
425
- environment: string;
426
- /** The name of the link, for example "Draft version" */
427
- label: Message;
428
- /** The path or the URL of the page */
429
- path: string;
710
+ /** The tags that the AI found in the image */
711
+ smartTags?: string[];
430
712
  /**
431
- * Shows the button that opens the page in the visual editor
713
+ * The user closed the panel: only its title shows
432
714
  * @default false
433
715
  */
434
- visualEditing?: boolean;
716
+ closed?: boolean;
717
+ /**
718
+ * The rows that show, in the order of the cms. Use it to show a part of
719
+ * the panel in a small box, for example only the smart tags. The cms
720
+ * always shows all the rows.
721
+ * @default all the rows
722
+ */
723
+ rows?: AssetDetailInfoRow[];
435
724
  };
436
- /** The props of `InfoAside.WebsitePages` */
437
- type InfoAsideWebsitePagesProps = {
438
- pages: InfoAsideWebsitePage[];
725
+ /** The panel "Asset info" */
726
+ declare function Info({ filename, id, url, collection, createdAt, updatedAt, createdBy, smartTags, closed, rows }: AssetDetailInfoProps): React.JSX.Element;
727
+ //#endregion
728
+ //#region src/parts/AssetDetail/LinksToItems.d.ts
729
+ /** A record that uses the asset */
730
+ type AssetDetailLinkingRecord = {
731
+ /** The title of the record, unique in the list */
732
+ title: string;
733
+ /** The model of the record, with its emoji. For example "📰 Article". */
734
+ model: Message;
735
+ status?: RecordStatus;
736
+ /**
737
+ * The URL of the image of the record. The cms shows the first image of
738
+ * the record: often it is the asset of the dialog.
739
+ */
740
+ image?: string;
439
741
  };
440
- /** The side panel of the record editor, with the tab "Info" open */
441
- declare function InfoAside({ children }: InfoAsideProps): React.JSX.Element;
442
- /** A panel of the aside, open, with a title */
443
- declare function Panel({ title, flush, children }: InfoAsidePanelProps): React.JSX.Element;
444
- /** The text of an empty panel */
445
- declare function Blank({ message }: InfoAsideBlankProps): React.JSX.Element;
446
- /** The panel "Record info" */
447
- declare function RecordInfo({ id, status, createdAt, updatedAt, blocks, createdBy }: InfoAsideRecordInfoProps): React.JSX.Element;
448
- /** The panel "Publishing schedule", with no schedule */
449
- declare function PublishingSchedule(): React.JSX.Element;
450
- /** The panel "Related website pages" */
451
- declare function WebsitePages({ pages }: InfoAsideWebsitePagesProps): React.JSX.Element;
452
- /** The panel "Links", with no record that links to this record */
453
- declare function Links(): React.JSX.Element;
454
- declare const InfoAsideWithParts: typeof InfoAside & {
455
- Panel: typeof Panel;
456
- Blank: typeof Blank;
457
- RecordInfo: typeof RecordInfo;
458
- PublishingSchedule: typeof PublishingSchedule;
459
- WebsitePages: typeof WebsitePages;
460
- Links: typeof Links;
742
+ /** The props of `AssetDetail.LinksToItems` */
743
+ type AssetDetailLinksToItemsProps = {
744
+ records: AssetDetailLinkingRecord[];
745
+ /**
746
+ * The user closed the panel: only its title and the count show
747
+ * @default false
748
+ */
749
+ closed?: boolean;
461
750
  };
751
+ /** The panel "Records using this asset": the records that link the asset */
752
+ declare function LinksToItems({ records, closed }: AssetDetailLinksToItemsProps): React.JSX.Element;
462
753
  //#endregion
463
- //#region src/parts/NavigationBar/NavigationBar.d.ts
464
- /** The tabs of the bar. The CDA Playground is the last one. */
465
- type NavigationBarTab = 'visual' | 'content' | 'media' | 'schema' | 'configuration' | 'calendar' | 'cdaPlayground';
466
- /** The props of `NavigationBar` */
467
- type NavigationBarProps = {
754
+ //#region src/parts/AssetDetail/TrackDialogs.d.ts
755
+ /** A language in the select of the dialogs of the tracks */
756
+ type AssetDetailTrackLanguage = {
757
+ /** The name of the language, for example "English" */
758
+ name: string;
759
+ /** The code of the language, for example "en" */
760
+ code: string;
761
+ };
762
+ /** The props of `AssetDetail.GenerateSubtitles` */
763
+ type AssetDetailGenerateSubtitlesProps = {
764
+ /** The language of the audio. Without it, the select is empty. */
765
+ language?: AssetDetailTrackLanguage;
468
766
  /**
469
- * The tab of the page that the scene shows
470
- * @default 'content'
767
+ * The name of the new track
768
+ * @default the name of the language, then "(generated)", as in the cms
471
769
  */
472
- activeTab?: NavigationBarTab;
770
+ trackName?: string;
473
771
  /**
474
- * The type of the environment in the switcher
475
- * @default 'primary'
772
+ * The dialog shows only in the step "dialog" of
773
+ * GENERATE_SUBTITLES_SEQUENCE
774
+ * @default false
476
775
  */
477
- environment?: 'primary' | 'sandbox';
478
- /** The user at the end of the bar. Without `imageUrl`, the avatar shows the initials. */
479
- user: {
480
- name: string;
481
- imageUrl?: string;
776
+ sequence?: boolean;
777
+ /**
778
+ * The dialog is over the page, on the backdrop of the cms. Without it,
779
+ * the dialog is alone: give it alone to a scene.
780
+ * @default true
781
+ */
782
+ over?: boolean;
783
+ };
784
+ /** The props of `AssetDetail.AddTrack` */
785
+ type AssetDetailAddTrackProps = {
786
+ /** The file of the new track */
787
+ file: {
788
+ /** The name of the file, for example "it.vtt" */
789
+ filename: string;
790
+ /** The extension of the file, on its icon */
791
+ format: string;
792
+ /** The percent of the upload. At 100 (or without it) it does not show. */
793
+ percent?: number;
482
794
  };
795
+ /** The language of the track. Without it, the select is empty. */
796
+ language?: AssetDetailTrackLanguage;
797
+ /**
798
+ * The name of the track
799
+ * @default the name of the language, as in the cms
800
+ */
801
+ trackName?: string;
802
+ /**
803
+ * The value of the switch "Closed captions?". The switch is only for a
804
+ * file of subtitles: without this prop (a file of audio), it is not
805
+ * there.
806
+ */
807
+ closedCaptions?: boolean;
808
+ /**
809
+ * The dialog is over the page, on the backdrop of the cms. Without it,
810
+ * the dialog is alone: give it alone to a scene.
811
+ * @default true
812
+ */
813
+ over?: boolean;
483
814
  };
484
815
  /**
485
- * A copy of the navigation bar of the cms. The bar is a component of the
486
- * cms, thus it is not in ui.
816
+ * The dialog "Generate subtitles from audio", with the
817
+ * language of the audio. Give it to `dialog` of `AssetDetail`, or give it
818
+ * alone to a scene with `over={false}`.
487
819
  */
488
- export declare function NavigationBar({ activeTab, environment, user }: NavigationBarProps): React.JSX.Element;
489
- //#endregion
490
- //#region src/parts/RecordEditorLayout/RecordEditorLayout.d.ts
491
- /** The props of `RecordEditorLayout` */
492
- type RecordEditorLayoutProps = {
493
- /** The bar at the top: a `NavigationBar` */
494
- navigationBar: ReactNode;
495
- /** The column at the left: a `ContentSidebar` */
496
- sidebar: ReactNode;
497
- /** The column at the right: an `InfoAside`. Without it, the form is wider. */
498
- aside?: ReactNode;
499
- /** The column in the middle: a `RecordForm` */
500
- children: ReactNode;
501
- };
820
+ declare function GenerateSubtitles({ language, trackName, sequence, over }: AssetDetailGenerateSubtitlesProps): React.JSX.Element;
502
821
  /**
503
- * The screen of the record editor of the cms at 1440×900. The cms uses a
504
- * SplitPane with a script to size the columns. This part gives the same
505
- * widths with CSS, thus the server renders the final layout. The column of
506
- * the form is not a Main: the id of Main repeats on a page with two scenes,
507
- * and the screen is hidden from assistive technology.
822
+ * The dialog "Add new track", with the file that the user
823
+ * dropped and its upload. Give it to `dialog` of `AssetDetail`, or give it
824
+ * alone to a scene with `over={false}`.
508
825
  */
509
- export declare function RecordEditorLayout({ navigationBar, sidebar, aside, children }: RecordEditorLayoutProps): React.JSX.Element;
826
+ declare function AddTrack({ file, language, trackName, closedCaptions, over }: AssetDetailAddTrackProps): React.JSX.Element;
510
827
  //#endregion
511
- //#region src/parts/RecordForm/RecordForm.d.ts
512
- /** The props of `RecordForm` */
513
- type RecordFormProps = {
514
- /** The title of the record, in the toolbar */
515
- title: Message;
516
- /** The icon before the title: the emoji of the model, as in the cms */
517
- icon?: ReactNode;
518
- /** The fields: `RecordForm.Field` elements */
519
- children: ReactNode;
520
- };
521
- /** The props of `RecordForm.Field` */
522
- type RecordFormFieldProps = {
523
- /** The name of the field */
524
- label: Message;
828
+ //#region src/parts/AssetDetail/Tracks.d.ts
829
+ /**
830
+ * The steps of a click on "Generate subtitles from audio", in the panel of
831
+ * the tracks (`AssetDetail.Tracks` with `sequence`): the actions of the
832
+ * slot show, the dialog (`AssetDetail.GenerateSubtitles` with `sequence`)
833
+ * opens on a language, then the new track (a track with `added`) is in the
834
+ * list. The last step is the picture at rest: the dialog is closed.
835
+ */
836
+ export declare const GENERATE_SUBTITLES_SEQUENCE: StageSequence;
837
+ /** A track of a video, in `AssetDetail.Tracks` */
838
+ type AssetDetailTrack = {
839
+ /** The kind of the track */
840
+ type: 'audio' | 'subtitles';
525
841
  /**
526
- * Adds an asterisk to the label
842
+ * The subtitles are closed captions
527
843
  * @default false
528
844
  */
529
- required?: boolean;
845
+ closedCaptions?: boolean;
846
+ /** The name of the track, for example "English (generated)" */
847
+ name: string;
848
+ /** The code of the language, for example "en" */
849
+ languageCode: string;
850
+ /**
851
+ * The state of the track at Mux
852
+ * @default "ready"
853
+ */
854
+ status?: 'preparing' | 'ready' | 'errored';
855
+ /**
856
+ * The tooltip "Download as .VTT" of a track of subtitles is open, as with
857
+ * the pointer on the button
858
+ * @default false
859
+ */
860
+ downloadTooltip?: boolean;
861
+ /**
862
+ * The actions of the row (download and delete) show, without the tooltip
863
+ * @default false
864
+ */
865
+ actionsOpen?: boolean;
866
+ /**
867
+ * The row comes in the last step of GENERATE_SUBTITLES_SEQUENCE, in
868
+ * `AssetDetail.Tracks` with `sequence`
869
+ * @default false
870
+ */
871
+ added?: boolean;
872
+ };
873
+ /** The props of `AssetDetail.Tracks` */
874
+ type AssetDetailTracksProps = {
875
+ /** The tracks of the video, in the order of the list */
876
+ tracks?: AssetDetailTrack[];
877
+ /**
878
+ * The slot shows "Generate subtitles from audio": the video is recent,
879
+ * thus Mux still has its audio
880
+ * @default true
881
+ */
882
+ generate?: boolean;
883
+ /**
884
+ * The actions of the slot show, as with the pointer on the slot
885
+ * @default false
886
+ */
887
+ actions?: boolean;
888
+ /**
889
+ * The maximum size of a file, as the cms formats it
890
+ * @default "5 GB"
891
+ */
892
+ maxSize?: string;
893
+ /**
894
+ * The panel plays the steps of GENERATE_SUBTITLES_SEQUENCE
895
+ * @default false
896
+ */
897
+ sequence?: boolean;
898
+ /**
899
+ * The user closed the panel: only its title shows
900
+ * @default false
901
+ */
902
+ closed?: boolean;
903
+ };
904
+ /**
905
+ * The panel "Additional audio tracks and subtitles" of a video: the list of
906
+ * the tracks, then the slot that takes the files of the new tracks
907
+ */
908
+ declare function Tracks({ tracks, generate, actions, maxSize, sequence, closed }: AssetDetailTracksProps): React.JSX.Element;
909
+ //#endregion
910
+ //#region src/parts/AssetDetail/VideoPreview.d.ts
911
+ /**
912
+ * The steps of a click on the marker of the thumbnail, in
913
+ * `AssetDetail.Player` or in `AssetDetail` with a video and `sequence`.
914
+ * The pointer comes on the marker and clicks it, the card of the
915
+ * thumbnail opens, then the pointer goes away. The last step is the
916
+ * picture at rest: the card open, no pointer.
917
+ */
918
+ export declare const THUMBNAIL_MARKER_SEQUENCE: StageSequence;
919
+ /** The props of `AssetDetail.Player` */
920
+ type AssetDetailPlayerProps = {
921
+ /** The video, as `video` of `AssetDetail` */
922
+ video: NonNullable<AssetDetailProps['video']>;
923
+ /** The width of the player, in px */
924
+ width: number;
925
+ /**
926
+ * With THUMBNAIL_MARKER_SEQUENCE: the card of the marker is closed, then
927
+ * the pointer clicks the marker and the card opens. It replaces
928
+ * `poster.open`.
929
+ * @default false
930
+ */
931
+ sequence?: boolean;
932
+ };
933
+ /**
934
+ * The player of a video with the controls of its thumbnail: the marker of
935
+ * the thumbnail on the seek bar (with its card if `poster.open`), and the
936
+ * buttons under the player. Give it alone to a scene to show the player
937
+ * without the page around it.
938
+ */
939
+ declare function Player({ video, width, sequence }: AssetDetailPlayerProps): React.JSX.Element;
940
+ //#endregion
941
+ //#region src/parts/AssetDetail/AssetDetail.d.ts
942
+ /**
943
+ * The steps of OPEN_ASSET_SEQUENCE (a click on an asset of `MediaArea`
944
+ * with `clicked`), then a click on the image of `AssetDetail` with
945
+ * `sequence`, that sets its focal point. The pointer comes on the image,
946
+ * the previews of the crops show around the center, the click sets the
947
+ * focal point and the previews follow it, then the pointer goes away. The
948
+ * last step is the picture at rest: the focal point set, no pointer and no
949
+ * previews.
950
+ */
951
+ export declare const OPEN_ASSET_FOCAL_POINT_SEQUENCE: StageSequence;
952
+ /** The props of `AssetDetail` */
953
+ type AssetDetailProps = {
954
+ /**
955
+ * The dialog is over the other parts of the screen, on the backdrop of the
956
+ * cms. Without it, the panel of the dialog fills the screen.
957
+ * @default false
958
+ */
959
+ over?: boolean;
960
+ /** The title of the asset, in the toolbar of the preview */
961
+ title?: TextMessage;
962
+ /** The image of the asset. Give `image` or `video`. */
963
+ image?: {
964
+ /** The URL of the image */
965
+ src: string;
966
+ /** The width of the file, in px */
967
+ width: number;
968
+ /** The height of the file, in px */
969
+ height: number;
970
+ };
971
+ /**
972
+ * The video of the asset, paused on a frame, in the player of the cms.
973
+ * Under the player are the controls of its thumbnail.
974
+ */
975
+ video?: {
976
+ /** The URL of the image of the frame where the video is paused */
977
+ src: string;
978
+ /** The width of the video, in px */
979
+ width: number;
980
+ /** The height of the video, in px */
981
+ height: number;
982
+ /** The time of the frame, in seconds */
983
+ currentTime: number;
984
+ /** The length of the video, in seconds */
985
+ duration: number;
986
+ /**
987
+ * The thumbnail of the video: the marker on the seek bar. Without it,
988
+ * there is no marker.
989
+ */
990
+ poster?: {
991
+ /** The time of the thumbnail, in seconds */
992
+ time: number;
993
+ /**
994
+ * The URL of the image of the thumbnail, in the card of the marker
995
+ * @default the `src` of the video
996
+ */
997
+ src?: string;
998
+ /**
999
+ * The card of the marker is open, as with the pointer on the marker
1000
+ * @default false
1001
+ */
1002
+ open?: boolean;
1003
+ };
1004
+ };
1005
+ /**
1006
+ * The focal point of the image, from 0 to 1 on each axis. Without it, the
1007
+ * point is at the center, as the default of the cms.
1008
+ */
1009
+ focalPoint?: FocalPoint;
1010
+ /**
1011
+ * The size of the box of the preview, in px: the image fits in it, inside
1012
+ * the space of the cms. The cms measures the box; a scene gives it.
1013
+ * @default { width: 640, height: 440 }
1014
+ */
1015
+ previewBox?: {
1016
+ width: number;
1017
+ height: number;
1018
+ };
1019
+ /**
1020
+ * The previews of the crops show in the hover card of the image, on its
1021
+ * right, as when the pointer is on the image. With `hovered` (a label of
1022
+ * `CROP_RATIOS`, for example "16:9"), the pointer is on that preview: the
1023
+ * image shows the crop.
1024
+ */
1025
+ cropPreviews?: {
1026
+ hovered?: string;
1027
+ };
1028
+ /**
1029
+ * With OPEN_ASSET_FOCAL_POINT_SEQUENCE: before the click the asset has no
1030
+ * focal point, then the pointer clicks the image on `focalPoint`. The
1031
+ * previews of the crops show while the pointer is on the image, around
1032
+ * the center, then around `focalPoint`. It replaces `cropPreviews`.
1033
+ * With a video and THUMBNAIL_MARKER_SEQUENCE: the pointer clicks the
1034
+ * marker of the thumbnail, and its card opens. It replaces `poster.open`.
1035
+ * @default false
1036
+ */
1037
+ sequence?: boolean;
1038
+ /**
1039
+ * The technical details of the file, under the preview. "Edit image" is
1040
+ * a PRO feature without `editImage`.
1041
+ */
1042
+ details: UploadDetailsProps['value'];
1043
+ /**
1044
+ * The plan has the image editor. Without it, "Edit image" is disabled and has a
1045
+ * PRO pill, as in the cms.
1046
+ * @default true
1047
+ */
1048
+ editImage?: boolean;
1049
+ /**
1050
+ * The plan has the video editor. Without it, "Edit video" is disabled and has a
1051
+ * PRO pill, as in the cms.
1052
+ * @default true
1053
+ */
1054
+ editVideo?: boolean;
1055
+ /**
1056
+ * A dialog over the page, for example `AssetDetail.GenerateSubtitles`
1057
+ * or `AssetDetail.AddTrack`
1058
+ */
1059
+ dialog?: ReactNode;
1060
+ /**
1061
+ * The width of the sidebar, in px
1062
+ * @default 500
1063
+ */
1064
+ asideWidth?: number;
1065
+ /**
1066
+ * The panels of the sidebar: `AssetDetail.Info`, `AssetDetail.DefaultMetadata`,
1067
+ * `AssetDetail.Categorization`, `AssetDetail.LinksToItems` and
1068
+ * `AssetDetail.Tracks`
1069
+ */
1070
+ children: ReactNode;
1071
+ };
1072
+ /**
1073
+ * The details of an asset, the dialog of the media area: the preview of the
1074
+ * image with its focal point, then the sidebar with the panels. The same
1075
+ * parts as in the cms.
1076
+ */
1077
+ declare function AssetDetail({ over, title, image, video, focalPoint, previewBox, cropPreviews, sequence, details, editImage, editVideo, dialog, asideWidth, children }: AssetDetailProps): React.JSX.Element;
1078
+ declare const AssetDetailWithParts: typeof AssetDetail & {
1079
+ Info: typeof Info;
1080
+ DefaultMetadata: typeof DefaultMetadata;
1081
+ Categorization: typeof Categorization;
1082
+ LinksToItems: typeof LinksToItems;
1083
+ Tracks: typeof Tracks;
1084
+ Player: typeof Player;
1085
+ GenerateSubtitles: typeof GenerateSubtitles;
1086
+ AddTrack: typeof AddTrack;
1087
+ };
1088
+ //#endregion
1089
+ //#region ../ui-static/src/lists/AuditLog.d.ts
1090
+ /** A column of the results of the audit log */
1091
+ type AuditLogColumnName = 'time' | 'actor' | 'action' | 'path' | 'environment' | 'role' | 'audit_log_id' | 'request_id';
1092
+ //#endregion
1093
+ //#region src/parts/AuditLog/AuditLog.d.ts
1094
+ /** A column of `AuditLog` */
1095
+ type AuditLogColumn = AuditLogColumnName;
1096
+ /** An event of `AuditLog`: a row of the table */
1097
+ type AuditLogEvent = {
1098
+ /**
1099
+ * The time of the event, as an ISO 8601 string, for example
1100
+ * "2026-10-15T09:41:00Z". The table shows it in UTC. Give a date in the
1101
+ * past: on the day of the date, the cms writes "Today".
1102
+ */
1103
+ occurredAt: string;
1104
+ /** The user or the API token that did the action, with its avatar */
1105
+ actor: {
1106
+ /** The name, for example "Marta Rossi" */
1107
+ name: string;
1108
+ /** The email: it picks the color of the initials of the avatar */
1109
+ email?: string;
1110
+ /** The URL of the picture of the avatar. Without it, the avatar shows the initials. */
1111
+ imageUrl?: string;
1112
+ };
1113
+ /**
1114
+ * The name of the action in the API, for example `item_types.update`,
1115
+ * `roles.update`, `items.publish` or `access_tokens.create`. The table
1116
+ * shows the label of the cms ("Update model"), and an unknown name as
1117
+ * code.
1118
+ */
1119
+ action: string;
1120
+ /** The path of the request, for example "/item-types/1234" */
1121
+ path: string;
1122
+ /** The id of the environment, for the column "Environment" */
1123
+ environment?: string;
1124
+ /** The name of the role of the actor, for the column "Role" */
1125
+ role?: string;
1126
+ };
1127
+ /** The props of `AuditLog` */
1128
+ type AuditLogProps = {
1129
+ /** The events, newest first */
1130
+ events: AuditLogEvent[];
1131
+ /**
1132
+ * The visible columns and their relative widths. The default is the
1133
+ * layout of the cms: Time, Actor, Action and Path.
1134
+ */
1135
+ columns?: {
1136
+ name: AuditLogColumn;
1137
+ width: number;
1138
+ }[];
1139
+ /**
1140
+ * The end of the results: "Searched until" with this time, as the cms
1141
+ * writes it (for example "2026-10-15 09:12:00 Z"), and the marker "No
1142
+ * more events". Without it, the table has no footer, as on a page with a
1143
+ * next page.
1144
+ */
1145
+ end?: {
1146
+ searchedUntil: string;
1147
+ };
1148
+ };
1149
+ /**
1150
+ * The audit log of the project (the project settings of the cms, at rest):
1151
+ * the title bar with the filter button, and the table of the events. No
1152
+ * event is open.
1153
+ */
1154
+ export declare function AuditLog({ events, columns, end }: AuditLogProps): React.JSX.Element;
1155
+ //#endregion
1156
+ //#region src/parts/Collaboration/Collaboration.d.ts
1157
+ /**
1158
+ * The steps of a record that another user edits, for the `sequence` of
1159
+ * `Stage`, with `RecordForm` `collaborator`, `RecordForm.Field` `saved` (and
1160
+ * `pointer` on one field) and `InfoAside.RevisionHistory` `saved`:
1161
+ *
1162
+ * - "saved": the other user saves. The lock ends, the values that they
1163
+ * saved show in the fields with a highlight, and when the highlight has
1164
+ * faded their version comes in at the top of the revision history. The
1165
+ * toolbar shows the status and the publish button again. Their avatar
1166
+ * stays, without the ring: they still look at the record. The pointer
1167
+ * shows the cursor of a text: the field is not read only anymore.
1168
+ * - "rest": the other user closes the record, and the record is as before
1169
+ * their change. The pointer is not there.
1170
+ * - "looking": the other user opens the record: their avatar shows, with
1171
+ * the tooltip of the cms.
1172
+ * - "editing": the other user starts to edit: the ring on their avatar, the
1173
+ * lock and the button that takes it over in the toolbar, the fields read
1174
+ * only. The tooltip says that they edit the record.
1175
+ * - "locked": as "editing", without the tooltip. The pointer comes to the
1176
+ * field, shows the cursor of a disabled input, and clicks: nothing
1177
+ * changes. It is the picture at rest, with the pointer still.
1178
+ */
1179
+ export declare const COLLABORATION_SEQUENCE: StageSequence;
1180
+ //#endregion
1181
+ //#region src/parts/ContentSidebar/ContentSidebar.d.ts
1182
+ /** A folder of the menu */
1183
+ type ContentSidebarFolder = {
1184
+ kind: 'folder';
1185
+ /** A key that is unique in the menu */
1186
+ id: string;
1187
+ /** The name of the folder. An emoji at the start becomes the icon. */
1188
+ name: string;
1189
+ /**
1190
+ * The folder shows its items. A closed folder shows only its chevron.
1191
+ * @default false
1192
+ */
1193
+ open?: boolean;
1194
+ /** The items in the folder. Only an open folder shows them. */
1195
+ items?: ContentSidebarItem[];
1196
+ };
1197
+ /** A model of the menu: it opens the records of the model */
1198
+ type ContentSidebarModel = {
1199
+ kind: 'model';
1200
+ /** A key that is unique in the menu */
1201
+ id: string;
1202
+ /**
1203
+ * The name of the model. An emoji at the start becomes the icon, as in
1204
+ * the cms.
1205
+ */
1206
+ name: string;
1207
+ /**
1208
+ * The model has one record. Without an emoji, the icon is the one of a
1209
+ * single record.
1210
+ * @default false
1211
+ */
1212
+ singleton?: boolean;
1213
+ /**
1214
+ * The row of the page that the scene shows
1215
+ * @default false
1216
+ */
1217
+ active?: boolean;
1218
+ /** An icon in place of the emoji or of the icon of the kind */
1219
+ icon?: ReactNode;
1220
+ };
1221
+ /** An item of the menu of the models */
1222
+ type ContentSidebarItem = ContentSidebarFolder | ContentSidebarModel;
1223
+ /** The props of `ContentSidebar` */
1224
+ type ContentSidebarProps = {
1225
+ /**
1226
+ * The title of the pane
1227
+ * @default { id: 'nav.manageItemTypes' }
1228
+ */
1229
+ title?: TextMessage;
1230
+ /** The items at the first level of the menu */
1231
+ items: ContentSidebarItem[];
1232
+ };
1233
+ /** The menu of the models: the same parts as the sidebar of the cms */
1234
+ export declare function ContentSidebar({ title, items }: ContentSidebarProps): React.JSX.Element;
1235
+ //#endregion
1236
+ //#region src/parts/FieldSettings/FieldSettings.d.ts
1237
+ /**
1238
+ * The steps of a click on a field of a `ModelPage` (`clicked`), that opens
1239
+ * its `FieldSettings` on the tab Settings, then of a click on the tab
1240
+ * Presentation, then of a click on the tab Validations. The last step is
1241
+ * the tab Validations: the picture at rest.
1242
+ */
1243
+ export declare const FIELD_SETTINGS_SEQUENCE: StageSequence;
1244
+ /**
1245
+ * The steps of a click on a field of a `ModelPage` (`clicked`), that opens
1246
+ * the `FieldSettings` of a text field on the tab Settings, then of a click
1247
+ * on the tab Presentation, then of a click on the button "Change" of the
1248
+ * editor. The last step is the menu of the editors, open: the picture
1249
+ * at rest.
1250
+ */
1251
+ export declare const FIELD_EDITOR_SEQUENCE: StageSequence;
1252
+ /** The validators of an asset field, on the tab Validations */
1253
+ type FieldSettingsValidators = {
1254
+ /**
1255
+ * The field must have an asset
1256
+ * @default false
1257
+ */
1258
+ required?: boolean;
1259
+ /**
1260
+ * The smallest size of an image, in px: "Accept only specified image
1261
+ * dimensions", with "At least"
1262
+ */
1263
+ minImageDimensions?: {
1264
+ width: number;
1265
+ height: number;
1266
+ };
1267
+ /**
1268
+ * The image must have its alternate text
1269
+ * @default false
1270
+ */
1271
+ requiredAlt?: boolean;
1272
+ };
1273
+ /** A field of the tab Settings */
1274
+ type FieldSettingsField = 'label' | 'apiKey' | 'contentLink' | 'localized';
1275
+ /** The props of `FieldSettings` */
1276
+ type FieldSettingsProps = {
1277
+ /**
1278
+ * The type of the field. "file" is a field "Single asset", with the tab
1279
+ * Validations. "text" is a field "Multiple-paragraph text": its tabs are
1280
+ * Settings, Validations, Default value and Presentation. Its tab
1281
+ * Presentation shows the editor of the field, "Markdown editor", with
1282
+ * its toolbar buttons and the menu of the editors open.
1283
+ * @default 'file'
1284
+ */
1285
+ type?: 'file' | 'text';
1286
+ /** The name of the field, for example "Hero image" */
1287
+ label: string;
1288
+ /** The API key of the field, for example "hero_image" */
1289
+ apiKey: string;
1290
+ /** The ID of the field, at the right of the tabs */
1291
+ id: string;
1292
+ /**
1293
+ * The field is localized
1294
+ * @default false
1295
+ */
1296
+ localized?: boolean;
1297
+ /**
1298
+ * The validators that are on, for a "file" field
1299
+ * @default none
1300
+ */
1301
+ validators?: FieldSettingsValidators;
1302
+ /**
1303
+ * The help text of the field, on the tab Presentation. The record editor
1304
+ * shows it under the field.
1305
+ * @default none
1306
+ */
1307
+ hint?: string;
1308
+ /**
1309
+ * The open tab. "settings" is a still picture of the tab Settings (the
1310
+ * name, the field ID and the localization). Do not use it with a
1311
+ * sequence: the steps of FIELD_SETTINGS_SEQUENCE need the tab
1312
+ * Validations, and the steps of FIELD_EDITOR_SEQUENCE need the tab
1313
+ * Presentation.
1314
+ * @default 'validations' for a "file" field, 'presentation' for a "text" field
1315
+ */
1316
+ tab?: 'settings' | 'validations' | 'presentation';
1317
+ /**
1318
+ * The fields of the tab Settings, in the order to show them. The cms
1319
+ * shows the name, the field ID, the switch of Content Link (only for a
1320
+ * "text" field), then the localization: put the subject of the scene
1321
+ * first.
1322
+ * @default ['label', 'apiKey', 'contentLink', 'localized']
1323
+ */
1324
+ settingsOrder?: FieldSettingsField[];
1325
+ /**
1326
+ * The dialog is over the other parts of the screen, on the backdrop of
1327
+ * the cms. Without it, the dialog is alone on the stage.
1328
+ * @default false
1329
+ */
1330
+ over?: boolean;
1331
+ };
1332
+ /**
1333
+ * The dialog "Edit field" of the cms for a field "Single asset", on its tab
1334
+ * Validations: a checkbox for each validator, with the options of the
1335
+ * validators that are on. The tab Settings (the name, the field ID and the
1336
+ * localization) and the tab Presentation (the help text) are in the markup
1337
+ * too: the steps of FIELD_SETTINGS_SEQUENCE show them, and the screen
1338
+ * without a step hides them. The cms renders only the
1339
+ * content of the active tab: the scene shows one at a time. With `tab`
1340
+ * "settings", the dialog shows only the tab Settings, with no step.
1341
+ *
1342
+ * With `type` "text", the dialog is on its tab Presentation: the help text,
1343
+ * then the editor "Markdown editor" with its toolbar buttons and the menu
1344
+ * of the editors open. The tab Settings is in the markup too, for the steps
1345
+ * of FIELD_EDITOR_SEQUENCE.
1346
+ */
1347
+ export declare function FieldSettings({ type, label, apiKey, id, localized, validators, hint, tab, settingsOrder, over }: FieldSettingsProps): React.JSX.Element;
1348
+ //#endregion
1349
+ //#region src/parts/InfoAside/AiTranslations.d.ts
1350
+ /**
1351
+ * The steps of a run of the panel AI Translations (`InfoAside.AiTranslations`
1352
+ * with `sequence`): the panel at rest with the pointer that comes to the
1353
+ * button, the click, then four batches of jobs, and the end of the run.
1354
+ * Each job starts in a batch and ends in a later batch, or in the step
1355
+ * "done" (see `InfoAsideAiTranslationsJob`). The last step is the picture
1356
+ * at rest: all the jobs ended and the message of the end shows.
1357
+ */
1358
+ export declare const AI_TRANSLATIONS_SEQUENCE: StageSequence;
1359
+ /** A job of the run: one field to one locale */
1360
+ type InfoAsideAiTranslationsJob = {
1361
+ /** The label of the field, for example "Name" */
1362
+ field: Message;
1363
+ /** The name of the target locale, for example "Italian" */
1364
+ locale: Message;
1365
+ /**
1366
+ * The batch of AI_TRANSLATIONS_SEQUENCE where the job starts, from 1 to 4
1367
+ * @default 1
1368
+ */
1369
+ start?: 1 | 2 | 3 | 4;
1370
+ /**
1371
+ * The batch where the job ends, after `start`: from 2 to 4, or 5 for the
1372
+ * step "done"
1373
+ * @default 5
1374
+ */
1375
+ end?: 2 | 3 | 4 | 5;
1376
+ };
1377
+ /** The props of `InfoAside.AiTranslations` */
1378
+ type InfoAsideAiTranslationsProps = {
1379
+ /** The name of the source locale, for example "English" */
1380
+ source: Message;
1381
+ /** The names of the target locales */
1382
+ targets: Message[];
1383
+ /** The jobs of the run, in the order that they start */
1384
+ jobs: InfoAsideAiTranslationsJob[];
1385
+ /** The line at the end of the run, after a check */
1386
+ message: Message;
1387
+ /**
1388
+ * The panel plays the steps of AI_TRANSLATIONS_SEQUENCE. Without it, the
1389
+ * panel shows the end of the run.
1390
+ * @default false
1391
+ */
1392
+ sequence?: boolean;
1393
+ };
1394
+ /**
1395
+ * The panel "AI Translations" of the plugin AI Translations, after the
1396
+ * record info. The plugin is not in this repository: the part is a copy of
1397
+ * its sidebar (datocms/plugins, ai-translations/src/entrypoints/Sidebar/),
1398
+ * with the components of ui-public. Before the run: the source locale, the
1399
+ * target locales and the button "Translate all fields". During the run:
1400
+ * a progress bar, and one line with the first job that did not end. At
1401
+ * the end: the full bar, and a line with a check that asks to review and
1402
+ * save.
1403
+ */
1404
+ declare function AiTranslations({ source, targets, jobs, message, sequence }: InfoAsideAiTranslationsProps): React.JSX.Element;
1405
+ //#endregion
1406
+ //#region src/parts/InfoAside/InfoAside.d.ts
1407
+ /**
1408
+ * The steps of the open stage of `InfoAside.RecordInfo`, for the `sequence`
1409
+ * of `Stage`: the stage closed, the menu open, the pointer on the option of
1410
+ * `menu.hovered`, its tooltip with the description of the stage. The
1411
+ * tooltip opens after 450ms on the option, as the Tooltip of the cms. The
1412
+ * last step is the picture at rest.
1413
+ */
1414
+ export declare const STAGE_MENU_SEQUENCE: StageSequence;
1415
+ /** The props of `InfoAside` */
1416
+ type InfoAsideProps = {
1417
+ /**
1418
+ * The active tab. "websitePreview" is the tab of the plugin Web Previews:
1419
+ * give a `WebPreview` as `children`.
1420
+ * @default 'info'
1421
+ */
1422
+ tab?: 'info' | 'websitePreview';
1423
+ /**
1424
+ * The panels: `InfoAside.RecordInfo`, `InfoAside.Panel` and the others.
1425
+ * With the tab "websitePreview", a `WebPreview`.
1426
+ */
1427
+ children: ReactNode;
1428
+ };
1429
+ /** The props of `InfoAside.Panel` */
1430
+ type InfoAsidePanelProps = {
1431
+ /** The title of the panel */
1432
+ title: Message;
1433
+ /**
1434
+ * The content touches the sides of the panel, for a list of rows
1435
+ * @default false
1436
+ */
1437
+ flush?: boolean;
1438
+ /**
1439
+ * The user closed the panel: only its title shows. The cms remembers it
1440
+ * for each panel.
1441
+ * @default false
1442
+ */
1443
+ closed?: boolean;
1444
+ /** The content of the panel */
1445
+ children: ReactNode;
1446
+ };
1447
+ /** The props of `InfoAside.Links` */
1448
+ type InfoAsideClosableProps = Pick<InfoAsidePanelProps, 'closed'>;
1449
+ /** The props of `InfoAside.PublishingSchedule` */
1450
+ type InfoAsidePublishingScheduleProps = InfoAsideClosableProps & {
1451
+ /** The schedule of the record. Without it, the panel says that there is none. */
1452
+ schedule?: {
1453
+ /**
1454
+ * What happens at the date
1455
+ * @default 'publication'
1456
+ */
1457
+ action?: 'publication' | 'unpublishing';
1458
+ /** When it happens, as the cms formats it: "10/26/2026, 09:00" */
1459
+ date: string;
1460
+ /** The content, for example "English, Italian". Without it, the whole record. */
1461
+ scope?: string;
1462
+ };
1463
+ };
1464
+ /** The props of `InfoAside.Blank` */
1465
+ type InfoAsideBlankProps = {
1466
+ /** The text that tells that the panel is empty */
1467
+ message: Message;
1468
+ };
1469
+ /** The props of `InfoAside.RecordInfo` */
1470
+ type InfoAsideRecordInfoProps = {
1471
+ /** The ID of the record */
1472
+ id: string;
1473
+ status: RecordStatus;
1474
+ /** The date of creation, as the cms formats it: "09/21/2025, 13:34" */
1475
+ createdAt: string;
1476
+ /** The date of the last change, as the cms formats it */
1477
+ updatedAt: string;
1478
+ /** The row "Currently used blocks", for example "0/10000 (0%)". Without it, the row does not show. */
1479
+ blocks?: string;
1480
+ /** The user that made the record */
1481
+ createdBy: {
1482
+ name: string;
1483
+ imageUrl?: string;
1484
+ };
1485
+ /**
1486
+ * The stage of the record in the workflow of its model. Without it, the
1487
+ * model has no workflow and the row does not show.
1488
+ */
1489
+ stage?: InfoAsideStage;
1490
+ };
1491
+ /** The row "Stage" of `InfoAside.RecordInfo` */
1492
+ type InfoAsideStage = {
1493
+ /** The name of the stage of the record, for example "In review" */
1494
+ name: string;
1495
+ /**
1496
+ * The stages that the user can move the record to, in the order of the
1497
+ * workflow. With at least one, the stage is a menu, as in the cms;
1498
+ * without them, it is a text.
1499
+ */
1500
+ moves?: InfoAsideStageMove[];
1501
+ /**
1502
+ * The menu is open, and the pointer is on the stage at this index of
1503
+ * `moves`, when it is set: its description shows in a tooltip, on the
1504
+ * left of the menu
1505
+ */
1506
+ menu?: {
1507
+ hovered?: number;
1508
+ };
1509
+ };
1510
+ /** A stage in the menu of the row "Stage" */
1511
+ type InfoAsideStageMove = {
1512
+ /** The name of the stage, for example "Approved" */
1513
+ name: string;
1514
+ /** The description of the stage, in the tooltip of its option */
1515
+ description?: string;
1516
+ };
1517
+ /** A page of the website, in the panel "Related website pages" */
1518
+ type InfoAsideWebsitePage = {
1519
+ /** The name of the frontend, for example "Production" */
1520
+ environment: string;
1521
+ /** The name of the link, for example "Draft version" */
1522
+ label: Message;
1523
+ /** The path or the URL of the page */
1524
+ path: string;
1525
+ /**
1526
+ * Shows the button that opens the page in the visual editor
1527
+ * @default false
1528
+ */
1529
+ visualEditing?: boolean;
1530
+ };
1531
+ /** The props of `InfoAside.WebsitePages` */
1532
+ type InfoAsideWebsitePagesProps = {
1533
+ pages: InfoAsideWebsitePage[];
1534
+ };
1535
+ /** A version of the record, in the panel "Revision history" */
1536
+ type InfoAsideVersion = {
1537
+ /** When the version was saved, as the cms formats it: "Today, 10:44:12" */
1538
+ date: string;
1539
+ /** The user that saved the version */
1540
+ editor?: string;
1541
+ /**
1542
+ * The version is the published one: its status says "Published", and the
1543
+ * dot of the timeline is green
1544
+ * @default false
1545
+ */
1546
+ published?: boolean;
1547
+ /**
1548
+ * The version was published once, and is not anymore: the dot of the
1549
+ * timeline is a faded green
1550
+ * @default false
1551
+ */
1552
+ wasPublished?: boolean;
1553
+ /** When the version was published, for example "Published since Today, 09:15:02" */
1554
+ publication?: string;
1555
+ };
1556
+ /** The props of `InfoAside.RevisionHistory` */
1557
+ type InfoAsideRevisionHistoryProps = {
1558
+ /**
1559
+ * The last versions of the record, the newest first: the first one is the
1560
+ * current version. The cms shows five at most.
1561
+ */
1562
+ versions: InfoAsideVersion[];
1563
+ /**
1564
+ * The number of the older versions, in the link at the end of the
1565
+ * timeline. Without it, the timeline has no link.
1566
+ */
1567
+ more?: number;
1568
+ /**
1569
+ * The version that another user saves, with COLLABORATION_SEQUENCE: it
1570
+ * comes in at the top at the step "saved", and it becomes the current
1571
+ * version. Give it with `RecordForm` `collaborator`.
1572
+ */
1573
+ saved?: InfoAsideVersion;
1574
+ };
1575
+ /**
1576
+ * The side panel of the record editor, with the tab "Info" or the tab
1577
+ * "Website preview" open. The label of the second tab is the label that
1578
+ * the plugin gives to its sidebar: it is not a text of the cms.
1579
+ */
1580
+ declare function InfoAside({ tab, children }: InfoAsideProps): React.JSX.Element;
1581
+ /** A panel of the aside, open, with a title */
1582
+ declare function Panel({ title, flush, closed, children }: InfoAsidePanelProps): React.JSX.Element;
1583
+ /** The text of an empty panel */
1584
+ declare function Blank({ message }: InfoAsideBlankProps): React.JSX.Element;
1585
+ /** The panel "Record info" */
1586
+ declare function RecordInfo({ id, status, createdAt, updatedAt, blocks, createdBy, stage }: InfoAsideRecordInfoProps): React.JSX.Element;
1587
+ /** The panel "Publishing schedule": the schedule of the record, if any */
1588
+ declare function PublishingSchedule({ closed, schedule }: InfoAsidePublishingScheduleProps): React.JSX.Element;
1589
+ /** The panel "Related website pages" */
1590
+ declare function WebsitePages({ pages }: InfoAsideWebsitePagesProps): React.JSX.Element;
1591
+ /** The panel "Revision history": the last versions on a timeline */
1592
+ declare function RevisionHistory({ versions, more, saved }: InfoAsideRevisionHistoryProps): React.JSX.Element;
1593
+ /** The panel "Links", with no record that links to this record */
1594
+ declare function Links({ closed }: InfoAsideClosableProps): React.JSX.Element;
1595
+ declare const InfoAsideWithParts: typeof InfoAside & {
1596
+ Panel: typeof Panel;
1597
+ Blank: typeof Blank;
1598
+ RecordInfo: typeof RecordInfo;
1599
+ PublishingSchedule: typeof PublishingSchedule;
1600
+ WebsitePages: typeof WebsitePages;
1601
+ RevisionHistory: typeof RevisionHistory;
1602
+ Links: typeof Links;
1603
+ AiTranslations: typeof AiTranslations;
1604
+ };
1605
+ //#endregion
1606
+ //#region src/parts/MediaArea/MediaArea.d.ts
1607
+ /**
1608
+ * The steps of a click on an asset of `MediaArea` (`clicked`), that opens
1609
+ * its `AssetDetail` over the media area. The last step is the dialog open:
1610
+ * the picture at rest.
1611
+ */
1612
+ export declare const OPEN_ASSET_SEQUENCE: StageSequence;
1613
+ /** An asset in the grid of `MediaArea` */
1614
+ type MediaAreaAsset = {
1615
+ /** The name of the file, in the caption of the card */
1616
+ filename: string;
1617
+ /** The URL of the image */
1618
+ src: string;
1619
+ /** The width of the image, in px */
1620
+ width: number;
1621
+ /** The height of the image, in px */
1622
+ height: number;
1623
+ /**
1624
+ * The card is selected: it shows the selected border and its checkbox
1625
+ * @default false
1626
+ */
1627
+ selected?: boolean;
1628
+ /**
1629
+ * The pointer comes on the card and clicks it, with
1630
+ * `OPEN_ASSET_SEQUENCE`. Give it to one asset only.
1631
+ * @default false
1632
+ */
1633
+ clicked?: boolean;
1634
+ };
1635
+ /** A saved filter of the menu of the saved filters */
1636
+ type MediaAreaSavedFilters = {
1637
+ /** The name of the active filter. Without it, no filter is active. */
1638
+ active?: string;
1639
+ /** The names of the filters that all the users see */
1640
+ shared?: string[];
1641
+ /** The names of the filters of the user */
1642
+ personal?: string[];
1643
+ /**
1644
+ * The menu is open, and the pointer is on the filter with this name, when
1645
+ * it is set
1646
+ */
1647
+ menu?: {
1648
+ hovered?: string;
1649
+ };
1650
+ };
1651
+ /** A source of assets of a plugin, in the menu of the upload button */
1652
+ type MediaAreaSource = {
1653
+ /** The name of the source, for example "Unsplash" */
1654
+ name: string;
1655
+ /** The icon of the plugin */
1656
+ icon: ReactNode;
1657
+ };
1658
+ /** The props of `MediaArea` */
1659
+ type MediaAreaProps = {
1660
+ /**
1661
+ * The title of the page: the collection, or all the assets
1662
+ * @default "All assets"
1663
+ */
1664
+ title?: TextMessage;
1665
+ /** The number of assets, next to the title */
1666
+ count: number;
1667
+ /** The assets of the grid, in the order of the grid */
1668
+ assets: MediaAreaAsset[];
1669
+ /**
1670
+ * The width of a card, in px. The height is 3/4 of the width, as in the
1671
+ * cms. With `gridWidth`, it is the target width of the cms: the real width
1672
+ * is the nearest width that fills the row.
1673
+ * @default 180
1674
+ */
1675
+ cardWidth?: number;
1676
+ /**
1677
+ * The width of the grid in the screen, in px. The cms measures the grid; a
1678
+ * scene gives it. With it, the cards fill each row as in the cms: the
1679
+ * number of cards in a row is the nearest to the width of the grid
1680
+ * divided by `cardWidth` and the gutter, and all the cards have the same
1681
+ * width. Without it, each card has the width `cardWidth`.
1682
+ */
1683
+ gridWidth?: number;
1684
+ /**
1685
+ * The saved filters. Without them, the title bar has no menu of the saved
1686
+ * filters, as in the cms.
1687
+ */
1688
+ savedFilters?: MediaAreaSavedFilters;
1689
+ /**
1690
+ * The sources of the plugins. With at least one, the upload button is a
1691
+ * split button with a menu of the sources, as in the cms.
1692
+ */
1693
+ sources?: MediaAreaSource[];
1694
+ /**
1695
+ * The menu of the upload button is open, and the pointer is on the source
1696
+ * at this index of `sources`, when it is set
1697
+ */
1698
+ uploadMenu?: {
1699
+ hovered?: number;
1700
+ };
1701
+ };
1702
+ /** A collection of the sidebar of the media area */
1703
+ type MediaAreaCollection = {
1704
+ /** A key that is unique in the tree */
1705
+ id: string;
1706
+ /** The name of the collection. An emoji at the start becomes the icon. */
1707
+ name: string;
1708
+ /**
1709
+ * The collection shows its collections
1710
+ * @default false
1711
+ */
1712
+ open?: boolean;
1713
+ /**
1714
+ * The collection of the page
1715
+ * @default false
1716
+ */
1717
+ active?: boolean;
1718
+ /** The collections in the collection */
1719
+ children?: MediaAreaCollection[];
1720
+ };
1721
+ /** The props of `MediaArea.Sidebar` */
1722
+ type MediaAreaSidebarProps = {
1723
+ /** The collections at the first level of the tree */
1724
+ collections: MediaAreaCollection[];
1725
+ };
1726
+ /**
1727
+ * The page of the media library: its toolbar and the grid of the assets,
1728
+ * the same parts as in the cms
1729
+ */
1730
+ declare function MediaAreaPage({ title, count, assets, cardWidth, gridWidth, savedFilters, sources, uploadMenu }: MediaAreaProps): React.JSX.Element;
1731
+ /**
1732
+ * The sidebar of the media area: "All assets", then the tree of the
1733
+ * collections. "All assets" is active when no collection is.
1734
+ */
1735
+ declare function Sidebar({ collections }: MediaAreaSidebarProps): React.JSX.Element;
1736
+ declare const MediaArea: typeof MediaAreaPage & {
1737
+ Sidebar: typeof Sidebar;
1738
+ };
1739
+ //#endregion
1740
+ //#region src/parts/ModelPage/ModelPage.d.ts
1741
+ /** A field of the model, in the list of the page */
1742
+ type ModelPageField = {
1743
+ /** The type of the field: its icon, its colors and its name */
1744
+ type: FieldType;
1745
+ /** The label of the field, for example "Hero image" */
1746
+ label: string;
1747
+ /** The API key of the field, for example "hero_image" */
1748
+ apiKey: string;
1749
+ /**
1750
+ * The field has the validator "required": a star after the label
1751
+ * @default false
1752
+ */
1753
+ required?: boolean;
1754
+ /**
1755
+ * The field is localized: the icon of the locales after the label
1756
+ * @default false
1757
+ */
1758
+ localized?: boolean;
1759
+ /**
1760
+ * The models that a link field accepts, with the emoji at the start of
1761
+ * their name, for example "🗂️ Categories". One model is a pill with its
1762
+ * icon, as in the cms.
1763
+ */
1764
+ links?: string[];
1765
+ };
1766
+ /** The props of `ModelPage` */
1767
+ type ModelPageProps = {
1768
+ /** The model of the page: its name without the emoji, for example "Products" */
1769
+ model: string;
1770
+ /** The emoji of the model, before its name in the title */
1771
+ emoji?: string;
1772
+ /** The fields of the model, in their order */
1773
+ fields: ModelPageField[];
1774
+ /**
1775
+ * The API key of the field that the pointer clicks, with
1776
+ * FIELD_SETTINGS_SEQUENCE: the click opens the dialog of the field
1777
+ * (`FieldSettings`). Without the sequence the dialog covers it.
1778
+ */
1779
+ clicked?: string;
1780
+ };
1781
+ /**
1782
+ * The page of a model in the schema of the cms: the toolbar with the button
1783
+ * "Add new field" closed, then the fields of the model, each in its card
1784
+ * with the grip that drags it. The cms shows the menu of a field on hover:
1785
+ * the scene shows none.
1786
+ */
1787
+ export declare function ModelPage({ model, emoji, fields, clicked }: ModelPageProps): React.JSX.Element;
1788
+ //#endregion
1789
+ //#region src/parts/ModelSettings/ModelSettings.d.ts
1790
+ /** A switch of the tab "Settings" of a model */
1791
+ type ModelSetting = 'draftMode' | 'draftSaving' | 'allLocalesRequired' | 'inverseRelationships';
1792
+ /** The props of `ModelSettings` */
1793
+ type ModelSettingsProps = {
1794
+ /**
1795
+ * The switches of the tab "Settings", in the order to show them, with
1796
+ * their values. The cms shows `draftMode`, `draftSaving`,
1797
+ * `allLocalesRequired`, then `inverseRelationships`: a scene can put the
1798
+ * switch that it shows first.
1799
+ */
1800
+ settings: {
1801
+ name: ModelSetting;
1802
+ on: boolean;
1803
+ }[];
1804
+ };
1805
+ /**
1806
+ * The dialog "Edit model" of the cms, at rest, on its tab "Settings": the
1807
+ * switches of the model, with their hints. The other tabs are closed.
1808
+ */
1809
+ export declare function ModelSettings({ settings }: ModelSettingsProps): React.JSX.Element;
1810
+ //#endregion
1811
+ //#region ../ui-static/src/form/SeoInput.d.ts
1812
+ /** The previews of the SEO field, with the names of the cms */
1813
+ type SeoPreviewType = 'google' | 'twitter' | 'facebook' | 'linkedin' | 'slack' | 'whatsapp' | 'telegram';
1814
+ /** An image of a preview: the share image or the favicon of the site */
1815
+ type SeoPreviewImage = {
1816
+ /** The URL of the image, at the size of the preview */
1817
+ src: string;
1818
+ /** The width of the original image, in px */
1819
+ width: number;
1820
+ /** The height of the original image, in px */
1821
+ height: number;
1822
+ };
1823
+ //#endregion
1824
+ //#region src/parts/SeoInput/SeoInput.d.ts
1825
+ /** A preview of the SEO field: a search engine, a social network or a chat app */
1826
+ type SeoInputPreview = SeoPreviewType;
1827
+ /** An image of a preview, at its real size */
1828
+ type SeoInputImage = SeoPreviewImage & {
1829
+ /** The alt text of the upload. `SeoDialog` shows it under the image. */
1830
+ alt?: Message;
1831
+ };
1832
+ /** The page that the SEO field describes, and the texts of its previews */
1833
+ type SeoInputPage = {
1834
+ /** The URL of the page, for example "https://example.com/blog/hello" */
1835
+ url: string;
1836
+ /** The name of the site, as in the SEO settings of the project */
1837
+ siteName: string;
1838
+ /**
1839
+ * The title of the page. The previews show it as given: write it short,
1840
+ * as the cms truncates the title of Google at 60 characters.
1841
+ */
1842
+ title: string;
1843
+ /**
1844
+ * The text that Google adds after the title, for example " - Field
1845
+ * Notes": the title suffix of the SEO settings of the project
1846
+ */
1847
+ titleSuffix?: string;
1848
+ /**
1849
+ * The description of the page. Google shows it as given: write it short,
1850
+ * as the cms truncates it at 160 characters.
1851
+ */
1852
+ description: string;
1853
+ /** The share image */
1854
+ image?: SeoInputImage;
1855
+ /** The favicon of the site. Without it, Google shows a globe. */
1856
+ favicon?: SeoInputImage;
1857
+ /**
1858
+ * The card of X: `summary` puts a square image beside the text
1859
+ * @default 'summary_large_image'
1860
+ */
1861
+ twitterCard?: 'summary' | 'summary_large_image';
1862
+ /**
1863
+ * The text of the posts of X, Facebook and LinkedIn, before the link.
1864
+ * Without it, the placeholder of the cms (Lorem ipsum).
1865
+ */
1866
+ post?: string;
1867
+ /** The time of the messages of the chat apps, for example "09:41" */
1868
+ time: string;
1869
+ /** The date of the posts of X, for example "Mar 4" */
1870
+ date: string;
1871
+ };
1872
+ /** The props of `RecordForm.SeoInput` */
1873
+ type RecordFormSeoInputProps = {
1874
+ /** The previews of the field, in the bar, in the order of the cms */
1875
+ previews: SeoInputPreview[];
1876
+ /** The preview that the field shows */
1877
+ current: SeoInputPreview;
1878
+ /** The page and the texts of the previews */
1879
+ page: SeoInputPage;
1880
+ /**
1881
+ * With SEO_EDIT_SEQUENCE: the pointer comes to the Edit button and
1882
+ * clicks it, and the `SeoDialog` with `over` opens
1883
+ * @default false
1884
+ */
1885
+ edit?: boolean;
1886
+ };
1887
+ /**
1888
+ * The steps of a click on the Edit button of the SEO field (`edit`), that
1889
+ * opens the `SeoDialog` with `over`. The last step is the open dialog: the
1890
+ * picture at rest.
1891
+ */
1892
+ export declare const SEO_EDIT_SEQUENCE: StageSequence;
1893
+ /**
1894
+ * The SEO field of a record with a value: the bar with the previews and the
1895
+ * Edit button, and the current preview
1896
+ */
1897
+ declare function SeoInput({ previews, current, page, edit }: RecordFormSeoInputProps): React.JSX.Element;
1898
+ /** The props of `SeoDialog` */
1899
+ type SeoDialogProps = {
1900
+ /**
1901
+ * The page: the dialog shows its title, its description and its share
1902
+ * image, with its alt text. Without an image, the field of the image
1903
+ * does not show.
1904
+ */
1905
+ page: SeoInputPage;
1906
+ /**
1907
+ * The dialog is over the other parts of the screen, with the backdrop of
1908
+ * the cms: put it after the `RecordEditorLayout`, in the same `Stage`.
1909
+ * With SEO_EDIT_SEQUENCE it opens after the click on the Edit button.
1910
+ * Without `over`, the dialog is alone, as `SelectivePublishing`.
1911
+ * @default false
1912
+ */
1913
+ over?: boolean;
1914
+ };
1915
+ /**
1916
+ * The dialog "Edit SEO settings" of the cms, at rest, that the Edit button
1917
+ * of the SEO field opens: the title, the description and the share image of
1918
+ * the page, with the hints of the cms. The settings of the field can hide
1919
+ * the Twitter (X) card type and the switch "noindex", thus the dialog does
1920
+ * not show them.
1921
+ */
1922
+ export declare function SeoDialog({ page, over }: SeoDialogProps): React.JSX.Element;
1923
+ /**
1924
+ * The steps of `SeoPreviewStack`: each card comes to the front in turn, for
1925
+ * 5 seconds. The stack has each card twice, thus there are six steps.
1926
+ */
1927
+ export declare const PREVIEW_STACK_SEQUENCE: StageSequence;
1928
+ /** The props of `SeoPreviewStack` */
1929
+ type SeoPreviewStackProps = {
1930
+ /** The previews of the field, in the bar, in the order of the cms */
1931
+ previews: SeoInputPreview[];
1932
+ /** The three previews of the cards, the front one first */
1933
+ cards: [SeoInputPreview, SeoInputPreview, SeoInputPreview];
1934
+ /** The page and the texts of the previews */
1935
+ page: SeoInputPage;
1936
+ };
1937
+ /**
1938
+ * The SEO field three times, in a stack of cards: each card shows another
1939
+ * preview of the same page, and the two cards behind peek out at the top.
1940
+ * With PREVIEW_STACK_SEQUENCE the front card leaves and the next comes
1941
+ * forward, in a loop. The stack has each card twice: a card that leaves
1942
+ * goes to the back unseen, while its copy comes in behind the others.
1943
+ */
1944
+ export declare function SeoPreviewStack({ previews, cards, page }: SeoPreviewStackProps): React.JSX.Element;
1945
+ //#endregion
1946
+ //#region src/parts/RecordForm/Body.d.ts
1947
+ /** The props of `RecordForm.Body` */
1948
+ type RecordFormBodyProps = {
1949
+ /** The fields: `RecordForm.Field` elements */
1950
+ children: ReactNode;
1951
+ };
1952
+ /** The props of `RecordForm.Above` */
1953
+ type RecordFormAboveProps = {
1954
+ /** The fields above the highlighted field: `RecordForm.Field` elements */
1955
+ children: ReactNode;
1956
+ };
1957
+ /**
1958
+ * The column of the fields of the record editor (`ItemFormContent` of
1959
+ * ui-static), without the toolbar and the pane: at most 800px wide, in the
1960
+ * center of the screen. Use it for a scene that shows only some fields.
1961
+ */
1962
+ declare function Body({ children }: RecordFormBodyProps): React.JSX.Element;
1963
+ /**
1964
+ * The fields above the highlighted field. The cms scrolls the form to the
1965
+ * highlighted field, with a margin of 40px above it (scroll-margin-top of
1966
+ * `.form__field`): these fields go up, out of the view. The scene has no
1967
+ * script to scroll, thus `Body` moves these fields and the fields after
1968
+ * them up in one box, by the height of these fields (see
1969
+ * `.SceneFormScroll`). Outside a `RecordForm`, the fields do not move.
1970
+ */
1971
+ declare function Above({ children }: RecordFormAboveProps): React.JSX.Element;
1972
+ //#endregion
1973
+ //#region src/parts/RecordForm/PluginIcon.d.ts
1974
+ declare const ICONS: {
1975
+ 'chart-column': React.FunctionComponent<React.SVGProps<SVGSVGElement> & {
1976
+ title?: string;
1977
+ titleId?: string;
1978
+ desc?: string;
1979
+ descId?: string;
1980
+ }>;
1981
+ globe: React.FunctionComponent<React.SVGProps<SVGSVGElement> & {
1982
+ title?: string;
1983
+ titleId?: string;
1984
+ desc?: string;
1985
+ descId?: string;
1986
+ }>;
1987
+ language: React.FunctionComponent<React.SVGProps<SVGSVGElement> & {
1988
+ title?: string;
1989
+ titleId?: string;
1990
+ desc?: string;
1991
+ descId?: string;
1992
+ }>;
1993
+ };
1994
+ /** The name of an icon of a plugin action that the kit has */
1995
+ type PluginIconName = keyof typeof ICONS;
1996
+ //#endregion
1997
+ //#region src/parts/RecordForm/FieldMenu.d.ts
1998
+ /** The open menu of `RecordForm.Field` */
1999
+ type RecordFormFieldMenu = {
2000
+ /**
2001
+ * The API key of the field. The menu starts with the option of the cms
2002
+ * for a user that can edit the schema ("Go to <api key> field"), then a
2003
+ * separator. Without it, the menu has only the actions of the plugins.
2004
+ */
2005
+ apiKey?: string;
2006
+ /**
2007
+ * The actions that the plugins add (`fieldDropdownActions` of the plugin
2008
+ * SDK), in their order
2009
+ */
2010
+ actions: RecordFormFieldMenuItem[];
2011
+ };
2012
+ /**
2013
+ * An action of a plugin in the menu of a field. With `actions`, it is a
2014
+ * group: an option that opens a submenu with these actions.
2015
+ */
2016
+ type RecordFormFieldMenuItem = {
2017
+ /** The label of the action */
2018
+ label: TextMessage;
2019
+ /** The icon of the action: the name of a Font Awesome icon, as a plugin gives it */
2020
+ icon?: PluginIconName;
2021
+ /** The actions of the submenu of a group */
2022
+ actions?: {
2023
+ label: TextMessage;
2024
+ icon?: PluginIconName;
2025
+ }[];
2026
+ /**
2027
+ * The submenu of the group is open, at the right of the option, as in
2028
+ * the cms when the pointer is on the option. Give it to one group.
2029
+ * @default false
2030
+ */
2031
+ open?: boolean;
2032
+ };
2033
+ /**
2034
+ * The steps of the open menu of `RecordForm.Field` (`menu`), for the
2035
+ * `sequence` of `Stage`: the "⋮" button of the field, then the menu open
2036
+ * under it, then the submenu of the group with `open` at its right. The
2037
+ * last step is the picture at rest.
2038
+ */
2039
+ export declare const FIELD_MENU_SEQUENCE: StageSequence;
2040
+ //#endregion
2041
+ //#region src/parts/RecordForm/Field.d.ts
2042
+ /** The props of `RecordForm.Field` */
2043
+ type RecordFormFieldProps = {
2044
+ /** The name of the field */
2045
+ label: Message;
2046
+ /**
2047
+ * Adds an asterisk to the label
2048
+ * @default false
2049
+ */
2050
+ required?: boolean;
2051
+ /**
2052
+ * Adds the icon that tells that the value is different for each locale
2053
+ * @default false
2054
+ */
2055
+ localized?: boolean;
2056
+ /** A short help under the input */
2057
+ hint?: Message;
2058
+ /**
2059
+ * The error of the value, as the cms shows it after the user saves: the
2060
+ * message under the input, above the hint, and the label in the danger
2061
+ * color. Give the text of the cms, for example "Image must be at least
2062
+ * 1200x675px" (the message `fieldError.VALIDATION_IMAGE_DIMENSIONS`).
2063
+ */
2064
+ error?: Message;
2065
+ /**
2066
+ * The input: a part of `RecordForm`, `StructuredTextInput`, or an input
2067
+ * of the kit with a constant value
2068
+ */
2069
+ children: ReactNode;
2070
+ /**
2071
+ * The same input with the value that another user saves. With
2072
+ * COLLABORATION_SEQUENCE it takes the place of `children` at the step
2073
+ * "saved", with a short highlight. Without the sequence, it does not
2074
+ * show: the picture is the record while the other user still edits it.
2075
+ */
2076
+ saved?: ReactNode;
2077
+ /**
2078
+ * The pointer of the user that looks at the record, on the input. For a
2079
+ * `RecordForm` with a `collaborator`: the picture shows the pointer on
2080
+ * the read-only input, with the cursor of the cms for a disabled input
2081
+ * (not-allowed). With COLLABORATION_SEQUENCE, the pointer comes at the
2082
+ * step "locked" and its click does nothing; at the step "saved" it shows
2083
+ * the cursor of a text, as the input is not read only anymore. Give it
2084
+ * to one field.
2085
+ * @default false
2086
+ */
2087
+ pointer?: boolean;
2088
+ /**
2089
+ * The cms highlights the field, as after a click on its value in the
2090
+ * preview of the website (the hash "#fieldPath=" of the URL). Put the
2091
+ * fields above it in a `RecordForm.Above`: the form shows scrolled to
2092
+ * the field. In a panel of `VisualEditorLayout`, the form opens at its
2093
+ * top, and one second later it scrolls to the field and the highlight
2094
+ * plays, as in the cms, each time that the panel shows.
2095
+ * @default false
2096
+ */
2097
+ highlighted?: boolean;
2098
+ /**
2099
+ * The menu of the field is open: the "⋮" button at the end of the label,
2100
+ * and its menu under it, as in the cms after a click on the button
2101
+ */
2102
+ menu?: RecordFormFieldMenu;
2103
+ };
2104
+ /** A field of the record: the label and the input */
2105
+ declare function Field({ label, required, localized, hint, error, children, saved, pointer, highlighted, menu }: RecordFormFieldProps): React.JSX.Element;
2106
+ //#endregion
2107
+ //#region src/parts/RecordForm/FileInput.d.ts
2108
+ /** The props of `RecordForm.FileInput`: an image or a media, not the two */
2109
+ type RecordFormFileInputProps = ({
2110
+ /**
2111
+ * The image of the upload, at its real size. The card fits it in a
2112
+ * box 200px high, with 10px around it, as the cms.
2113
+ */
2114
+ image: {
2115
+ src: string;
2116
+ width: number;
2117
+ height: number;
2118
+ };
2119
+ media?: never;
2120
+ } | {
2121
+ image?: never;
2122
+ /**
2123
+ * A picture of the upload that is not an image, for example a video
2124
+ * that the host plays. `width` and `height` give only its ratio: the
2125
+ * card makes it as large as the box, with 10px around it, and never
2126
+ * wider than the card. The node fills the size that the card gives.
2127
+ */
2128
+ media: {
2129
+ node: ReactNode;
2130
+ width: number;
2131
+ height: number;
2132
+ };
2133
+ }) & {
2134
+ /** The text under the image, for example the alt text or "No metadata set" */
2135
+ caption?: Message;
2136
+ };
2137
+ declare function FileInput({ image, media, caption }: RecordFormFileInputProps): React.JSX.Element;
2138
+ //#endregion
2139
+ //#region src/parts/RecordForm/GalleryInput.d.ts
2140
+ /** The props of `RecordForm.GalleryInput` */
2141
+ type RecordFormGalleryInputProps = {
2142
+ /** The uploads, in the order of the gallery */
2143
+ images: {
2144
+ /**
2145
+ * The image, at its real size. The card fits it in a box 100px high,
2146
+ * with 10px around it, as the cms.
2147
+ */
2148
+ src: string;
2149
+ width: number;
2150
+ height: number;
2151
+ /**
2152
+ * The alt text of the upload. The card shows it when the image has no
2153
+ * title.
2154
+ */
2155
+ alt?: Message;
2156
+ /**
2157
+ * The title that the record sets on the upload. The card shows it in
2158
+ * the ink color, as the cms does when the record and the upload both
2159
+ * have a title.
2160
+ */
2161
+ title?: Message;
2162
+ /**
2163
+ * The text under the image when it has no alt and no title. The
2164
+ * default is "No metadata set".
2165
+ */
2166
+ caption?: Message;
2167
+ }[];
2168
+ };
2169
+ declare function GalleryInput({ images }: RecordFormGalleryInputProps): React.JSX.Element;
2170
+ //#endregion
2171
+ //#region src/parts/RecordForm/LocaleTabs.d.ts
2172
+ /** The locale tabs of `RecordForm` */
2173
+ type RecordFormLocales = {
2174
+ /** The locales of the record, in the order of the project */
2175
+ tabs: {
2176
+ /** The code of the locale, for example "it" */
2177
+ locale: string;
2178
+ /** The name of the locale, for example "Italian" */
2179
+ label: TextMessage;
2180
+ /**
2181
+ * A field of this locale has an error: the tab shows the triangle
2182
+ * @default false
2183
+ */
2184
+ hasErrors?: boolean;
2185
+ }[];
2186
+ /** The code of the locale that the form shows */
2187
+ active: string;
2188
+ /**
2189
+ * The button that manages the locales of the record, at the right end
2190
+ * @default true
2191
+ */
2192
+ manage?: boolean;
2193
+ /**
2194
+ * The menu of the manage button is open, under the button: the locales
2195
+ * of the record, to switch to one or to remove some, then the locales of
2196
+ * the project that the record does not have, to add them. Give it with
2197
+ * `manage`.
2198
+ */
2199
+ menu?: {
2200
+ /** The locales of the project that the record does not have */
2201
+ missing?: {
2202
+ locale: string;
2203
+ label: TextMessage;
2204
+ }[];
2205
+ /**
2206
+ * The model has "All locales required": the editor cannot add or remove
2207
+ * a locale, thus the menu only switches
2208
+ * @default false
2209
+ */
2210
+ allLocalesRequired?: boolean;
2211
+ };
2212
+ };
2213
+ //#endregion
2214
+ //#region src/parts/RecordForm/Plugin.d.ts
2215
+ /** The props of `RecordForm.Outlet` */
2216
+ type RecordFormOutletProps = {
2217
+ /**
2218
+ * The content of the plugin, from the website: the cms shows the page of
2219
+ * the plugin in a frame without a border
2220
+ */
2221
+ children: ReactNode;
2222
+ };
2223
+ /**
2224
+ * An outlet of a plugin above the fields (the hook renderItemFormOutlet of
2225
+ * the plugin SDK). Put it in RecordForm.Body before the first field. The
2226
+ * spaces are the spaces of the cms (ItemFormOutlets of apps/cms): a space
2227
+ * under the outlets, a space above each outlet, and the padding of the
2228
+ * page of the plugin. The kit draws no frame: the frame of a plugin has no
2229
+ * border and no surface.
2230
+ */
2231
+ declare function Outlet({ children }: RecordFormOutletProps): React.JSX.Element;
2232
+ /** The props of `RecordForm.PluginInput` */
2233
+ type RecordFormPluginInputProps = {
2234
+ /**
2235
+ * The editor of the plugin, from the website: the cms shows it in a
2236
+ * frame without a border
2237
+ */
2238
+ children: ReactNode;
2239
+ };
2240
+ /**
2241
+ * The editor of a field that a plugin gives (the hook renderFieldExtension
2242
+ * of the plugin SDK). Put it in RecordForm.Field in place of an input. The
2243
+ * space above the frame is the space of the cms (_PluginInput.css of
2244
+ * apps/cms). The kit draws no frame: the frame of a plugin has no border
2245
+ * and no surface.
2246
+ */
2247
+ declare function PluginInput({ children }: RecordFormPluginInputProps): React.JSX.Element;
2248
+ //#endregion
2249
+ //#region src/parts/RecordForm/SlugInput.d.ts
2250
+ /** The props of `RecordForm.SlugInput` */
2251
+ type RecordFormSlugInputProps = {
2252
+ /** The URL before the slug, for example "https://www.datocms.com/blog/" */
2253
+ prefix: string;
2254
+ /** The slug */
2255
+ value: string;
2256
+ };
2257
+ declare function SlugInput({ prefix, value }: RecordFormSlugInputProps): React.JSX.Element;
2258
+ //#endregion
2259
+ //#region src/parts/RecordForm/StringInput.d.ts
2260
+ /** The props of `RecordForm.StringInput` */
2261
+ type RecordFormStringInputProps = {
2262
+ /** The text in the input */
2263
+ value: string;
2264
+ /**
2265
+ * The large text of the field that gives the title of the record
2266
+ * @default false
2267
+ */
2268
+ large?: boolean;
2269
+ };
2270
+ /** A single-line text field */
2271
+ declare function RecordStringInput({ value, large }: RecordFormStringInputProps): React.JSX.Element;
2272
+ //#endregion
2273
+ //#region src/parts/RecordForm/TextareaInput.d.ts
2274
+ /** The props of `RecordForm.TextareaInput` */
2275
+ type RecordFormTextareaInputProps = {
2276
+ /** The text in the input */
2277
+ value: string;
2278
+ /**
2279
+ * The height of the input, in lines. The cms makes the input as high as
2280
+ * its text, but a scene has no JS: give enough lines for the text, or
2281
+ * use `grow`.
2282
+ * @default 2
2283
+ */
2284
+ rows?: number;
2285
+ /**
2286
+ * The input is as high as all its text, as in the cms, also when the
2287
+ * width of the screen changes. CSS does it (`field-sizing`): a browser
2288
+ * without it shows `rows` lines. A short text makes the input lower than
2289
+ * `rows`, thus use it for a long text.
2290
+ * @default false
2291
+ */
2292
+ grow?: boolean;
2293
+ };
2294
+ /** A multi-line text field */
2295
+ declare function RecordTextareaInput({ value, rows, grow }: RecordFormTextareaInputProps): React.JSX.Element;
2296
+ //#endregion
2297
+ //#region src/parts/RecordForm/VideoInput.d.ts
2298
+ /** The props of `RecordForm.VideoInput` */
2299
+ type RecordFormVideoInputProps = {
2300
+ /**
2301
+ * The thumbnail that the provider gives, at its real size (YouTube: 16:9).
2302
+ * The CSS of the cms fits it in a box 200px high, with 10px around it.
2303
+ */
2304
+ thumbnail: {
2305
+ src: string;
2306
+ width: number;
2307
+ height: number;
2308
+ };
2309
+ /** The title of the video, from the provider: the caption of the card */
2310
+ title: Message;
2311
+ /**
2312
+ * The pointer is on the card: the actions of the cms show on the
2313
+ * thumbnail. A locked field shows only "Open video", as in the cms.
2314
+ */
2315
+ hovered?: boolean;
2316
+ };
2317
+ declare function VideoInput({ thumbnail, title, hovered }: RecordFormVideoInputProps): React.JSX.Element;
2318
+ //#endregion
2319
+ //#region src/parts/RecordForm/RecordForm.d.ts
2320
+ /** The props of `RecordForm` */
2321
+ type RecordFormProps = {
2322
+ /** The title of the record, in the toolbar */
2323
+ title: Message;
2324
+ /**
2325
+ * The title after the other user saves. With COLLABORATION_SEQUENCE it
2326
+ * takes the place of `title` at the step "saved". For a `collaborator`.
2327
+ */
2328
+ savedTitle?: Message;
2329
+ /** The icon before the title: the emoji of the model, as in the cms */
2330
+ icon?: ReactNode;
2331
+ /** The fields: `RecordForm.Field` elements */
2332
+ children: ReactNode;
2333
+ /**
2334
+ * The locales of the record: the tabs in the short toolbar under the
2335
+ * title, as in the cms for a model with localized fields
2336
+ */
2337
+ locales?: RecordFormLocales;
2338
+ /**
2339
+ * The publishing status of the record, in the toolbar before the publish
2340
+ * button, with the long names of the cms ("Unpublished changes"). Without
2341
+ * it, the toolbar shows no status.
2342
+ */
2343
+ status?: RecordStatus;
2344
+ /**
2345
+ * The form has changes that the user did not save. As in the cms, the
2346
+ * status tells it ("Draft (unsaved changes)"), and the button Save takes
2347
+ * the place of the publish button. "until-saved": the user saves the
2348
+ * changes. With PREVIEW_RELOAD_SEQUENCE, the steps "editing" and
2349
+ * "click-save" show the unsaved changes, and the pointer clicks Save. The
2350
+ * other steps show the saved record. "after-translations": the panel AI
2351
+ * Translations writes the changes. With AI_TRANSLATIONS_SEQUENCE, the
2352
+ * steps "rest", "click" and "batch-1" show the saved record, and the
2353
+ * other steps show the unsaved changes.
2354
+ * @default false
2355
+ */
2356
+ dirty?: boolean | 'until-saved' | 'after-translations';
2357
+ /**
2358
+ * The model of the record has draft/publish. When it is false, as in the
2359
+ * cms, a save publishes the record: the toolbar has no publish button,
2360
+ * and the button Save is disabled when the form has no changes.
2361
+ * @default true
2362
+ */
2363
+ draftMode?: boolean;
2364
+ /**
2365
+ * Another user has the record open and edits it: the toolbar shows their
2366
+ * avatar after the title, with the ring of the user that edits, and the
2367
+ * lock in place of the status and of the publish button. The fields are
2368
+ * read only. The user that looks cannot take over the record: the
2369
+ * toolbar has no button. With COLLABORATION_SEQUENCE, the steps before
2370
+ * the last take back the lock.
2371
+ */
2372
+ collaborator?: RecordFormCollaborator;
2373
+ /**
2374
+ * The other users that have the record open and only look at it: the
2375
+ * toolbar shows their avatars after the menu of the record, with no
2376
+ * ring, as the cms shows them to the user that edits. The record is not
2377
+ * locked. Not with `collaborator`.
2378
+ */
2379
+ viewers?: RecordFormViewer[];
2380
+ /**
2381
+ * A layer from the website over the publish button, for example a ring
2382
+ * and a tag that tell the name of a hook (onBeforeItemsPublish). The
2383
+ * button does not change.
2384
+ */
2385
+ publishMark?: ReactNode;
2386
+ };
2387
+ /** The user that edits the record, in `RecordForm` */
2388
+ type RecordFormCollaborator = {
2389
+ /** The name of the user, for example "Maya Lindqvist" */
2390
+ name: string;
2391
+ /** The email of the user: it picks the color of the initials */
2392
+ email?: string;
2393
+ /** The image of the avatar. Without it, the avatar shows the initials. */
2394
+ imageUrl?: string;
2395
+ /** When the user started to edit, as the cms formats it: "10:42" */
2396
+ since: string;
2397
+ };
2398
+ /** A user that looks at the record, in `RecordForm` `viewers` */
2399
+ type RecordFormViewer = Omit<RecordFormCollaborator, 'since'>;
2400
+ /** The record editor of the cms: the toolbar and the fields of the record */
2401
+ declare function RecordForm({ title, savedTitle, icon, children, locales, status, dirty, draftMode, collaborator, viewers, publishMark }: RecordFormProps): React.JSX.Element;
2402
+ declare const RecordFormWithParts: typeof RecordForm & {
2403
+ Body: typeof Body;
2404
+ Above: typeof Above;
2405
+ Field: typeof Field;
2406
+ StringInput: typeof RecordStringInput;
2407
+ SlugInput: typeof SlugInput;
2408
+ FileInput: typeof FileInput;
2409
+ GalleryInput: typeof GalleryInput;
2410
+ SeoInput: typeof SeoInput;
2411
+ TextareaInput: typeof RecordTextareaInput;
2412
+ VideoInput: typeof VideoInput;
2413
+ Outlet: typeof Outlet;
2414
+ PluginInput: typeof PluginInput;
2415
+ };
2416
+ //#endregion
2417
+ //#region src/parts/ModularContentField/ModularContentField.d.ts
2418
+ /**
2419
+ * The steps of the open gap of `addAbove`, for the `sequence` of `Stage`:
2420
+ * the blocks at rest, the gap under the pointer, the menu open, the option
2421
+ * under the pointer, its card. The card opens after 300ms on the option, as
2422
+ * the HoverCard of the cms. The last step is the picture at rest.
2423
+ */
2424
+ export declare const ADD_BLOCK_SEQUENCE: StageSequence;
2425
+ /**
2426
+ * The steps of two drags in a loop, for the `sequence` of `Stage`: the
2427
+ * user drags a block one place down, then drags the block that went up
2428
+ * one place down. Thus the field is in its first order again, and the
2429
+ * loop has no jump. Each drag has its steps: the block that the user
2430
+ * takes, the drag, the drop, and the block in its new place with the
2431
+ * highlight of the cms. The last step is the picture at rest: the first
2432
+ * drag, with the drop line. Give `dragged` to the block, `dragBack` to the
2433
+ * next block, and `dropLine` "top" to the block after it. The blocks are
2434
+ * closed: the two blocks have the same height.
2435
+ */
2436
+ export declare const DRAG_BLOCK_SEQUENCE: StageSequence;
2437
+ /** The props of `ModularContentField` */
2438
+ type ModularContentFieldProps = Omit<RecordFormFieldProps, 'children'> & {
2439
+ /** The blocks of the field: `ModularContentField.Block` elements */
2440
+ children: ReactNode;
2441
+ };
2442
+ /** The props of `ModularContentField.Block` */
2443
+ type ModularContentBlockProps = {
2444
+ /** The name of the block model, for example "Hero" */
2445
+ name: TextMessage;
2446
+ /** The icon before the name: the emoji of the block model, as in the cms */
2447
+ icon?: ReactNode;
2448
+ /**
2449
+ * The fields of the block: `RecordForm.Field` elements. Only an open
2450
+ * block shows them.
2451
+ */
2452
+ children?: ReactNode;
2453
+ /**
2454
+ * The user drags this block. The list shows it dim and closed, as the
2455
+ * cms does. The picture of the drag, a copy of the header of the block,
2456
+ * is `x` px to the right and `y` px below the block: where the pointer
2457
+ * is. The browser draws this picture in the cms; the part places it
2458
+ * with CSS. The pointer of the drag, a closed hand, is on the chevron of
2459
+ * the picture. At the drop the picture goes in its place, and the hand
2460
+ * stays where it is.
2461
+ */
2462
+ dragged?: {
2463
+ x?: number;
2464
+ y: number;
2465
+ };
2466
+ /**
2467
+ * In DRAG_BLOCK_SEQUENCE, the user drags this block in the second drag:
2468
+ * the block before it (with `dragged`) is now below it, and this block
2469
+ * goes back below that block. Give the same offset as `dragged`. The
2470
+ * picture at rest does not show this drag.
2471
+ */
2472
+ dragBack?: {
2473
+ x?: number;
2474
+ y: number;
2475
+ };
2476
+ /**
2477
+ * The dragged block goes at this edge of the block: the cms shows the
2478
+ * drop line in the space between this block and the next one
2479
+ */
2480
+ dropLine?: 'top' | 'bottom';
2481
+ /**
2482
+ * The user clicked the gap above the block: the gap shows its button and
2483
+ * its line, and its menu is open under it, with the block models that
2484
+ * the field accepts. Give at least two models, in the order of the cms:
2485
+ * by name. The cms shows a search field above more than five models, and
2486
+ * the part does not: give five at most.
2487
+ */
2488
+ addAbove?: ModularContentAddMenu;
2489
+ } & (ModularContentBlockOpen | ModularContentBlockClosed);
2490
+ /** An open block, as in the cms at rest: it shows its fields */
2491
+ type ModularContentBlockOpen = {
2492
+ /**
2493
+ * The block is open
2494
+ * @default true
2495
+ */
2496
+ open?: true;
2497
+ summary?: never;
2498
+ summaryImage?: never;
2499
+ };
2500
+ /** A closed block: the header only, with the chevron closed */
2501
+ type ModularContentBlockClosed = {
2502
+ open: false;
2503
+ /**
2504
+ * The summary after the name: the value of the title field of the
2505
+ * block, as in the cms
2506
+ */
2507
+ summary?: Message;
2508
+ /**
2509
+ * The URL of the image before the summary: the first image of the block,
2510
+ * as in the cms. The cms shows it in a square of 20px.
2511
+ */
2512
+ summaryImage?: string;
2513
+ };
2514
+ /** The open menu of the gap above a block (`addAbove`) */
2515
+ type ModularContentAddMenu = {
2516
+ /** The block models that the field accepts, by name */
2517
+ models: ModularContentBlockModel[];
2518
+ /**
2519
+ * The option under the pointer. The option has the highlight, and when
2520
+ * its model has a `preview`, the card of the model opens at the right of
2521
+ * the option, as in the cms.
2522
+ */
2523
+ hovered?: {
2524
+ /** The index of the option in `models` */
2525
+ index: number;
2526
+ /**
2527
+ * Moves the card up (a negative value) or down, in px. The card is
2528
+ * centered on the option; the cms moves it along the option when it
2529
+ * does not fit in the window.
2530
+ * @default 0
2531
+ */
2532
+ shift?: number;
2533
+ };
2534
+ };
2535
+ /** A block model in the menu of `addAbove` */
2536
+ type ModularContentBlockModel = {
2537
+ /** The name of the block model, without the emoji */
2538
+ name: TextMessage;
2539
+ /** The emoji of the block model */
2540
+ emoji: string;
2541
+ /**
2542
+ * The preview image and the description of the block model, from its
2543
+ * settings in the schema. The cms shows them in a card when the pointer
2544
+ * is on the option.
2545
+ */
2546
+ preview?: {
2547
+ /** The URL of an image of the block, as it shows on the website */
2548
+ image?: string;
2549
+ /** The text that explains when to use the block */
2550
+ description?: Message;
2551
+ };
2552
+ };
2553
+ /**
2554
+ * A modular content field of the cms at rest: the label, then the list of
2555
+ * the blocks. The gaps between the blocks and the controls of a block show
2556
+ * only under the pointer, thus a scene does not show them, except an open
2557
+ * gap (`addAbove` of a block).
2558
+ */
2559
+ declare function ModularContentField({ label, required, localized, hint, children }: ModularContentFieldProps): React.JSX.Element;
2560
+ declare function Block$1({ name, icon, children, open, summary, summaryImage, dragged, dragBack, dropLine, addAbove }: ModularContentBlockProps): React.JSX.Element;
2561
+ declare const ModularContentFieldWithParts: typeof ModularContentField & {
2562
+ Block: typeof Block$1;
2563
+ };
2564
+ //#endregion
2565
+ //#region src/parts/NavigationBar/NavigationBar.d.ts
2566
+ /** The tabs of the bar. The CDA Playground is the last one. */
2567
+ type NavigationBarTab = 'visual' | 'content' | 'media' | 'schema' | 'configuration' | 'calendar' | 'cdaPlayground';
2568
+ /**
2569
+ * A tab that a plugin adds to the bar (the hook mainNavigationTabs of the
2570
+ * plugin SDK). It is not active: the scene shows another page.
2571
+ */
2572
+ type NavigationBarPluginTab = {
2573
+ /** A key that is unique in the bar */
2574
+ key: string;
2575
+ /** The text of the tab, for example "Reports" */
2576
+ label: string;
2577
+ /** The icon of the tab: the plugin gives the name of an icon of Font Awesome */
2578
+ icon: PluginIconName;
2579
+ /**
2580
+ * The tab of the cms before the plugin tab, as the placement
2581
+ * ['after', …] of the hook
2582
+ */
2583
+ after: 'content' | 'media' | 'schema' | 'configuration';
2584
+ /**
2585
+ * A layer over the tab, from the website (for example a ring and a tag
2586
+ * that tell the name of the hook). The tab does not clip it.
2587
+ */
2588
+ mark?: ReactNode;
2589
+ };
2590
+ /** The props of `NavigationBar` */
2591
+ type NavigationBarProps = {
2592
+ /**
2593
+ * The tab of the page that the scene shows
2594
+ * @default 'content'
2595
+ */
2596
+ activeTab?: NavigationBarTab;
2597
+ /**
2598
+ * The type of the environment in the switcher
2599
+ * @default 'primary'
2600
+ */
2601
+ environment?: 'primary' | 'sandbox';
2602
+ /**
2603
+ * The project at the start of the bar. With `logoUrl`, the bar shows the
2604
+ * logo, else it shows the name, as the cms does for a project without a
2605
+ * logo. The kit has no logo of its own: the scene is about a project of
2606
+ * the user, never about DatoCMS.
2607
+ * @default { name: 'Acme Inc.' }
2608
+ */
2609
+ project?: {
2610
+ name: string;
2611
+ logoUrl?: string;
2612
+ };
2613
+ /** The user at the end of the bar. Without `imageUrl`, the avatar shows the initials. */
2614
+ user: {
2615
+ name: string;
2616
+ imageUrl?: string;
2617
+ };
2618
+ /** The tabs that plugins add, each after a tab of the cms */
2619
+ pluginTabs?: NavigationBarPluginTab[];
2620
+ };
2621
+ /**
2622
+ * The navigation bar of the cms, made of the parts of ui-static/NavigationBar.
2623
+ * All the tabs show: a scene does not measure the bar.
2624
+ */
2625
+ export declare function NavigationBar({ activeTab, environment, project, user, pluginTabs }: NavigationBarProps): React.JSX.Element;
2626
+ //#endregion
2627
+ //#region src/parts/PluginList/PluginList.d.ts
2628
+ /** A plugin of the project, in `PluginList` */
2629
+ type PluginListPlugin = {
2630
+ /** The name of the plugin, for example "Web Previews" */
2631
+ name: string;
2632
+ /**
2633
+ * The plugin is private: it has no package on npm. The row shows the
2634
+ * pill "Private".
2635
+ * @default false
2636
+ */
2637
+ private?: boolean;
2638
+ /**
2639
+ * The plugin is disabled: the row is muted and shows the pill "Disabled"
2640
+ * @default false
2641
+ */
2642
+ disabled?: boolean;
2643
+ /**
2644
+ * The dominant color of the cover of the plugin in the plugin directory, a CSS
2645
+ * color. The initials are on it. Without it, the initials are on the
2646
+ * neutral surface, as in the cms for a private plugin or a plugin whose
2647
+ * cover did not load.
2648
+ */
2649
+ color?: string;
2650
+ };
2651
+ /** The props of `PluginList` */
2652
+ type PluginListProps = {
2653
+ /**
2654
+ * The plugins of the project. The list sorts them by name, as the cms
2655
+ * does.
2656
+ */
2657
+ plugins: PluginListPlugin[];
2658
+ };
2659
+ /**
2660
+ * The list of the plugins in the environment configuration (Sidebar of
2661
+ * configuration/plugins in apps/cms): the title with its presets and its
2662
+ * help, the button "Browse plugins" (with "Add new private plugin" in its
2663
+ * menu) and a row for each plugin, with its initials and a pill for a
2664
+ * private or disabled plugin. In the cms the list is a secondary pane of
2665
+ * 300px, thus the button shows only its icon. Put it in the `list` column
2666
+ * of `RecordEditorLayout`, after `ConfigurationMenu`. The texts of this
2667
+ * screen are in the locales of the admin area of the cms, not in the
2668
+ * locales of the kit: thus they are in English here.
2669
+ */
2670
+ export declare function PluginList({ plugins }: PluginListProps): React.JSX.Element;
2671
+ /** The props of `ConfigurationMenu` */
2672
+ type ConfigurationMenuProps = {
2673
+ /**
2674
+ * The page of the menu that the scene shows
2675
+ * @default 'plugins'
2676
+ */
2677
+ active?: 'localesAndTimezone' | 'appearance' | 'plugins' | 'workflows';
2678
+ };
2679
+ /**
2680
+ * The menu of the environment configuration (Sidebar of configuration in
2681
+ * apps/cms), for a user who can change the schema and the users: the
2682
+ * groups Environment properties and Environment permissions, and the note
2683
+ * at the bottom. Put it in the `sidebar` column of `RecordEditorLayout`,
2684
+ * with the tab Configuration of `NavigationBar` active. The texts are in
2685
+ * English, as in `PluginList`.
2686
+ */
2687
+ export declare function ConfigurationMenu({ active }: ConfigurationMenuProps): React.JSX.Element;
2688
+ //#endregion
2689
+ //#region src/parts/RecordEditorLayout/RecordEditorLayout.d.ts
2690
+ /** The props of `RecordEditorLayout` */
2691
+ type RecordEditorLayoutProps = {
2692
+ /**
2693
+ * The bar at the top: a `NavigationBar`. Without it, the screen starts
2694
+ * at the columns, as a detail of the screen.
2695
+ */
2696
+ navigationBar?: ReactNode;
2697
+ /**
2698
+ * The column at the left: a `ContentSidebar`. With `null`, and the
2699
+ * sidebar not collapsed, the screen has no left column and no rail: the
2700
+ * form starts at the left edge, as a detail of the screen.
2701
+ */
2702
+ sidebar: ReactNode;
2703
+ /**
2704
+ * The width of the sidebar in px. The tab Schema of the cms gives 400px
2705
+ * to its sidebar (`SchemaSidebar`), for the API keys of the models.
2706
+ * @default 220
2707
+ */
2708
+ sidebarWidth?: number;
2709
+ /**
2710
+ * The column after the sidebar: a `RecordTree`, the records of a model in
2711
+ * the compact view of the cms. With it, the form column can be empty: the
2712
+ * cms shows nothing there before the user opens a record.
2713
+ */
2714
+ list?: ReactNode;
2715
+ /**
2716
+ * The width of the list in px
2717
+ * @default 350
2718
+ */
2719
+ listWidth?: number;
2720
+ /** The column at the right: an `InfoAside`. Without it, the form is wider. */
2721
+ aside?: ReactNode;
2722
+ /**
2723
+ * The width of the aside in px. A plugin sidebar gives its own width:
2724
+ * Web Previews asks for 900px, and the user can drag the edge.
2725
+ * @default 350
2726
+ */
2727
+ asideWidth?: number;
2728
+ /**
2729
+ * The columns that the user closed. A closed column shows only its rail,
2730
+ * as in the cms. The rail of the aside shows also without `aside`.
2731
+ */
2732
+ collapsed?: {
2733
+ /** @default false */
2734
+ sidebar?: boolean;
2735
+ /** @default false */
2736
+ aside?: boolean;
2737
+ };
2738
+ /** The column in the middle: a `RecordForm` */
2739
+ children?: ReactNode;
2740
+ };
2741
+ /**
2742
+ * The screen of the record editor of the cms. The cms uses a
2743
+ * SplitPane with a script to size the columns. This part gives the same
2744
+ * widths with CSS, thus the server renders the final layout. The column of
2745
+ * the form is not a Main: the id of Main repeats on a page with two scenes,
2746
+ * and the screen is hidden from assistive technology.
2747
+ */
2748
+ export declare function RecordEditorLayout({ navigationBar, sidebar, sidebarWidth, list, listWidth, aside, asideWidth, collapsed, children }: RecordEditorLayoutProps): React.JSX.Element;
2749
+ //#endregion
2750
+ //#region src/parts/RecordList/RecordList.d.ts
2751
+ /** A row of `RecordList`: a record of the model */
2752
+ type RecordListRow = {
2753
+ /** The title of the record, in the first column */
2754
+ title: Message;
2755
+ /**
2756
+ * The publishing status of the record, in the column "Status". Give it to
2757
+ * every row of a model with drafts: the table then has the column.
2758
+ */
2759
+ status?: RecordStatus;
2760
+ /**
2761
+ * The date of the last change, as the cms writes it, for example "Today,
2762
+ * 10:41". A text, not a date: the cms writes "Today" from the clock, and
2763
+ * the scene must render the same markup on each day.
2764
+ */
2765
+ updatedAt: Message;
2766
+ };
2767
+ /** The props of `RecordList` */
2768
+ type RecordListProps = {
2769
+ /** The name of the model without its emoji, for example "Products" */
2770
+ model: Message;
2771
+ /** The emoji of the model, before the title */
2772
+ emoji?: string;
2773
+ /**
2774
+ * The number of records of the model, after the title. It can be more
2775
+ * than the rows: the screen cuts the table at its height.
2776
+ */
2777
+ count: number;
2778
+ /** The records, in the order of the table */
2779
+ rows: RecordListRow[];
2780
+ /**
2781
+ * The relative widths of the columns, from the first, as the user drags
2782
+ * them in the cms. The default is the layout of the cms.
2783
+ */
2784
+ widths?: number[];
2785
+ };
2786
+ /**
2787
+ * The collection of a model in the cms: the toolbar with the name of the
2788
+ * model and the number of records, and the table of the records with the
2789
+ * columns of the cms. Put it in `RecordEditorLayout` without an aside.
2790
+ */
2791
+ export declare function RecordList({ model, emoji, count, rows, widths }: RecordListProps): React.JSX.Element;
2792
+ //#endregion
2793
+ //#region src/parts/RecordTree/RecordTree.d.ts
2794
+ /** A record of `RecordTree`, with its children */
2795
+ type RecordTreeRecord = {
2796
+ /** A key that is unique in the tree */
2797
+ id: string;
2798
+ /** The title of the record */
2799
+ title: Message;
2800
+ /**
2801
+ * The publishing status of the record: a dot after the title. Give it to
2802
+ * every record of a model with drafts.
2803
+ */
2804
+ status?: RecordStatus;
2805
+ /**
2806
+ * The children of the record. A record with children shows a chevron in
2807
+ * place of the grip.
2808
+ */
2809
+ children?: RecordTreeRecord[];
2810
+ /**
2811
+ * The record shows its children. A closed record shows only its chevron.
2812
+ * @default false
2813
+ */
2814
+ open?: boolean;
2815
+ /**
2816
+ * The record is open in the editor
2817
+ * @default false
2818
+ */
2819
+ selected?: boolean;
2820
+ };
2821
+ /** The props of `RecordTree` */
2822
+ type RecordTreeProps = {
2823
+ /** The name of the model without its emoji, for example "Pages" */
2824
+ model: Message;
2825
+ /** The emoji of the model, before the title */
2826
+ emoji?: string;
2827
+ /** The records at the first level of the tree, in their order */
2828
+ records: RecordTreeRecord[];
2829
+ };
2830
+ /**
2831
+ * The compact view of a model with hierarchical sorting in the cms: the pane
2832
+ * with the name of the model, the search field and the button that adds a
2833
+ * record, then the records as a tree. Put it in the `list` column of
2834
+ * `RecordEditorLayout`. The title has no menu: the cms shows the menu only to
2835
+ * a user who can edit the schema.
2836
+ */
2837
+ export declare function RecordTree({ model, emoji, records }: RecordTreeProps): React.JSX.Element;
2838
+ //#endregion
2839
+ //#region src/parts/RolePermissions/RolePermissions.d.ts
2840
+ /** The props of `RolePermissions` */
2841
+ type RolePermissionsProps = {
2842
+ /** The rulesets: `RolePermissions.RuleSet` elements */
2843
+ children: ReactNode;
2844
+ };
2845
+ /** The props of `RolePermissions.RuleSet` */
2846
+ type RolePermissionsRuleSetProps = {
2847
+ /** The emoji of the model */
2848
+ emoji: string;
2849
+ /** The name of the model, without the emoji */
2850
+ title: Message;
2851
+ /** The API key of the model, after its name */
2852
+ apiKey?: string;
2853
+ /** The rules: `RolePermissions.Rule` elements */
2854
+ children: ReactNode;
2855
+ };
2856
+ /** An operation of a rule, as the cms names it */
2857
+ type RolePermissionsAction = 'all' | 'read' | 'create' | 'duplicate' | 'update' | 'editCreator' | 'takeOver' | 'unpublish' | 'delete' | 'moveToStage';
2858
+ /** The props of `RolePermissions.Rule` */
2859
+ type RolePermissionsRuleProps = {
2860
+ /**
2861
+ * The rule allows the operation. A deny rule starts with "Cannot".
2862
+ * @default true
2863
+ */
2864
+ positive?: boolean;
2865
+ /** The operation that the rule allows or denies */
2866
+ action: RolePermissionsAction;
2867
+ /**
2868
+ * The name of the locale of the content, in English, for example
2869
+ * "German". Without it, the rule is on the content of every locale.
2870
+ */
2871
+ locale?: string;
2872
+ /**
2873
+ * The stage that the rule moves the records to, for `moveToStage` (and
2874
+ * `all`). Without it, the rule is on every stage.
2875
+ */
2876
+ toStage?: string;
2877
+ /**
2878
+ * The rule is only on the records in this stage. Without it, the rule is
2879
+ * on the records in every stage.
2880
+ */
2881
+ inStage?: string;
2882
+ /**
2883
+ * The rule is only on the records that these users created: `self` is
2884
+ * the user themself, `role` is a user of the same role. A deny rule
2885
+ * names the others: "other users", "other roles". The cms does not show
2886
+ * it on `create` and `duplicate`.
2887
+ */
2888
+ createdBy?: 'self' | 'role';
2889
+ };
2890
+ /**
2891
+ * The record permissions of a role in the cms, at rest: the title of the
2892
+ * section, then a card for each model with its rules. The cms writes each
2893
+ * rule as a sentence: "Can edit content in German".
2894
+ */
2895
+ declare function RolePermissions({ children }: RolePermissionsProps): React.JSX.Element;
2896
+ declare function RuleSet({ emoji, title, apiKey, children }: RolePermissionsRuleSetProps): React.JSX.Element;
2897
+ declare function Rule({ positive, action, locale, toStage, inStage, createdBy }: RolePermissionsRuleProps): React.JSX.Element;
2898
+ declare const RolePermissionsWithParts: typeof RolePermissions & {
2899
+ RuleSet: typeof RuleSet;
2900
+ Rule: typeof Rule;
2901
+ };
2902
+ //#endregion
2903
+ //#region src/parts/SchemaSidebar/SchemaSidebar.d.ts
2904
+ /** A folder of the menu of the schema */
2905
+ type SchemaSidebarFolder = {
2906
+ kind: 'folder';
2907
+ /** A key that is unique in the menu */
2908
+ id: string;
2909
+ /** The name of the folder. An emoji at the start becomes the icon. */
2910
+ name: string;
2911
+ /**
2912
+ * The folder shows its items. A closed folder shows only its chevron.
2913
+ * @default false
2914
+ */
2915
+ open?: boolean;
2916
+ /** The items in the folder. A folder without items has no chevron. */
2917
+ items?: SchemaSidebarItem[];
2918
+ };
2919
+ /** A model of the menu of the schema: it opens the page of the model */
2920
+ type SchemaSidebarModel = {
2921
+ kind: 'model';
2922
+ /** A key that is unique in the menu */
2923
+ id: string;
2924
+ /**
2925
+ * The name of the model. An emoji at the start becomes the icon, as in
2926
+ * the cms.
2927
+ */
2928
+ name: string;
2929
+ /** The API key of the model, after its name */
2930
+ apiKey: string;
2931
+ /**
2932
+ * The model is a block model: without an emoji, the icon is the one of a
2933
+ * block
2934
+ * @default false
2935
+ */
2936
+ block?: boolean;
2937
+ /**
2938
+ * The row of the page that the scene shows
2939
+ * @default false
2940
+ */
2941
+ active?: boolean;
2942
+ };
2943
+ /** An item of the menu of the schema */
2944
+ type SchemaSidebarItem = SchemaSidebarFolder | SchemaSidebarModel;
2945
+ /** The props of `SchemaSidebar` */
2946
+ type SchemaSidebarProps = {
2947
+ /**
2948
+ * The tab of the menu: the models or the block models
2949
+ * @default 'models'
2950
+ */
2951
+ tab?: 'models' | 'blocks';
2952
+ /** The items at the first level of the menu */
2953
+ items: SchemaSidebarItem[];
2954
+ };
2955
+ /**
2956
+ * The sidebar of the tab Schema of the cms: the tabs of the models and of
2957
+ * the block models, the button "New model", then the menu of the models
2958
+ * with their API keys. The cms shows the models that the user opened last
2959
+ * in a menu before the button: the scene has none.
2960
+ */
2961
+ export declare function SchemaSidebar({ tab, items }: SchemaSidebarProps): React.JSX.Element;
2962
+ //#endregion
2963
+ //#region src/parts/SelectivePublishing/SelectivePublishing.d.ts
2964
+ /** The props of `SelectivePublishing` */
2965
+ type SelectivePublishingProps = {
530
2966
  /**
531
- * Adds the icon that tells that the value is different for each locale
532
- * @default false
2967
+ * The content that the record can publish, in the order of the cms: the
2968
+ * non-localized content first (`nonLocalized`), then the locales
533
2969
  */
534
- localized?: boolean;
535
- /** A short help under the input */
536
- hint?: Message;
2970
+ options: {
2971
+ /** The name of the locale, for example "Italian" */
2972
+ label: TextMessage;
2973
+ /**
2974
+ * The user picked this content to publish
2975
+ * @default false
2976
+ */
2977
+ selected?: boolean;
2978
+ }[];
537
2979
  /**
538
- * The input: a part of `RecordForm`, `StructuredTextInput`, or an input
539
- * of the kit with a constant value
2980
+ * The record has changes in its fields that are not localized: the first
2981
+ * option is the non-localized content
540
2982
  */
541
- children: ReactNode;
2983
+ nonLocalized?: {
2984
+ selected?: boolean;
2985
+ };
542
2986
  };
543
- /** The props of `RecordForm.StringInput` */
544
- type RecordFormStringInputProps = {
545
- /** The text in the input */
546
- value: string;
2987
+ /**
2988
+ * The dialog "Only publish specific content" of the cms, at rest: the
2989
+ * content of the record that is ready, as toggle buttons, and the publish
2990
+ * button. The editor publishes some locales now and the others later.
2991
+ */
2992
+ export declare function SelectivePublishing({ options, nonLocalized }: SelectivePublishingProps): React.JSX.Element;
2993
+ //#endregion
2994
+ //#region src/parts/SignIn/SignIn.d.ts
2995
+ /** The props of `SignIn` */
2996
+ type SignInProps = {
2997
+ /** The project of the sign-in page */
2998
+ project: {
2999
+ /** The name of the project. It shows at the top when there is no logo. */
3000
+ name: string;
3001
+ /** The URL of the logo of the project (white-label). It replaces the name. */
3002
+ logoUrl?: string;
3003
+ };
547
3004
  /**
548
- * The large text of the field that gives the title of the record
3005
+ * The value in the field Email, as if the user typed it
3006
+ * @default ""
3007
+ */
3008
+ email?: string;
3009
+ /**
3010
+ * The project has white-label: the page does not show the DatoCMS logo
3011
+ * under the card
549
3012
  * @default false
550
3013
  */
551
- large?: boolean;
552
- };
553
- /** The props of `RecordForm.SlugInput` */
554
- type RecordFormSlugInputProps = {
555
- /** The URL before the slug, for example "https://www.datocms.com/blog/" */
556
- prefix: string;
557
- /** The slug */
558
- value: string;
3014
+ whiteLabel?: boolean;
559
3015
  };
560
- /** The props of `RecordForm.FileInput` */
561
- type RecordFormFileInputProps = {
562
- /** The image of the upload, at its size in the card (300×180 or less) */
563
- image: {
564
- src: string;
565
- width: number;
566
- height: number;
3016
+ /**
3017
+ * The sign-in page of the cms, at rest: the fields Email and Password, the
3018
+ * button "Log in", and the button "Log in with single sign-on". The Stage
3019
+ * gives the height: the page fills it and centers the card.
3020
+ */
3021
+ export declare function SignIn({ project, email, whiteLabel }: SignInProps): React.JSX.Element;
3022
+ //#endregion
3023
+ //#region src/parts/SsoSettings/SsoSettings.d.ts
3024
+ /** The props of `SsoSettings` */
3025
+ type SsoSettingsProps = {
3026
+ /** The values that DatoCMS gives to the identity provider */
3027
+ serviceProvider: {
3028
+ /** The "Service Provider Metadata URL / Entity ID" */
3029
+ metadataUrl: string;
3030
+ /** The "Assertion Consumer Service (ACS) URL" */
3031
+ acsUrl: string;
3032
+ /** The "SAML Token" */
3033
+ samlToken: string;
3034
+ /** The "Base URL" of SCIM */
3035
+ scimBaseUrl: string;
567
3036
  };
568
- /** The text under the image, for example the alt text or "No metadata set" */
569
- caption?: Message;
570
- };
571
- /** The record editor of the cms: the toolbar and the fields of the record */
572
- declare function RecordForm({ title, icon, children }: RecordFormProps): React.JSX.Element;
573
- /** A field of the record: the label and the input */
574
- declare function Field({ label, required, localized, hint, children }: RecordFormFieldProps): React.JSX.Element;
575
- /** A single-line text field */
576
- declare function RecordStringInput({ value, large }: RecordFormStringInputProps): React.JSX.Element;
577
- declare function SlugInput({ prefix, value }: RecordFormSlugInputProps): React.JSX.Element;
578
- declare function FileInput({ image, caption }: RecordFormFileInputProps): React.JSX.Element;
579
- declare const RecordFormWithParts: typeof RecordForm & {
580
- Field: typeof Field;
581
- StringInput: typeof RecordStringInput;
582
- SlugInput: typeof SlugInput;
583
- FileInput: typeof FileInput;
3037
+ /**
3038
+ * The "Identity Provider Metadata URL", for example the metadata URL of an
3039
+ * Okta app
3040
+ */
3041
+ identityProviderMetadataUrl: string;
3042
+ /**
3043
+ * The SCIM API token that the cms just made: it shows once, with the
3044
+ * warning to copy it into the identity provider. Without it, the button
3045
+ * "Generate API token" shows.
3046
+ */
3047
+ scimToken?: string;
3048
+ /** The name of the default role of the users, for example "Editor" */
3049
+ defaultRole: string;
584
3050
  };
3051
+ /**
3052
+ * The single sign-on settings of the project (the project settings of the
3053
+ * cms, at rest): the SAML settings with the metadata URL of the identity
3054
+ * provider, the SCIM settings and the default role. The form has no change,
3055
+ * thus the button "Save settings" is disabled.
3056
+ */
3057
+ export declare function SsoSettings({ serviceProvider, identityProviderMetadataUrl, scimToken, defaultRole }: SsoSettingsProps): React.JSX.Element;
3058
+ //#endregion
3059
+ //#region ../ui-static/src/form/structured-text/SlashPanel.d.ts
3060
+ /** The kind of the commands of a group, in the order of the panel */
3061
+ type SlashPanelGroupKind = 'blocks' | 'inlineBlocks' | 'inlineItems' | 'formatting';
585
3062
  //#endregion
586
3063
  //#region src/parts/StructuredTextInput/StructuredTextInput.d.ts
3064
+ /**
3065
+ * The steps of `StructuredTextInput.SlashMenu`, for the `sequence` of
3066
+ * `Stage`: the caret after the text, then the slash typed with the menu
3067
+ * open. The next step is the slash deleted: the menu closes. The last step
3068
+ * is the picture at rest.
3069
+ */
3070
+ export declare const SLASH_SEQUENCE: StageSequence;
3071
+ /**
3072
+ * The steps of a `StructuredTextInput.Block` with `selected`, for the
3073
+ * `sequence` of `Stage`: the block at rest, then the block in the
3074
+ * selection of the editor. The last step is the picture at rest.
3075
+ */
3076
+ export declare const BLOCK_SELECT_SEQUENCE: StageSequence;
3077
+ /**
3078
+ * The steps of a `StructuredTextInput.InlineRecord` with `hovered`, for the
3079
+ * `sequence` of `Stage`: the record at rest, then the pointer on the
3080
+ * record, with the hover border and the tooltip "Edit record". The last
3081
+ * step is the picture at rest.
3082
+ */
3083
+ export declare const RECORD_TOOLTIP_SEQUENCE: StageSequence;
587
3084
  /** The props of `StructuredTextInput` */
588
3085
  type StructuredTextInputProps = {
589
3086
  /**
590
- * The blocks of the text: `StructuredTextInput.Paragraph` and
591
- * `StructuredTextInput.Heading` elements
3087
+ * The nodes of the text: `StructuredTextInput.Paragraph`,
3088
+ * `StructuredTextInput.Heading`, `StructuredTextInput.List`,
3089
+ * `StructuredTextInput.Blockquote`, `StructuredTextInput.Block` and
3090
+ * `StructuredTextInput.SlashMenu` elements
592
3091
  */
593
3092
  children: ReactNode;
3093
+ /**
3094
+ * The editor has the focus: the frame shows the focus border and the
3095
+ * focus ring. Give it with `StructuredTextInput.SlashMenu`, because the
3096
+ * slash menu opens only in an editor with the focus.
3097
+ * @default false
3098
+ */
3099
+ focused?: boolean;
3100
+ /**
3101
+ * The toolbar above the text: a `StructuredTextInput.Toolbar` element.
3102
+ * The cms shows the toolbar only when the editor has the focus, thus
3103
+ * give it with `focused`.
3104
+ */
3105
+ toolbar?: ReactNode;
3106
+ };
3107
+ /** A block style of the cms, for the type menu of `StructuredTextInput.Toolbar` */
3108
+ type StructuredTextToolbarBlock = 'paragraph' | 'heading1' | 'heading2' | 'heading3' | 'heading4' | 'heading5' | 'heading6' | 'bulletedList' | 'numberedList' | 'blockquote' | 'code';
3109
+ /** A mark of the cms, for the buttons of `StructuredTextInput.Toolbar` */
3110
+ type StructuredTextToolbarMark = 'strong' | 'emphasis' | 'underline' | 'strikethrough' | 'code' | 'highlight';
3111
+ /** The props of `StructuredTextInput.Toolbar` */
3112
+ type StructuredTextToolbarProps = {
3113
+ /**
3114
+ * The block style at the cursor. The type menu shows its icon and its
3115
+ * name.
3116
+ * @default 'paragraph'
3117
+ */
3118
+ block?: StructuredTextToolbarBlock;
3119
+ /**
3120
+ * The marks that the field allows, in any order. The toolbar shows them
3121
+ * in the order of the cms.
3122
+ * @default all the six marks
3123
+ */
3124
+ marks?: StructuredTextToolbarMark[];
3125
+ /**
3126
+ * The field allows lists: the toolbar shows the two list buttons.
3127
+ * @default true
3128
+ */
3129
+ lists?: boolean;
3130
+ /**
3131
+ * The field allows links: the toolbar shows the link button.
3132
+ * @default true
3133
+ */
3134
+ link?: boolean;
3135
+ /**
3136
+ * The field allows horizontal rules: the toolbar shows the button.
3137
+ * @default true
3138
+ */
3139
+ thematicBreak?: boolean;
594
3140
  };
595
3141
  /** The props of `StructuredTextInput.Paragraph` and `StructuredTextInput.Heading` */
596
3142
  type StructuredTextBlockProps = {
597
- /** The text, with `StructuredTextInput.Link` elements in it */
3143
+ /**
3144
+ * The text, with `StructuredTextInput.Mark`, `StructuredTextInput.Link`
3145
+ * and `StructuredTextInput.InlineRecord` elements in it
3146
+ */
3147
+ children: ReactNode;
3148
+ /**
3149
+ * The node is dim: the scene shows another node. Only a node at the top
3150
+ * level of the field is dim, not a paragraph in a quote.
3151
+ * @default false
3152
+ */
3153
+ dimmed?: boolean;
3154
+ };
3155
+ /** The props of `StructuredTextInput.Mark` */
3156
+ type StructuredTextMarkProps = {
3157
+ /**
3158
+ * The mark of the text, for example `'strong'` or `'emphasis'`. Give an
3159
+ * array for a text with more marks: the cms puts all the marks of a text
3160
+ * on one leaf.
3161
+ */
3162
+ type: StructuredTextToolbarMark | StructuredTextToolbarMark[];
3163
+ /** The text with the mark */
3164
+ children: ReactNode;
3165
+ };
3166
+ /** The props of `StructuredTextInput.List` */
3167
+ type StructuredTextListProps = {
3168
+ /**
3169
+ * The style of the list: `'bulleted'` shows a disc before each item,
3170
+ * `'numbered'` shows the number of the item
3171
+ * @default 'bulleted'
3172
+ */
3173
+ style?: 'bulleted' | 'numbered';
3174
+ /** The items of the list: `StructuredTextInput.ListItem` elements */
3175
+ children: ReactNode;
3176
+ /**
3177
+ * The node is dim: the scene shows another node. Only a node at the top
3178
+ * level of the field is dim, not a paragraph in a quote.
3179
+ * @default false
3180
+ */
3181
+ dimmed?: boolean;
3182
+ };
3183
+ /** The props of `StructuredTextInput.ListItem` */
3184
+ type StructuredTextListItemProps = {
3185
+ /**
3186
+ * The text of the item, with `StructuredTextInput.Mark`,
3187
+ * `StructuredTextInput.Link` and `StructuredTextInput.InlineRecord`
3188
+ * elements in it. The cms puts it in a paragraph in the item.
3189
+ */
3190
+ children: ReactNode;
3191
+ };
3192
+ /** The props of `StructuredTextInput.Blockquote` */
3193
+ type StructuredTextBlockquoteProps = {
3194
+ /** The paragraphs of the quote: `StructuredTextInput.Paragraph` elements */
598
3195
  children: ReactNode;
3196
+ /**
3197
+ * The author or the source of the quote, below the paragraphs. Without
3198
+ * it, the quote has no source: the cms shows "Add author/source" only
3199
+ * when the cursor is in the quote.
3200
+ */
3201
+ source?: ReactNode;
3202
+ /**
3203
+ * The node is dim: the scene shows another node. Only a node at the top
3204
+ * level of the field is dim, not a paragraph in a quote.
3205
+ * @default false
3206
+ */
3207
+ dimmed?: boolean;
3208
+ };
3209
+ /** The props of `StructuredTextInput.Block` */
3210
+ type StructuredTextEmbeddedBlockProps = {
3211
+ /** The name of the block model, for example "Gallery" */
3212
+ name: TextMessage;
3213
+ /** The icon before the name: the emoji of the block model, as in the cms */
3214
+ icon?: ReactNode;
3215
+ /**
3216
+ * The fields of the block: `RecordForm.Field` elements. Only an open
3217
+ * block shows them.
3218
+ */
3219
+ children?: ReactNode;
3220
+ /**
3221
+ * The block is in the selection of the editor: the cms shows the focus
3222
+ * border and the focus ring around it. The cms shows this only when the
3223
+ * editor has the focus, thus give it with `focused` of
3224
+ * `StructuredTextInput`.
3225
+ * @default false
3226
+ */
3227
+ selected?: boolean;
3228
+ /**
3229
+ * The node is dim: the scene shows another node. Only a node at the top
3230
+ * level of the field is dim, not a paragraph in a quote.
3231
+ * @default false
3232
+ */
3233
+ dimmed?: boolean;
3234
+ } & (StructuredTextEmbeddedBlockOpen | StructuredTextEmbeddedBlockClosed);
3235
+ /** An open block, as in the cms at rest: it shows its fields */
3236
+ type StructuredTextEmbeddedBlockOpen = {
3237
+ /**
3238
+ * The block is open
3239
+ * @default true
3240
+ */
3241
+ open?: true;
3242
+ summary?: never;
3243
+ summaryImage?: never;
3244
+ };
3245
+ /** A closed block: the header only, with the chevron closed */
3246
+ type StructuredTextEmbeddedBlockClosed = {
3247
+ open: false;
3248
+ /**
3249
+ * The summary after the name: the value of the title field of the
3250
+ * block, as in the cms
3251
+ */
3252
+ summary?: Message;
3253
+ /**
3254
+ * The URL of the image before the summary: the first image of the block,
3255
+ * as in the cms. The cms shows it in a square of 20px.
3256
+ */
3257
+ summaryImage?: string;
3258
+ };
3259
+ /** The props of `StructuredTextInput.InlineRecord` */
3260
+ type StructuredTextInlineRecordProps = {
3261
+ /**
3262
+ * The icon before the title, in the slot of the image of the record. The
3263
+ * cms shows the image of the record there (when the record has one).
3264
+ */
3265
+ icon?: ReactNode;
3266
+ /** The title of the record */
3267
+ children: Message;
3268
+ /** The publishing status of the record: a dot after the title */
3269
+ status?: RecordStatus;
3270
+ /**
3271
+ * The pointer is on the record: the chip shows its hover border and the
3272
+ * tooltip "Edit record" below it
3273
+ * @default false
3274
+ */
3275
+ hovered?: boolean;
599
3276
  };
600
3277
  /** The props of `StructuredTextInput.Link` */
601
3278
  type StructuredTextLinkProps = {
602
3279
  /** The text of the link */
603
3280
  children: ReactNode;
604
3281
  };
3282
+ /** An item of `StructuredTextInput.SlashMenu` */
3283
+ type StructuredTextSlashMenuItem = {
3284
+ /**
3285
+ * The icon before the label: the emoji of a model. The cms shows it as
3286
+ * the first character of the name of the model. The commands that
3287
+ * change the format have no icon.
3288
+ */
3289
+ icon?: ReactNode;
3290
+ /** The label, for example "Gallery" or "Heading 2" */
3291
+ label: TextMessage;
3292
+ /**
3293
+ * The group of the item. The menu shows a title above each run of items
3294
+ * with the same group. The cms has four groups, in this order: `blocks`
3295
+ * ("Add Block"), `inlineBlocks` ("Add Inline Block"), `inlineItems` ("Add
3296
+ * Inline record") and `formatting` ("Convert to"). Give the kind: the
3297
+ * menu shows the title of the cms. Any other text is the title of a
3298
+ * group that the cms does not have.
3299
+ */
3300
+ group?: SlashPanelGroupKind | TextMessage;
3301
+ };
3302
+ /** The props of `StructuredTextInput.SlashMenu` */
3303
+ type StructuredTextSlashMenuProps = {
3304
+ /**
3305
+ * The text after the slash. The menu shows only the items that match
3306
+ * it: give the matching items only.
3307
+ * @default ''
3308
+ */
3309
+ query?: string;
3310
+ /**
3311
+ * The text before the slash, in the same paragraph, for example
3312
+ * "After lunch, ". The cms opens the menu after a space too. The panel
3313
+ * opens under the slash.
3314
+ * @default ''
3315
+ */
3316
+ before?: ReactNode;
3317
+ /** The items of the menu, in the order of the cms */
3318
+ items: StructuredTextSlashMenuItem[];
3319
+ /**
3320
+ * The index of the highlighted item in `items`. The cms highlights the
3321
+ * first item when the menu opens.
3322
+ * @default 0
3323
+ */
3324
+ active?: number;
3325
+ /**
3326
+ * The text cursor after the slash and the query, as in the cms while the
3327
+ * editor types. It blinks, but not with reduced motion, and it stops
3328
+ * when the screen has `data-paused` (the page sets it off screen).
3329
+ * @default false
3330
+ */
3331
+ caret?: boolean;
3332
+ };
3333
+ /**
3334
+ * The structured text editor of the cms at rest, made of the parts of
3335
+ * ui-static/structured-text: the frame, the toolbar (only when you give it)
3336
+ * and the content, without Slate. In a record that another user edits, it
3337
+ * is read only.
3338
+ */
3339
+ declare function StructuredTextInput({ children, focused, toolbar }: StructuredTextInputProps): React.JSX.Element;
605
3340
  /**
606
- * A copy of the structured text editor of the cms at rest: the frame and the
607
- * content, without Slate and without the toolbar (the toolbar shows only
608
- * with the focus). The editor is a component of the cms, thus it is not in
609
- * ui.
3341
+ * The toolbar of the structured text editor of the cms at rest. No button
3342
+ * is on and no menu is open: the type menu shows the block style at the
3343
+ * cursor.
610
3344
  */
611
- declare function StructuredTextInput({ children }: StructuredTextInputProps): React.JSX.Element;
612
- declare function Paragraph({ children }: StructuredTextBlockProps): React.JSX.Element;
613
- declare function StructuredTextHeading({ children }: StructuredTextBlockProps): React.JSX.Element;
3345
+ declare function Toolbar({ block, marks, lists, link, thematicBreak }: StructuredTextToolbarProps): React.JSX.Element;
3346
+ declare function Paragraph$1({ children, dimmed }: StructuredTextBlockProps): React.JSX.Element;
3347
+ declare function StructuredTextHeading({ children, dimmed }: StructuredTextBlockProps): React.JSX.Element;
3348
+ declare function Mark({ type, children }: StructuredTextMarkProps): React.JSX.Element;
3349
+ declare function List({ style, children, dimmed }: StructuredTextListProps): React.JSX.Element;
3350
+ declare function ListItem({ children }: StructuredTextListItemProps): React.JSX.Element;
3351
+ declare function Blockquote({ children, source, dimmed }: StructuredTextBlockquoteProps): React.JSX.Element;
614
3352
  declare function Link({ children }: StructuredTextLinkProps): React.JSX.Element;
3353
+ declare function Block({ name, icon, children, open, summary, summaryImage, selected, dimmed }: StructuredTextEmbeddedBlockProps): React.JSX.Element;
3354
+ declare function InlineRecord({ icon, children, status, hovered }: StructuredTextInlineRecordProps): React.JSX.Element;
3355
+ declare function SlashMenu({ query, before, items, active, caret }: StructuredTextSlashMenuProps): React.JSX.Element;
615
3356
  declare const StructuredTextInputWithParts: typeof StructuredTextInput & {
616
- Paragraph: typeof Paragraph;
3357
+ Paragraph: typeof Paragraph$1;
617
3358
  Heading: typeof StructuredTextHeading;
3359
+ Mark: typeof Mark;
3360
+ List: typeof List;
3361
+ ListItem: typeof ListItem;
3362
+ Blockquote: typeof Blockquote;
618
3363
  Link: typeof Link;
3364
+ Block: typeof Block;
3365
+ InlineRecord: typeof InlineRecord;
3366
+ SlashMenu: typeof SlashMenu;
3367
+ Toolbar: typeof Toolbar;
619
3368
  };
620
3369
  //#endregion
621
- //#region src/Stage/Stage.d.ts
622
- /** The hue of the default theme of the cms */
623
- export declare const DEFAULT_HUE = 290;
624
- type ColorScheme = 'light' | 'dark';
625
- type StageProps = {
3370
+ //#region ../ui-static/src/content/VersionDiff.d.ts
3371
+ /**
3372
+ * A run of text on one side of the comparison. "same" is on both sides,
3373
+ * "remove" is only on the older side, "add" is only on the newer side.
3374
+ */
3375
+ type VersionDiffTextPart = {
3376
+ value: string;
3377
+ kind: 'same' | 'add' | 'remove';
3378
+ };
3379
+ //#endregion
3380
+ //#region src/parts/VersionCompare/VersionCompare.d.ts
3381
+ /**
3382
+ * A run of text in a version. "same" is in the two versions, "remove" only
3383
+ * in the older, "add" only in the newer.
3384
+ */
3385
+ type VersionCompareRun = VersionDiffTextPart;
3386
+ /** A version in the head of its column */
3387
+ type VersionCompareVersion = {
3388
+ /** The date of the version, as the cms formats it: "03/04/2026, 16:47" */
3389
+ date: string;
3390
+ /** The user that saved it */
3391
+ editor: string;
3392
+ };
3393
+ /** The props of `VersionCompare` */
3394
+ type VersionCompareProps = {
3395
+ /** The older version, in the left column */
3396
+ older: VersionCompareVersion;
3397
+ /** The newer version, in the right column: the version of the page */
3398
+ newer: VersionCompareVersion & {
3399
+ /**
3400
+ * The current version of the record: the pill "Current"
3401
+ * @default false
3402
+ */
3403
+ current?: boolean;
3404
+ /**
3405
+ * The published version of the record: the pill "Published"
3406
+ * @default false
3407
+ */
3408
+ published?: boolean;
3409
+ };
626
3410
  /**
627
- * What the scene shows, for a screen reader. The scene itself is hidden
628
- * from assistive technology.
3411
+ * The switch "Only show differences" is on: give only the fields that
3412
+ * changed
3413
+ * @default false
629
3414
  */
630
- description: string;
631
- /** @default 'light' */
632
- scheme?: ColorScheme;
3415
+ onlyDifferences?: boolean;
3416
+ /** The fields: `VersionCompare.TextField` and `VersionCompare.StructuredTextField` */
3417
+ children: ReactNode;
3418
+ };
3419
+ /**
3420
+ * The page of a version of a record (Versions of the cms), without the list
3421
+ * of the versions on its left: the toolbar with the date of the version and
3422
+ * the switch and the Restore button, the heads of the two columns, and the fields of the
3423
+ * two versions side by side, with the changes marked.
3424
+ */
3425
+ declare function VersionCompare({ older, newer, onlyDifferences, children }: VersionCompareProps): React.JSX.Element;
3426
+ /** The props of `VersionCompare.TextField` */
3427
+ type VersionCompareTextFieldProps = {
3428
+ /** The label of the field */
3429
+ label: string;
633
3430
  /**
634
- * The hue of the brand color, from 0 to 360
635
- * @default 290
3431
+ * The field is a heading, as the title of a record: its text is larger
3432
+ * @default false
636
3433
  */
637
- hue?: number;
3434
+ large?: boolean;
3435
+ /** The text in the older version, in runs */
3436
+ older: VersionCompareRun[];
3437
+ /** The text in the newer version, in runs */
3438
+ newer: VersionCompareRun[];
3439
+ };
3440
+ /** A single-line text field in the two versions */
3441
+ declare function TextField({ label, large, older, newer }: VersionCompareTextFieldProps): React.JSX.Element;
3442
+ /** The props of `VersionCompare.StructuredTextField` */
3443
+ type VersionCompareStructuredTextFieldProps = {
3444
+ /** The label of the field */
3445
+ label: string;
3446
+ /** The top-level nodes: `VersionCompare.Paragraph` and `VersionCompare.Gap` */
3447
+ children: ReactNode;
3448
+ };
3449
+ /** A structured text field in the two versions, a row for each paragraph */
3450
+ declare function StructuredTextField({ label, children }: VersionCompareStructuredTextFieldProps): React.JSX.Element;
3451
+ /** The props of `VersionCompare.Paragraph` */
3452
+ type VersionCompareParagraphProps = {
3453
+ /** The paragraph in the older version. Without it, the newer version added it. */
3454
+ older?: VersionCompareRun[];
3455
+ /** The paragraph in the newer version. Without it, the newer version removed it. */
3456
+ newer?: VersionCompareRun[];
3457
+ };
3458
+ /** A paragraph of a structured text field, in the two versions */
3459
+ declare function Paragraph({ older, newer }: VersionCompareParagraphProps): React.JSX.Element;
3460
+ /** The props of `VersionCompare.Gap` */
3461
+ type VersionCompareGapProps = {
3462
+ /** How many nodes did not change */
3463
+ count: number;
3464
+ };
3465
+ /**
3466
+ * Nodes of a structured text that did not change, in place of their rows,
3467
+ * when only the differences show
3468
+ */
3469
+ declare function Gap({ count }: VersionCompareGapProps): React.JSX.Element;
3470
+ declare const VersionCompareWithParts: typeof VersionCompare & {
3471
+ TextField: typeof TextField;
3472
+ StructuredTextField: typeof StructuredTextField;
3473
+ Paragraph: typeof Paragraph;
3474
+ Gap: typeof Gap;
3475
+ };
3476
+ //#endregion
3477
+ //#region src/parts/VisualEditorLayout/VisualEditorLayout.d.ts
3478
+ /** The props of `VisualEditorLayout` */
3479
+ type VisualEditorLayoutProps = {
638
3480
  /**
639
- * The logical size of the screen in px. The CSS of the cms resolves its
640
- * media queries and its viewport units for 1440×900: a different size
641
- * crops or extends the content, the layout stays the same.
642
- * @default { width: 1440, height: 900 }
3481
+ * The bar at the top: a `NavigationBar` with `activeTab="visual"`.
3482
+ * Without it the screen starts at the toolbar of the plugin.
643
3483
  */
644
- size?: {
645
- width: number;
646
- height: number;
3484
+ navigationBar?: ReactNode;
3485
+ /** The column at the left: a `WebPreview` with `mode="visual"` */
3486
+ preview: ReactNode;
3487
+ /**
3488
+ * The width of the sidebar at the right in px. The cms gives it 30% of
3489
+ * the screen and at least 550px, and the user can drag the edge.
3490
+ */
3491
+ sidebarWidth?: number;
3492
+ /**
3493
+ * The sidebar before a click: a `VisualEditorLayout.Records` with the
3494
+ * records of the page. With VISUAL_EDITING_SEQUENCE it shows until the
3495
+ * step "record".
3496
+ */
3497
+ records: ReactNode;
3498
+ /**
3499
+ * The sidebar after the first click: the `RecordForm` of the record of
3500
+ * the page, without `status`, with the field of the click `highlighted`.
3501
+ * With VISUAL_EDITING_SEQUENCE it shows from the step "record" to the
3502
+ * step "linked".
3503
+ */
3504
+ record: ReactNode;
3505
+ /**
3506
+ * The sidebar after the second click: the `RecordForm` of the linked
3507
+ * record, without `status`, with the field of the click `highlighted`.
3508
+ * It is the picture at rest.
3509
+ */
3510
+ linked: ReactNode;
3511
+ };
3512
+ /** A record in `VisualEditorLayout.Records` */
3513
+ type VisualEditorRecord = {
3514
+ /** The title of the record */
3515
+ title: string;
3516
+ /** The name of the model, with its emoji, for example "✍️ Author" */
3517
+ model: string;
3518
+ /** The publishing status: the dot at the end of the row */
3519
+ status: RecordStatus;
3520
+ /**
3521
+ * The URL of the image of the record. When one row has an image, all the
3522
+ * rows show the slot of the image, thus the titles align.
3523
+ */
3524
+ image?: string;
3525
+ };
3526
+ /** The props of `VisualEditorLayout.Records` */
3527
+ type VisualEditorRecordsProps = {
3528
+ /** The records that the page shows, in the order of the page */
3529
+ records: VisualEditorRecord[];
3530
+ };
3531
+ /**
3532
+ * The tab Visual of the cms: the page of the plugin Web Previews at the
3533
+ * left, and the sidebar of the visual editing at the right. The sidebar
3534
+ * shows the records of the page, or the form of the record that the user
3535
+ * clicked in the page. The cms uses a SplitPane with a script to size the
3536
+ * columns. This part gives the same widths with CSS, thus the server
3537
+ * renders the final layout.
3538
+ */
3539
+ declare function VisualEditorLayout({ navigationBar, preview, sidebarWidth, records, record, linked }: VisualEditorLayoutProps): React.JSX.Element;
3540
+ /**
3541
+ * The records of the page, as the cms lists them in the sidebar before a
3542
+ * click: a row for each record, with its image, its model, its title and
3543
+ * its status. The plugin gives the title of the list.
3544
+ */
3545
+ declare function Records({ records }: VisualEditorRecordsProps): React.JSX.Element;
3546
+ declare const VisualEditorLayoutWithParts: typeof VisualEditorLayout & {
3547
+ Records: typeof Records;
3548
+ };
3549
+ //#endregion
3550
+ //#region src/parts/WebPreview/WebPreview.d.ts
3551
+ /**
3552
+ * The steps of the tab Visual, for the `sequence` of `Stage`, with
3553
+ * `VisualEditorLayout`, a `WebPreview` with `mode="visual"` and its
3554
+ * `WebPreview.Target` elements:
3555
+ *
3556
+ * - "list": the switch "Edit mode" is off. The sidebar shows the records of
3557
+ * the page.
3558
+ * - "toggle": the pointer comes to the switch and clicks it, and the
3559
+ * switch turns on.
3560
+ * - "cascade": content link flashes the outline of all the targets, one
3561
+ * after the other in the order of the page (`order`), then hides them.
3562
+ * - "hover-record", "click-record": the pointer comes to the target with
3563
+ * `click="record"`, then it clicks.
3564
+ * - "record": the sidebar opens the record of that target. One second
3565
+ * later the form scrolls to the field of the target and highlights it.
3566
+ * - "hover-linked", "click-linked": the pointer comes to the target with
3567
+ * `click="linked"`, then it clicks.
3568
+ * - "linked": the sidebar opens the record of the second target, a record
3569
+ * that the first record links, and highlights its field in the same
3570
+ * way. It is the picture at rest.
3571
+ */
3572
+ export declare const VISUAL_EDITING_SEQUENCE: StageSequence;
3573
+ /**
3574
+ * The steps of a save in the record editor, for the `sequence` of `Stage`,
3575
+ * with a `WebPreview` in the tab "Website preview" and its `reloaded` page,
3576
+ * and a `RecordForm` with `dirty="until-saved"`:
3577
+ *
3578
+ * - "editing": the form has the new value, and the page still shows the old
3579
+ * one. The toolbar tells that the form has unsaved changes and shows the
3580
+ * button Save. The pointer comes to the button.
3581
+ * - "click-save": the pointer clicks Save.
3582
+ * - "saved": the toolbar shows the status of the record and the publish
3583
+ * button again. The page still shows the old value.
3584
+ * - "reload": the plugin loads the page again.
3585
+ * - "reloaded": the page shows the new value. It is the picture at rest.
3586
+ */
3587
+ export declare const PREVIEW_RELOAD_SEQUENCE: StageSequence;
3588
+ /** The props of `WebPreview` */
3589
+ type WebPreviewProps = {
3590
+ /**
3591
+ * Where the plugin shows the page. "sidebar": the tab "Website preview"
3592
+ * of the record editor, with the select of the preview links and the
3593
+ * switch "Edit mode" off. "visual": the tab Visual of the cms
3594
+ * (`VisualEditorLayout`), with an address bar and the switch that
3595
+ * VISUAL_EDITING_SEQUENCE turns on.
3596
+ * @default 'sidebar'
3597
+ */
3598
+ mode?: 'sidebar' | 'visual';
3599
+ /**
3600
+ * The preview link of the record, as the plugin shows it in its select:
3601
+ * the name of the link, then the URL
3602
+ */
3603
+ link: {
3604
+ /** The name that the developer gives to the link, for example "Draft version" */
3605
+ label: string;
3606
+ /** The URL of the page on the site */
3607
+ url: string;
647
3608
  };
648
- /** The content of the screen: a scene */
3609
+ /**
3610
+ * The page of the site, as the site renders it. In the tab Visual, wrap
3611
+ * each element that content link knows in a `WebPreview.Target`.
3612
+ */
3613
+ children: ReactNode;
3614
+ /**
3615
+ * The same page after a save and a reload. With PREVIEW_RELOAD_SEQUENCE
3616
+ * it takes the place of `children` at the step "reloaded". Without the
3617
+ * sequence, it is the page that shows.
3618
+ */
3619
+ reloaded?: ReactNode;
3620
+ };
3621
+ /** The props of `WebPreview.Target` */
3622
+ type WebPreviewTargetProps = {
3623
+ /**
3624
+ * The place of the element in the page, from 0. Content link flashes the
3625
+ * targets in the order of the page, 10ms one after the other.
3626
+ */
3627
+ order: number;
3628
+ /**
3629
+ * The click of VISUAL_EDITING_SEQUENCE on the element. "record": the
3630
+ * first click, that opens the record of the page. "linked": the second
3631
+ * click, that opens a linked record. The picture at rest shows the
3632
+ * outline of the "linked" target.
3633
+ */
3634
+ click?: 'record' | 'linked';
3635
+ /**
3636
+ * The element is in a line of text, for example a name in a byline
3637
+ * @default false
3638
+ */
3639
+ inline?: boolean;
3640
+ /**
3641
+ * The element and its padding are less than 150px wide: content link
3642
+ * puts the label above the outline, in the middle, and rounds all the
3643
+ * corners
3644
+ * @default false
3645
+ */
3646
+ narrow?: boolean;
3647
+ /** The element of the site */
649
3648
  children: ReactNode;
650
3649
  };
651
3650
  /**
652
- * The frame of a product scene. It renders the content at a fixed logical
653
- * size, and scales it down with CSS on a narrow page. The content is a
654
- * picture: it gets no focus, no pointer events and no selection.
3651
+ * The plugin Web Previews: its toolbar, and the page of the site in the
3652
+ * frame under it. In the tab "Website preview" of the record editor, the
3653
+ * toolbar has the select of the preview links and their buttons. In the
3654
+ * tab Visual, it has an address bar. The plugin is not a part of the cms:
3655
+ * it draws its toolbar with the components of datocms-react-ui. This part
3656
+ * draws the same toolbar with the components of ui-public, and the texts of the
3657
+ * plugin.
3658
+ *
3659
+ * With the switch "Edit mode" on, the plugin connects the page to
3660
+ * @datocms/content-link: an outline frames the element under the pointer,
3661
+ * and a click opens its field in the cms.
3662
+ */
3663
+ declare function WebPreview({ mode, link, children, reloaded }: WebPreviewProps): React.JSX.Element;
3664
+ /**
3665
+ * An element of the site that content link knows: its text holds the
3666
+ * record and the field. The outline and its label "Open in DatoCMS" are
3667
+ * the overlay of @datocms/content-link, with its default color (hue 17).
3668
+ */
3669
+ declare function Target({ order, click, inline, narrow, children }: WebPreviewTargetProps): React.JSX.Element;
3670
+ declare const WebPreviewWithParts: typeof WebPreview & {
3671
+ Target: typeof Target;
3672
+ };
3673
+ //#endregion
3674
+ //#region src/parts/WhiteLabelSettings/WhiteLabelSettings.d.ts
3675
+ /** The props of `WhiteLabelSettings` */
3676
+ type WhiteLabelSettingsProps = {
3677
+ /**
3678
+ * The "Custom I18n messages template URL": the URL of the JSON files that
3679
+ * replace the texts of the interface, with `:locale` for the language,
3680
+ * for example "https://cdn.example.com/cms/:locale.json"
3681
+ */
3682
+ messagesTemplateUrl: string;
3683
+ };
3684
+ /**
3685
+ * The white-label settings of the project (the project settings of the
3686
+ * cms, at rest): the URL of the custom texts of the interface. The form has
3687
+ * no change, thus the button "Save white-label settings" is disabled.
3688
+ */
3689
+ export declare function WhiteLabelSettings({ messagesTemplateUrl }: WhiteLabelSettingsProps): React.JSX.Element;
3690
+ //#endregion
3691
+ //#region src/parts/WorkflowStages/WorkflowStages.d.ts
3692
+ /** A stage of the workflow, as the settings of the workflow show it */
3693
+ type WorkflowStage = {
3694
+ /** The name of the stage, for example "In review" */
3695
+ name: string;
3696
+ /** The API key of the stage, for example "in_review" */
3697
+ apiKey: string;
3698
+ /** What the stage means for the editors */
3699
+ description?: string;
3700
+ };
3701
+ /** The props of `WorkflowStages` */
3702
+ type WorkflowStagesProps = {
3703
+ /** The stages of the workflow, in their order */
3704
+ stages: WorkflowStage[];
3705
+ };
3706
+ /**
3707
+ * The stages of a workflow in its settings (WorkflowForm of the cms): the
3708
+ * section "Stages", a list with a row for each stage, and the section
3709
+ * "Transitions between stages", which sends to the permissions of the
3710
+ * roles. The list is the TableList of the cms, at rest. A div with the
3711
+ * padding of the page is around the sections, not the Page of the cms: the
3712
+ * Page has a maximum width, a minimum height and a padding that changes
3713
+ * with the width of the window.
655
3714
  */
656
- export declare function Stage({ description, scheme, hue, size, children }: StageProps): React.JSX.Element;
3715
+ export declare function WorkflowStages({ stages }: WorkflowStagesProps): React.JSX.Element;
657
3716
  //#endregion
658
- export { Button, type ButtonProps, type ColorScheme, type ContentSidebarFolder, type ContentSidebarItem, type ContentSidebarModel, type ContentSidebarProps, InfoAsideWithParts as InfoAside, type InfoAsideBlankProps, type InfoAsidePanelProps, type InfoAsideProps, type InfoAsideRecordInfoProps, type InfoAsideWebsitePage, type InfoAsideWebsitePagesProps, InfoList, type InfoListProps, type Message, type NavigationBarProps, type NavigationBarTab, _default as Pill, type PillProps, type RecordEditorLayoutProps, RecordFormWithParts as RecordForm, type RecordFormFieldProps, type RecordFormFileInputProps, type RecordFormProps, type RecordFormSlugInputProps, type RecordFormStringInputProps, type RecordStatus, type StageProps, type StructuredTextBlockProps, StructuredTextInputWithParts as StructuredTextInput, type StructuredTextInputProps, type StructuredTextLinkProps, type TextMessage };
3717
+ export { type AddFieldMenuProps, AssetDetailWithParts as AssetDetail, type AssetDetailAddTrackProps, type AssetDetailCategorizationProps, type AssetDetailDefaultMetadataProps, type AssetDetailGenerateSubtitlesProps, type AssetDetailInfoProps, type AssetDetailInfoRow, type AssetDetailLinkingRecord, type AssetDetailLinksToItemsProps, type AssetDetailProps, type AssetDetailTrack, type AssetDetailTrackLanguage, type AssetDetailTracksProps, type AuditLogColumn, type AuditLogEvent, type AuditLogProps, Button, type ButtonProps, type ColorScheme, type ConfigurationMenuProps, type ContentSidebarFolder, type ContentSidebarItem, type ContentSidebarModel, type ContentSidebarProps, type FieldSettingsField, type FieldSettingsProps, type FieldSettingsValidators, type FieldType, InfoAsideWithParts as InfoAside, type InfoAsideAiTranslationsJob, type InfoAsideAiTranslationsProps, type InfoAsideBlankProps, type InfoAsideClosableProps, type InfoAsidePanelProps, type InfoAsideProps, type InfoAsidePublishingScheduleProps, type InfoAsideRecordInfoProps, type InfoAsideRevisionHistoryProps, type InfoAsideStage, type InfoAsideStageMove, type InfoAsideVersion, type InfoAsideWebsitePage, type InfoAsideWebsitePagesProps, InfoList, type InfoListProps, MediaArea, type MediaAreaAsset, type MediaAreaCollection, type MediaAreaProps, type MediaAreaSavedFilters, type MediaAreaSidebarProps, type MediaAreaSource, type Message, type ModelPageField, type ModelPageProps, type ModelSetting, type ModelSettingsProps, type ModularContentAddMenu, type ModularContentBlockModel, type ModularContentBlockProps, ModularContentFieldWithParts as ModularContentField, type ModularContentFieldProps, type NavigationBarPluginTab, type NavigationBarProps, type NavigationBarTab, _default as Pill, type PillProps, type PluginIconName, type PluginListPlugin, type PluginListProps, type RecordEditorLayoutProps, RecordFormWithParts as RecordForm, type RecordFormAboveProps, type RecordFormBodyProps, type RecordFormCollaborator, type RecordFormFieldMenu, type RecordFormFieldMenuItem, type RecordFormFieldProps, type RecordFormFileInputProps, type RecordFormGalleryInputProps, type RecordFormLocales, type RecordFormOutletProps, type RecordFormPluginInputProps, type RecordFormProps, type RecordFormSeoInputProps, type RecordFormSlugInputProps, type RecordFormStringInputProps, type RecordFormTextareaInputProps, type RecordFormVideoInputProps, type RecordFormViewer, type RecordListProps, type RecordListRow, type RecordStatus, type RecordTreeProps, type RecordTreeRecord, RolePermissionsWithParts as RolePermissions, type RolePermissionsAction, type RolePermissionsProps, type RolePermissionsRuleProps, type RolePermissionsRuleSetProps, type SchemaSidebarFolder, type SchemaSidebarItem, type SchemaSidebarModel, type SchemaSidebarProps, type SelectivePublishingProps, type SeoDialogProps, type SeoInputImage, type SeoInputPage, type SeoInputPreview, type SeoPreviewStackProps, type SignInProps, type SsoSettingsProps, type StageProps, type StageScheme, type StageSequence, type StructuredTextBlockProps, type StructuredTextBlockquoteProps, type StructuredTextEmbeddedBlockProps, type StructuredTextInlineRecordProps, StructuredTextInputWithParts as StructuredTextInput, type StructuredTextInputProps, type StructuredTextLinkProps, type StructuredTextListItemProps, type StructuredTextListProps, type StructuredTextMarkProps, type StructuredTextSlashMenuItem, type StructuredTextSlashMenuProps, type StructuredTextToolbarBlock, type StructuredTextToolbarMark, type StructuredTextToolbarProps, type TextMessage, VersionCompareWithParts as VersionCompare, type VersionCompareGapProps, type VersionCompareParagraphProps, type VersionCompareProps, type VersionCompareRun, type VersionCompareStructuredTextFieldProps, type VersionCompareTextFieldProps, type VersionCompareVersion, VisualEditorLayoutWithParts as VisualEditorLayout, type VisualEditorLayoutProps, type VisualEditorRecord, type VisualEditorRecordsProps, WebPreviewWithParts as WebPreview, type WebPreviewProps, type WebPreviewTargetProps, type WhiteLabelSettingsProps, type WorkflowStage, type WorkflowStagesProps };