@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/README.md +90 -3
- package/dist/index.d.ts +3306 -247
- package/dist/index.js +33221 -10131
- package/dist/product-scenes.css +14025 -3455
- package/package.json +1 -1
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
|
-
/**
|
|
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/
|
|
326
|
-
/**
|
|
327
|
-
type
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
*
|
|
335
|
-
*
|
|
442
|
+
* What the scene shows, for a screen reader. The scene itself is hidden
|
|
443
|
+
* from assistive technology.
|
|
336
444
|
*/
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
|
|
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
|
|
348
|
-
*
|
|
449
|
+
* The hue of the brand color, from 0 to 360
|
|
450
|
+
* @default 290
|
|
349
451
|
*/
|
|
350
|
-
|
|
452
|
+
hue?: number;
|
|
351
453
|
/**
|
|
352
|
-
* The
|
|
353
|
-
*
|
|
354
|
-
*
|
|
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
|
-
|
|
460
|
+
tint?: number;
|
|
357
461
|
/**
|
|
358
|
-
* The
|
|
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
|
-
|
|
362
|
-
/**
|
|
363
|
-
|
|
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
|
-
/**
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
|
371
|
-
*
|
|
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
|
-
|
|
374
|
-
/**
|
|
375
|
-
|
|
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
|
-
/**
|
|
378
|
-
|
|
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/
|
|
381
|
-
/**
|
|
382
|
-
type
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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
|
|
648
|
+
* The user closed the panel: only its title shows
|
|
394
649
|
* @default false
|
|
395
650
|
*/
|
|
396
|
-
|
|
397
|
-
/** The content of the panel */
|
|
398
|
-
children: ReactNode;
|
|
651
|
+
closed?: boolean;
|
|
399
652
|
};
|
|
400
|
-
/** The
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
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
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
410
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
713
|
+
* The user closed the panel: only its title shows
|
|
432
714
|
* @default false
|
|
433
715
|
*/
|
|
434
|
-
|
|
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
|
|
437
|
-
|
|
438
|
-
|
|
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
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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/
|
|
464
|
-
/**
|
|
465
|
-
type
|
|
466
|
-
/** The
|
|
467
|
-
|
|
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
|
|
470
|
-
* @default
|
|
767
|
+
* The name of the new track
|
|
768
|
+
* @default the name of the language, then "(generated)", as in the cms
|
|
471
769
|
*/
|
|
472
|
-
|
|
770
|
+
trackName?: string;
|
|
473
771
|
/**
|
|
474
|
-
* The
|
|
475
|
-
*
|
|
772
|
+
* The dialog shows only in the step "dialog" of
|
|
773
|
+
* GENERATE_SUBTITLES_SEQUENCE
|
|
774
|
+
* @default false
|
|
476
775
|
*/
|
|
477
|
-
|
|
478
|
-
/**
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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
|
-
*
|
|
486
|
-
*
|
|
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
|
-
|
|
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
|
|
504
|
-
*
|
|
505
|
-
*
|
|
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
|
-
|
|
826
|
+
declare function AddTrack({ file, language, trackName, closedCaptions, over }: AssetDetailAddTrackProps): React.JSX.Element;
|
|
510
827
|
//#endregion
|
|
511
|
-
//#region src/parts/
|
|
512
|
-
/**
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
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
|
-
*
|
|
842
|
+
* The subtitles are closed captions
|
|
527
843
|
* @default false
|
|
528
844
|
*/
|
|
529
|
-
|
|
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
|
-
*
|
|
532
|
-
*
|
|
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
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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
|
|
539
|
-
*
|
|
2980
|
+
* The record has changes in its fields that are not localized: the first
|
|
2981
|
+
* option is the non-localized content
|
|
540
2982
|
*/
|
|
541
|
-
|
|
2983
|
+
nonLocalized?: {
|
|
2984
|
+
selected?: boolean;
|
|
2985
|
+
};
|
|
542
2986
|
};
|
|
543
|
-
/**
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
/**
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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
|
-
/**
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
/**
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
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
|
|
591
|
-
* `StructuredTextInput.Heading`
|
|
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
|
-
/**
|
|
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
|
-
*
|
|
607
|
-
*
|
|
608
|
-
*
|
|
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
|
|
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/
|
|
622
|
-
/**
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
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
|
-
*
|
|
628
|
-
*
|
|
3411
|
+
* The switch "Only show differences" is on: give only the fields that
|
|
3412
|
+
* changed
|
|
3413
|
+
* @default false
|
|
629
3414
|
*/
|
|
630
|
-
|
|
631
|
-
/**
|
|
632
|
-
|
|
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
|
|
635
|
-
* @default
|
|
3431
|
+
* The field is a heading, as the title of a record: its text is larger
|
|
3432
|
+
* @default false
|
|
636
3433
|
*/
|
|
637
|
-
|
|
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
|
|
640
|
-
*
|
|
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
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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
|
-
/**
|
|
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
|
|
653
|
-
*
|
|
654
|
-
*
|
|
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
|
|
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 };
|