UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

1,825 lines (1,747 loc) • 399 kB
import {ArraySchemaType} from '@sanity/types' import {AssetMetadataType} from '@sanity/types' import {AssetSource} from '@sanity/types' import {AssetSourceSpec} from '@sanity/types' import {BifurClient} from '@sanity/bifur-client' import {BooleanSchemaType} from '@sanity/types' import {ButtonTone} from '@sanity/ui' import {CardProps} from '@sanity/ui' import {ClientConfig} from '@sanity/client' import {ClientPerspective} from '@sanity/client' import {ComponentProps} from 'react' import {ComponentType} from 'react' import {CrossDatasetReferenceValue} from '@sanity/types' import {CSSProperties} from 'react' import {CurrentUser} from '@sanity/types' import {DialogProps} from '@sanity/ui' import {Diff} from '@sanity/diff' import {EditorChange} from '@portabletext/editor' import {EditorSelection} from '@portabletext/editor' import {ErrorInfo} from 'react' import {FileValue} from '@sanity/types' import {FocusEvent as FocusEvent_2} from 'react' import {FocusEventHandler} from 'react' import {FormEventHandler} from 'react' import {FormNodeValidation} from '@sanity/types' import {GeopointValue} from '@sanity/types' import {HotkeyOptions} from '@portabletext/editor' import {HTMLProps} from 'react' import {i18n} from 'i18next' import {I18nTextRecord} from '@sanity/types' import {ImageUrlFitMode} from '@sanity/types' import {ImageValue} from '@sanity/types' import {InitialValueProperty} from '@sanity/types' import {InitialValueResolverContext} from '@sanity/types' import {IntrinsicTypeName} from '@sanity/types' import {JSX} from 'react' import {KeyedObject} from '@sanity/types' import {KeyedSegment} from '@sanity/types' import {MarkdownShortcutsPluginProps} from '@portabletext/plugin-markdown-shortcuts' import {MemoExoticComponent} from 'react' import {MendozaEffectPair} from '@sanity/types' import {MutableRefObject} from 'react' import {NamedExoticComponent} from 'react' import {NumberSchemaType} from '@sanity/types' import {ObjectDiff} from '@sanity/diff' import {ObjectSchemaType} from '@sanity/types' import {Observable} from 'rxjs' import {OnCopyFn} from '@portabletext/editor' import {OnPasteFn} from '@portabletext/editor' import {Path} from '@sanity/types' import {PathSegment} from '@sanity/types' import {PortableTextBlock} from '@sanity/types' import {PortableTextEditor} from '@portabletext/editor' import {PortableTextObject} from '@sanity/types' import {RangeDecoration} from '@portabletext/editor' import {ReactNode} from 'react' import {ReferenceValue} from '@sanity/types' import {ReleaseDocument} from '@sanity/client' import {RootTheme} from '@sanity/ui/theme' import {Router} from 'sanity/router' import {RouterState} from 'sanity/router' import {SanityClient} from '@sanity/client' import {SanityDocument} from '@sanity/types' import {SanityDocumentLike} from '@sanity/types' import {Schema} from '@sanity/types' import {SchemaType} from '@sanity/types' import {SchemaTypeDefinition} from '@sanity/types' import {SearchParam} from 'sanity/router' import {SearchStrategy} from '@sanity/types' import {SlugValue} from '@sanity/types' import {SortOrdering} from '@sanity/types' import {SortOrderingItem} from '@sanity/types' import {StringSchemaType} from '@sanity/types' import {TFunction} from 'i18next' import {TransactionLogEventWithEffects} from '@sanity/types' import {TypographyPluginProps} from '@portabletext/plugin-typography' import {User} from '@sanity/types' import {ValidationMarker} from '@sanity/types' declare interface Action extends NavbarActionBase { onAction: () => void selected: boolean title: string render?: undefined } declare interface Action_2 extends NavbarActionBase_2 { onAction: () => void selected: boolean title: string render?: undefined } /** * @hidden * @beta */ declare interface ActionComponent<ActionProps, ActionDescription> { (props: ActionProps): ActionDescription | null } /** * @hidden * @beta */ declare interface ActionComponent_2<ActionProps, ActionDescription> { (props: ActionProps): ActionDescription | null } declare interface ActionWithCustomRender extends NavbarActionBase { render: () => React.ReactElement } declare interface ActionWithCustomRender_2 extends NavbarActionBase_2 { render: () => React.ReactElement } /** * @hidden * @beta */ declare interface ActiveToolLayoutProps { renderDefault: (props: ActiveToolLayoutProps) => React.JSX.Element activeTool: Tool } /** * @hidden * @beta */ declare interface ActiveToolLayoutProps_2 { renderDefault: (props: ActiveToolLayoutProps_2) => React.JSX.Element activeTool: Tool_2 } /** * @hidden * @beta */ declare type Annotation = AnnotationDetails | null /** * Annotation connected to a change * * * @hidden * @beta */ declare type AnnotationDetails = { event?: DocumentGroupEvent timestamp: string author: string } /** * @public * Config for the apps that are available in the studio. */ declare type AppsOptions = { canvas?: { enabled: boolean /** * To allow the "Link to canvas" action on localhost, or in studios not listed under Studios in https://www.sanity.io/manage * provide a fallback origin as a string. * * The string must be the exactly equal `name` as shown for the Studio in manage, and the studio must have create-manifest.json available. * * If the provided fallback Studio does not expose create-manifest.json "Link to canvas" will fail when using the fallback. * * Example: `wonderful.sanity.studio` * * Keep in mind that when fallback origin is used, Canvas will use the schema types and dataset in the *deployed* Studio, * not from localhost. * * To see data synced from Canvas in your localhost Studio, you must ensure that the deployed fallback studio uses the same * workspace and schemas as your local configuration. * */ fallbackStudioOrigin?: string } } /** * @public * Config for the apps that are available in the studio. */ declare type AppsOptions_2 = { canvas?: { enabled: boolean /** * To allow the "Link to canvas" action on localhost, or in studios not listed under Studios in https://www.sanity.io/manage * provide a fallback origin as a string. * * The string must be the exactly equal `name` as shown for the Studio in manage, and the studio must have create-manifest.json available. * * If the provided fallback Studio does not expose create-manifest.json "Link to canvas" will fail when using the fallback. * * Example: `wonderful.sanity.studio` * * Keep in mind that when fallback origin is used, Canvas will use the schema types and dataset in the *deployed* Studio, * not from localhost. * * To see data synced from Canvas in your localhost Studio, you must ensure that the deployed fallback studio uses the same * workspace and schemas as your local configuration. * */ fallbackStudioOrigin?: string } } /** * @hidden * @public */ declare interface ArrayFieldProps extends BaseFieldProps { schemaType: ArraySchemaType value: unknown[] | undefined collapsed?: boolean collapsible?: boolean onCollapse: () => void onExpand: () => void inputProps: ArrayOfObjectsInputProps } /** * @hidden * @public */ declare interface ArrayFieldProps_2 extends BaseFieldProps_2 { schemaType: ArraySchemaType value: unknown[] | undefined collapsed?: boolean collapsible?: boolean onCollapse: () => void onExpand: () => void inputProps: ArrayOfObjectsInputProps_2 } /** * @hidden * @beta */ declare interface ArrayInputCopyEvent<Item> { items: Item[] } /** * @hidden * @beta */ declare interface ArrayInputCopyEvent_2<Item> { items: Item[] } /** * These are the props an implementation of the ArrayFunctions component will receive * * * @hidden * @beta */ declare interface ArrayInputFunctionsProps<Item, SchemaType extends ArraySchemaType> { children?: ReactNode onItemAppend: (itemValue: Item) => void onChange: (event: PatchEvent) => void onValueCreate: (type: SchemaType) => Item onItemPrepend: (itemValue: Item) => void path: Path readOnly?: boolean schemaType: SchemaType value?: Item[] } /** * These are the props an implementation of the ArrayFunctions component will receive * * * @hidden * @beta */ declare interface ArrayInputFunctionsProps_2<Item, SchemaType extends ArraySchemaType> { children?: ReactNode onItemAppend: (itemValue: Item) => void onChange: (event: PatchEvent_2) => void onValueCreate: (type: SchemaType) => Item onItemPrepend: (itemValue: Item) => void path: Path readOnly?: boolean schemaType: SchemaType value?: Item[] } /** * @hidden * @beta */ declare interface ArrayInputInsertEvent<Item> { items: Item[] position: 'before' | 'after' referenceItem: KeyedSegment | number skipInitialValue?: boolean open?: boolean } /** * @hidden * @beta */ declare interface ArrayInputInsertEvent_2<Item> { items: Item[] position: 'before' | 'after' referenceItem: KeyedSegment | number skipInitialValue?: boolean open?: boolean } /** * @hidden * @beta */ declare interface ArrayInputMoveItemEvent { fromIndex: number toIndex: number } /** * @hidden * @beta */ declare interface ArrayInputMoveItemEvent_2 { fromIndex: number toIndex: number } /** * @hidden * @beta */ declare interface ArrayItemError { kind: 'error' key: string index: number error: InvalidItemTypeError } /** * @hidden * @beta */ declare interface ArrayItemError_2 { kind: 'error' key: string index: number error: InvalidItemTypeError_2 } /** @public */ declare interface ArrayOfObjectsFormNode< T extends any[] = KeyedObject[], S extends ArraySchemaType = ArraySchemaType, > extends BaseFormNode<T, S> { /** The focus path of the form node. */ focusPath: Path /** * @hidden * @beta */ members: ArrayOfObjectsMember[] } /** @public */ declare interface ArrayOfObjectsFormNode_2< T extends any[] = KeyedObject[], S extends ArraySchemaType = ArraySchemaType, > extends BaseFormNode_2<T, S> { /** The focus path of the form node. */ focusPath: Path /** * @hidden * @beta */ members: ArrayOfObjectsMember_2[] } /** * @hidden * @public */ declare interface ArrayOfObjectsInputProps< T extends { _key: string } = { _key: string }, S extends ArraySchemaType = ArraySchemaType, > extends BaseInputProps, Omit<ArrayOfObjectsFormNode<T[], S>, 'displayInlineChanges'> { /** * @hidden * @beta */ arrayFunctions?: ComponentType<ArrayInputFunctionsProps<T, S>> /** * @hidden * @beta */ onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void /** * @hidden * @beta */ onItemAppend: (item: T) => void /** * @hidden * @beta */ onItemPrepend: (item: T) => void /** * @hidden * @beta */ onItemRemove: (itemKey: string) => void /** * @hidden * @beta */ onItemMove: (event: ArrayInputMoveItemEvent) => void /** * @hidden * @beta */ onInsert: (event: ArrayInputInsertEvent<T>) => void /** * @hidden * @beta */ resolveInitialValue: (type: SchemaType, params: Record<string, unknown>) => Promise<T> /** * @hidden * @beta */ resolveUploader: UploaderResolver<ObjectSchemaType> /** * @hidden * @beta */ onUpload?: (event: UploadEvent) => void /** * @hidden * @beta */ onSelectFile?: (props: InputOnSelectFileFunctionProps) => void /** * @hidden * @beta */ onPathFocus: (path: Path, payload?: OnPathFocusPayload) => void /** * for array inputs using expand/collapse semantics for items * * @hidden * @beta */ onItemCollapse: (itemKey: string) => void /** * @hidden * @beta */ onItemExpand: (itemKey: string) => void /** * for array inputs using modal open/close semantics for items * * @hidden * @beta */ onItemOpen: (path: Path) => void /** * @hidden * @beta */ onItemClose: () => void /** * @hidden * @beta */ renderAnnotation?: RenderAnnotationCallback /** * @hidden * @beta */ renderBlock?: RenderBlockCallback /** * @hidden * @beta */ renderInlineBlock?: RenderBlockCallback /** * @hidden * @beta */ renderField: RenderFieldCallback /** * @hidden * @beta */ renderInput: RenderInputCallback /** * @hidden * @beta */ renderItem: RenderArrayOfObjectsItemCallback /** * @hidden * @beta */ renderPreview: RenderPreviewCallback /** * @hidden * @beta */ elementProps: ComplexElementProps } /** * @hidden * @public */ declare interface ArrayOfObjectsInputProps_2< T extends { _key: string } = { _key: string }, S extends ArraySchemaType = ArraySchemaType, > extends BaseInputProps_2, Omit<ArrayOfObjectsFormNode_2<T[], S>, 'displayInlineChanges'> { /** * @hidden * @beta */ arrayFunctions?: ComponentType<ArrayInputFunctionsProps_2<T, S>> /** * @hidden * @beta */ onChange: (patch: FormPatch_2 | FormPatch_2[] | PatchEvent_2) => void /** * @hidden * @beta */ onItemAppend: (item: T) => void /** * @hidden * @beta */ onItemPrepend: (item: T) => void /** * @hidden * @beta */ onItemRemove: (itemKey: string) => void /** * @hidden * @beta */ onItemMove: (event: ArrayInputMoveItemEvent_2) => void /** * @hidden * @beta */ onInsert: (event: ArrayInputInsertEvent_2<T>) => void /** * @hidden * @beta */ resolveInitialValue: (type: SchemaType, params: Record<string, unknown>) => Promise<T> /** * @hidden * @beta */ resolveUploader: UploaderResolver_2<ObjectSchemaType> /** * @hidden * @beta */ onUpload?: (event: UploadEvent_2) => void /** * @hidden * @beta */ onSelectFile?: (props: InputOnSelectFileFunctionProps_2) => void /** * @hidden * @beta */ onPathFocus: (path: Path, payload?: OnPathFocusPayload_2) => void /** * for array inputs using expand/collapse semantics for items * * @hidden * @beta */ onItemCollapse: (itemKey: string) => void /** * @hidden * @beta */ onItemExpand: (itemKey: string) => void /** * for array inputs using modal open/close semantics for items * * @hidden * @beta */ onItemOpen: (path: Path) => void /** * @hidden * @beta */ onItemClose: () => void /** * @hidden * @beta */ renderAnnotation?: RenderAnnotationCallback_2 /** * @hidden * @beta */ renderBlock?: RenderBlockCallback_2 /** * @hidden * @beta */ renderInlineBlock?: RenderBlockCallback_2 /** * @hidden * @beta */ renderField: RenderFieldCallback_2 /** * @hidden * @beta */ renderInput: RenderInputCallback_2 /** * @hidden * @beta */ renderItem: RenderArrayOfObjectsItemCallback_2 /** * @hidden * @beta */ renderPreview: RenderPreviewCallback_2 /** * @hidden * @beta */ elementProps: ComplexElementProps_2 } /** * @hidden * @beta */ declare interface ArrayOfObjectsItemMember<Node extends ObjectArrayFormNode = ObjectArrayFormNode> { kind: 'item' key: string index: number collapsed: boolean | undefined collapsible: boolean | undefined open: boolean parentSchemaType: ArraySchemaType /** * @hidden * @beta */ item: Node } /** * @hidden * @beta */ declare interface ArrayOfObjectsItemMember_2< Node extends ObjectArrayFormNode_2 = ObjectArrayFormNode_2, > { kind: 'item' key: string index: number collapsed: boolean | undefined collapsible: boolean | undefined open: boolean parentSchemaType: ArraySchemaType /** * @hidden * @beta */ item: Node } /** * @hidden * @beta */ declare type ArrayOfObjectsMember = ArrayOfObjectsItemMember | ArrayItemError /** * @hidden * @beta */ declare type ArrayOfObjectsMember_2 = ArrayOfObjectsItemMember_2 | ArrayItemError_2 /** * @hidden * @beta */ declare type ArrayOfPrimitivesElementType<T extends any[]> = T extends (infer K)[] ? K : unknown /** * @hidden * @beta */ declare type ArrayOfPrimitivesElementType_2<T extends any[]> = T extends (infer K)[] ? K : unknown /** @public */ declare interface ArrayOfPrimitivesFormNode< T extends (string | number | boolean)[] = (string | number | boolean)[], S extends ArraySchemaType = ArraySchemaType, > extends BaseFormNode<T, S> { /** The focus path of the form node. */ focusPath: Path /** * @hidden * @beta */ members: ArrayOfPrimitivesMember[] } /** @public */ declare interface ArrayOfPrimitivesFormNode_2< T extends (string | number | boolean)[] = (string | number | boolean)[], S extends ArraySchemaType = ArraySchemaType, > extends BaseFormNode_2<T, S> { /** The focus path of the form node. */ focusPath: Path /** * @hidden * @beta */ members: ArrayOfPrimitivesMember_2[] } /** * @hidden * @public */ declare interface ArrayOfPrimitivesInputProps< T extends string | boolean | number = string | boolean | number, S extends ArraySchemaType = ArraySchemaType, > extends BaseInputProps, Omit<ArrayOfPrimitivesFormNode<T[], S>, 'displayInlineChanges'> { /** * @hidden * @beta */ arrayFunctions?: ComponentType<ArrayInputFunctionsProps<T, S>> onSetCollapsed: (collapsed: boolean) => void /** * @hidden * @beta */ onChange: (patch: FormPatch | FormPatch[] | PatchEvent) => void /** * @hidden * @beta */ onItemAppend: (item: ArrayOfPrimitivesElementType<T[]>) => void /** * @hidden * @beta */ onItemPrepend: (item: ArrayOfPrimitivesElementType<T[]>) => void /** * @hidden * @beta */ onItemRemove: (index: number) => void /** * @hidden * @beta */ onMoveItem: (event: ArrayInputMoveItemEvent) => void /** * @hidden * @beta */ onInsert: (event: {items: T[]; position: 'before' | 'after'; referenceIndex: number}) => void /** * @hidden * @beta */ resolveUploader: UploaderResolver<NumberSchemaType | BooleanSchemaType | StringSchemaType> /** * @hidden * @beta */ onUpload: (event: UploadEvent) => void /** * @hidden * @beta */ onIndexFocus: (index: number) => void /** * @hidden * @beta */ renderAnnotation?: RenderAnnotationCallback /** * @hidden * @beta */ renderBlock?: RenderBlockCallback /** * @hidden * @beta */ renderInlineBlock?: RenderBlockCallback /** * @hidden * @beta */ renderInput: RenderInputCallback /** * @hidden * @beta */ renderItem: RenderArrayOfPrimitivesItemCallback /** * @hidden * @beta */ renderPreview: RenderPreviewCallback /** * @hidden * @beta */ elementProps: ComplexElementProps } /** * @hidden * @public */ declare interface ArrayOfPrimitivesInputProps_2< T extends string | boolean | number = string | boolean | number, S extends ArraySchemaType = ArraySchemaType, > extends BaseInputProps_2, Omit<ArrayOfPrimitivesFormNode_2<T[], S>, 'displayInlineChanges'> { /** * @hidden * @beta */ arrayFunctions?: ComponentType<ArrayInputFunctionsProps_2<T, S>> onSetCollapsed: (collapsed: boolean) => void /** * @hidden * @beta */ onChange: (patch: FormPatch_2 | FormPatch_2[] | PatchEvent_2) => void /** * @hidden * @beta */ onItemAppend: (item: ArrayOfPrimitivesElementType_2<T[]>) => void /** * @hidden * @beta */ onItemPrepend: (item: ArrayOfPrimitivesElementType_2<T[]>) => void /** * @hidden * @beta */ onItemRemove: (index: number) => void /** * @hidden * @beta */ onMoveItem: (event: ArrayInputMoveItemEvent_2) => void /** * @hidden * @beta */ onInsert: (event: {items: T[]; position: 'before' | 'after'; referenceIndex: number}) => void /** * @hidden * @beta */ resolveUploader: UploaderResolver_2<NumberSchemaType | BooleanSchemaType | StringSchemaType> /** * @hidden * @beta */ onUpload: (event: UploadEvent_2) => void /** * @hidden * @beta */ onIndexFocus: (index: number) => void /** * @hidden * @beta */ renderAnnotation?: RenderAnnotationCallback_2 /** * @hidden * @beta */ renderBlock?: RenderBlockCallback_2 /** * @hidden * @beta */ renderInlineBlock?: RenderBlockCallback_2 /** * @hidden * @beta */ renderInput: RenderInputCallback_2 /** * @hidden * @beta */ renderItem: RenderArrayOfPrimitivesItemCallback_2 /** * @hidden * @beta */ renderPreview: RenderPreviewCallback_2 /** * @hidden * @beta */ elementProps: ComplexElementProps_2 } /** * @hidden * @beta */ declare interface ArrayOfPrimitivesItemMember<Node extends PrimitiveFormNode = PrimitiveFormNode> { kind: 'item' key: string index: number open: boolean parentSchemaType: ArraySchemaType /** * @hidden * @beta */ item: Node } /** * @hidden * @beta */ declare interface ArrayOfPrimitivesItemMember_2< Node extends PrimitiveFormNode_2 = PrimitiveFormNode_2, > { kind: 'item' key: string index: number open: boolean parentSchemaType: ArraySchemaType /** * @hidden * @beta */ item: Node } /** * @hidden * @beta */ declare type ArrayOfPrimitivesMember = ArrayOfPrimitivesItemMember | ArrayItemError /** * @hidden * @beta */ declare type ArrayOfPrimitivesMember_2 = ArrayOfPrimitivesItemMember_2 | ArrayItemError_2 /** * @hidden * @beta */ declare type AssetSourceResolver = ComposableOption<AssetSource[], ConfigContext> /** * @hidden * @beta */ declare type AssetSourceResolver_2 = ComposableOption_2<AssetSource[], ConfigContext_2> /** * @hidden * @beta */ declare type AsyncComposableOption<TValue, TContext> = ( prev: TValue, context: TContext, ) => Promise<TValue> /** * @hidden * @beta */ declare type AsyncComposableOption_2<TValue, TContext> = ( prev: TValue, context: TContext, ) => Promise<TValue> /** * Authentication options * * @public */ declare interface AuthConfig { /** * Login method to use for the studio. Can be one of: * - `dual` (default) - attempt to use cookies where possible, falling back to * storing authentication token in `localStorage` otherwise * - `cookie` - explicitly disable `localStorage` method, relying only on cookies. May fail due * to cookies being treated as third-party cookies in some browsers, thus the default is `dual`. * - `token` - explicitly disable cookies, relying only on `localStorage` method */ loginMethod?: LoginMethod /** * Whether to append the providers specified in `providers` with the default providers from the * API, or replace the default providers with the ones specified. * * @deprecated Use the function form of `providers` instead for more control */ mode?: 'append' | 'replace' /** * If true, the "Choose login provider" (eg "Google, "GitHub", "E-mail/password") screen * will be skipped if only a single provider is configured in the `providers` array - * instead it will redirect unauthenticated users straight to the authentication URL. */ redirectOnSingle?: boolean /** * Array of authentication providers to use, or a function that takes an array of default * authentication providers (fetched from the Sanity API) and should return a new list of * providers. This can be used to selectively replace, add or remove providers from the * list of choices. * * @remarks If a static array of providers is provided, the `mode` property is taken into account * when determining what to do with it - `append` will append the providers to the default set * of providers, while `replace` will replace the default providers with the ones specified. * * If not set, the default providers will be used. */ providers?: AuthProvider[] | ((prev: AuthProvider[]) => AuthProvider[] | Promise<AuthProvider[]>) /** * The API hostname for requests. Should usually be left undefined, * but can be set if using custom cname for API domain. */ apiHost?: string } /** * Authentication options * * @public */ declare interface AuthConfig_2 { /** * Login method to use for the studio. Can be one of: * - `dual` (default) - attempt to use cookies where possible, falling back to * storing authentication token in `localStorage` otherwise * - `cookie` - explicitly disable `localStorage` method, relying only on cookies. May fail due * to cookies being treated as third-party cookies in some browsers, thus the default is `dual`. * - `token` - explicitly disable cookies, relying only on `localStorage` method */ loginMethod?: LoginMethod_2 /** * Whether to append the providers specified in `providers` with the default providers from the * API, or replace the default providers with the ones specified. * * @deprecated Use the function form of `providers` instead for more control */ mode?: 'append' | 'replace' /** * If true, the "Choose login provider" (eg "Google, "GitHub", "E-mail/password") screen * will be skipped if only a single provider is configured in the `providers` array - * instead it will redirect unauthenticated users straight to the authentication URL. */ redirectOnSingle?: boolean /** * Array of authentication providers to use, or a function that takes an array of default * authentication providers (fetched from the Sanity API) and should return a new list of * providers. This can be used to selectively replace, add or remove providers from the * list of choices. * * @remarks If a static array of providers is provided, the `mode` property is taken into account * when determining what to do with it - `append` will append the providers to the default set * of providers, while `replace` will replace the default providers with the ones specified. * * If not set, the default providers will be used. */ providers?: | AuthProvider_2[] | ((prev: AuthProvider_2[]) => AuthProvider_2[] | Promise<AuthProvider_2[]>) /** * The API hostname for requests. Should usually be left undefined, * but can be set if using custom cname for API domain. */ apiHost?: string } /** * A provider of authentication. * * By default, a list of providers for a project will be fetched from the * {@link https://api.sanity.io/v1/auth/providers | Sanity API}, but you may choose to limit this * list by explicitly defining the providers you want to allow, or add additional custom providers * that conforms to the authentication provider specification outlined in * {@link https://www.sanity.io/docs/third-party-login | the documentation}. * * @public */ declare interface AuthProvider { /** * URL-friendly identifier/name for the provider, eg `github` */ name: string /** * Human friendly title for the provider, eg `GitHub` */ title: string /** * URL for the authentication endpoint that will trigger the authentication flow */ url: string /** * URL for a logo to display next to the provider in the login screen */ logo?: string } /** * A provider of authentication. * * By default, a list of providers for a project will be fetched from the * {@link https://api.sanity.io/v1/auth/providers | Sanity API}, but you may choose to limit this * list by explicitly defining the providers you want to allow, or add additional custom providers * that conforms to the authentication provider specification outlined in * {@link https://www.sanity.io/docs/third-party-login | the documentation}. * * @public */ declare interface AuthProvider_2 { /** * URL-friendly identifier/name for the provider, eg `github` */ name: string /** * Human friendly title for the provider, eg `GitHub` */ title: string /** * URL for the authentication endpoint that will trigger the authentication flow */ url: string /** * URL for a logo to display next to the provider in the login screen */ logo?: string } /** * The unit an `AuthStore` emits to determine the user's authentication state. * * @beta * @hidden */ declare interface AuthState { /** * Similar to a logged-in flag. This state is used in places like the * `AuthBoundary` to determine whether or not it should render the * `NotAuthenticatedComponent`. Implementers may choose to set this to `true` * while also also emitting a `currentUser` of `null` if a `null` user is * accepted (e.g. a project that doesn't require a login) */ authenticated: boolean /** * The value of the user logged in or `null` if none is provided */ currentUser: CurrentUser | null /** * A client that is expected to be pre-configured to allow for any downstream * requests in the Studio */ client: SanityClient } /** * The unit an `AuthStore` emits to determine the user's authentication state. * * @beta * @hidden */ declare interface AuthState_2 { /** * Similar to a logged-in flag. This state is used in places like the * `AuthBoundary` to determine whether or not it should render the * `NotAuthenticatedComponent`. Implementers may choose to set this to `true` * while also also emitting a `currentUser` of `null` if a `null` user is * accepted (e.g. a project that doesn't require a login) */ authenticated: boolean /** * The value of the user logged in or `null` if none is provided */ currentUser: CurrentUser | null /** * A client that is expected to be pre-configured to allow for any downstream * requests in the Studio */ client: SanityClient } /** * The interface used by the Studio that produces a `SanityClient` and * `CurrentUser` that gets passed to the resulting `Workspace`s and `Source`s. * * NOTE: This interface is primarily for internal use. Refer to * `createAuthStore` instead. * * @beta * @hidden */ declare interface AuthStore { /** * Emits `AuthState`s. This should update when the user's auth state changes. * E.g. After a login, a new `AuthState` could be emitted with a non-null * `currentUser` and `authenticated: true` * * NOTE: all auth store implementations should emit on subscribe using * something like shareReplay(1) to ensure all new subscribers get an * `AuthState` value on subscribe */ state: Observable<AuthState> /** * Emits auth tokens, or `null` if not configured to use them or they do not exist */ token?: Observable<string | null> /** * Custom auth stores are expected to implement a UI that initiates the user's * authentication. For the typical case in `createAuthStore`, this means * loading the providers and showing them as options to the user. */ LoginComponent?: ComponentType<LoginComponentProps> /** * Custom auth stores can implement a function that runs when the user logs * out. The implementation is expected to remove all credentials both locally * and on the server. */ logout?: () => void /** * Custom auth stores can implement a function that is designated to run when * the Studio loads (e.g. to trade a session ID for a token in cookie-less * mode). Within the Studio, this is called within the `AuthBoundary`. */ handleCallbackUrl?: () => Promise<void> } /** * The interface used by the Studio that produces a `SanityClient` and * `CurrentUser` that gets passed to the resulting `Workspace`s and `Source`s. * * NOTE: This interface is primarily for internal use. Refer to * `createAuthStore` instead. * * @beta * @hidden */ declare interface AuthStore_2 { /** * Emits `AuthState`s. This should update when the user's auth state changes. * E.g. After a login, a new `AuthState` could be emitted with a non-null * `currentUser` and `authenticated: true` * * NOTE: all auth store implementations should emit on subscribe using * something like shareReplay(1) to ensure all new subscribers get an * `AuthState` value on subscribe */ state: Observable<AuthState_2> /** * Emits auth tokens, or `null` if not configured to use them or they do not exist */ token?: Observable<string | null> /** * Custom auth stores are expected to implement a UI that initiates the user's * authentication. For the typical case in `createAuthStore`, this means * loading the providers and showing them as options to the user. */ LoginComponent?: ComponentType<LoginComponentProps_2> /** * Custom auth stores can implement a function that runs when the user logs * out. The implementation is expected to remove all credentials both locally * and on the server. */ logout?: () => void /** * Custom auth stores can implement a function that is designated to run when * the Studio loads (e.g. to trade a session ID for a token in cookie-less * mode). Within the Studio, this is called within the `AuthBoundary`. */ handleCallbackUrl?: () => Promise<void> } /** * @deprecated Import from `sanity/structure` instead * @hidden * @beta */ export declare type BackLinkProps = BackLinkProps_2 /** * @hidden * @beta */ declare interface BackLinkProps_2 { children?: ReactNode } /** * @hidden * @beta */ declare interface BaseActionDescription { disabled?: boolean icon?: ReactNode | ComponentType label: string onHandle?: () => void title?: ReactNode tone?: ButtonTone shortcut?: string | null dialog?: unknown } /** * @hidden * @beta */ declare interface BaseActionDescription_2 { disabled?: boolean icon?: ReactNode | ComponentType label: string onHandle?: () => void title?: ReactNode tone?: ButtonTone shortcut?: string | null dialog?: unknown } /** * A generic event with a type and a timestamp. * @hidden * @beta */ declare interface BaseEvent { id: string timestamp: string author: string /** * This is added client side to enhance the UI. */ documentVariantType: DocumentVariantType } /** * @hidden * @public */ declare interface BaseFieldProps { /** @beta */ actions?: DocumentFieldAction[] /** @internal @deprecated DO NOT USE */ __internal_comments?: FieldCommentsProps /** @internal @deprecated ONLY USED BY AI ASSIST PLUGIN */ __internal_slot?: ReactNode schemaType: SchemaType title: string | undefined description: string | undefined /** * @hidden * @beta */ presence: FormNodePresence[] validation: FormNodeValidation[] level: number inputId: string value: unknown | undefined path: Path name: string index: number changed: boolean children: ReactNode version?: string renderDefault: (props: FieldProps) => React.JSX.Element } /** * @hidden * @public */ declare interface BaseFieldProps_2 { /** @beta */ actions?: DocumentFieldAction_2[] /** @internal @deprecated DO NOT USE */ __internal_comments?: FieldCommentsProps_2 /** @internal @deprecated ONLY USED BY AI ASSIST PLUGIN */ __internal_slot?: ReactNode schemaType: SchemaType title: string | undefined description: string | undefined /** * @hidden * @beta */ presence: FormNodePresence_2[] validation: FormNodeValidation[] level: number inputId: string value: unknown | undefined path: Path name: string index: number changed: boolean children: ReactNode version?: string renderDefault: (props: FieldProps_2) => React.JSX.Element } /** * @hidden * @public */ declare interface BaseFormNode< T = unknown, S extends SchemaType = SchemaType, > extends NodeDiffProps<ProvenanceDiffAnnotation, T> { /** The unique identifier of the node. */ id: string /** The schema type of the node. */ schemaType: S /** The level of the node in the form hierarchy. */ level: number /** The path of the node in the form hierarchy. */ path: Path /** * @hidden * @beta */ presence: FormNodePresence[] /** The validation markers of the node. */ validation: FormNodeValidation[] /** The value of the node. */ value: T | undefined /** Whether the node is read-only. */ readOnly?: boolean /** Whether the node is focused. */ focused?: boolean displayInlineChanges?: boolean } /** * @hidden * @public */ declare interface BaseFormNode_2< T = unknown, S extends SchemaType = SchemaType, > extends NodeDiffProps_2<ProvenanceDiffAnnotation_2, T> { /** The unique identifier of the node. */ id: string /** The schema type of the node. */ schemaType: S /** The level of the node in the form hierarchy. */ level: number /** The path of the node in the form hierarchy. */ path: Path /** * @hidden * @beta */ presence: FormNodePresence_2[] /** The validation markers of the node. */ validation: FormNodeValidation[] /** The value of the node. */ value: T | undefined /** Whether the node is read-only. */ readOnly?: boolean /** Whether the node is focused. */ focused?: boolean displayInlineChanges?: boolean } /** * @deprecated Import from `sanity/structure` instead * @hidden * @beta */ export declare type BaseGenericList = BaseGenericList_2 /** * Interface for base generic list * * @public */ declare interface BaseGenericList_2 extends StructureNode_2 { /** List layout key. */ defaultLayout?: PreviewLayoutKey /** Can handle intent. See {@link IntentChecker} */ canHandleIntent?: IntentChecker_2 /** List display options. See {@link ListDisplayOptions} */ displayOptions?: ListDisplayOptions_2 /** List child. See {@link Child} */ child: Child_2 /** List initial values array. See {@link InitialValueTemplateItem} and {@link InitialValueTemplateItemBuilder} */ initialValueTemplates?: (InitialValueTemplateItem | InitialValueTemplateItemBuilder_2)[] } /** * @hidden * @public */ declare interface BaseInputProps { renderDefault: (props: InputProps) => React.JSX.Element /** * Whether the input should display inline changes. Inline changes express how a field's value * differs from its upstream version. Unlike custom diff components, inline changes is a mode * that allows the input component itself to display the change in situ. */ displayInlineChanges: boolean } /** * @hidden * @public */ declare interface BaseInputProps_2 { renderDefault: (props: InputProps_2) => React.JSX.Element /** * Whether the input should display inline changes. Inline changes express how a field's value * differs from its upstream version. Unlike custom diff components, inline changes is a mode * that allows the input component itself to display the change in situ. */ displayInlineChanges: boolean } /** * @deprecated Import from `sanity/structure` instead * @hidden * @beta */ export declare type BaseIntentParams = BaseIntentParams_2 /** * Base intent parameters * * @public * @todo dedupe with core */ declare interface BaseIntentParams_2 { /** * Document schema type name to create/edit. * Required for `create` intents, optional for `edit` (but encouraged, safer and faster) */ type?: string /** * ID of the document to create/edit. * Required for `edit` intents, optional for `create`. */ id?: string /** * Name (ID) of initial value template to use for `create` intent. Optional. */ template?: string /** * Experimental field path * * @beta * @experimental * @hidden */ path?: string /** * Optional "mode" to use for edit intent. * Known modes are `structure` and `presentation`. */ mode?: string /** * Arbitrary/custom parameters are generally discouraged - try to keep them to a minimum, * or use `payload` (arbitrary JSON-serializable object) instead. */ [key: string]: string | undefined } /** * Props for the base item component. * * @public */ declare interface BaseItemProps<T> extends NodeDiffProps<ProvenanceDiffAnnotation> { /** The schema type of the item. */ schemaType: SchemaType /** The index of the item. */ index: number /** The level of the item. */ level: number /** The value of the item. */ value: unknown /** The path of the item. */ path: Path /** The title of the item. */ title: string | undefined /** The description of the item. */ description: string | undefined /** The ID of the input element. */ inputId: string /** The function to call when the item receives focus. */ onFocus: (event: FocusEvent_2) => void /** The function to call when the item loses focus. */ onBlur: (event: FocusEvent_2) => void /** Whether the item is read-only. */ readOnly?: boolean /** Whether the item is focused. */ focused?: boolean /** The function to call when the item is removed. */ onRemove: () => void /** * @hidden * @beta */ onInsert: (event: Omit<ArrayInputInsertEvent<T>, 'referenceItem'>) => void /** * @hidden * @beta */ onCopy: (event: Omit<ArrayInputCopyEvent<T>, 'referenceItem'>) => void /** The children of the item. */ children: ReactNode /** The validation markers for the item. */ validation: FormNodeValidation[] /** * @hidden * @beta */ presence: FormNodePresence[] /** The function to call to render the default item. See {@link ItemProps} */ renderDefault: (props: ItemProps) => React.JSX.Element } /** * Props for the base item component. * * @public */ declare interface BaseItemProps_2<T> extends NodeDiffProps_2<ProvenanceDiffAnnotation_2> { /** The schema type of the item. */ schemaType: SchemaType /** The index of the item. */ index: number /** The level of the item. */ level: number /** The value of the item. */ value: unknown /** The path of the item. */ path: Path /** The title of the item. */ title: string | undefined /** The description of the item. */ description: string | undefined /** The ID of the input element. */ inputId: string /** The function to call when the item receives focus. */ onFocus: (event: FocusEvent_2) => void /** The function to call when the item loses focus. */ onBlur: (event: FocusEvent_2) => void /** Whether the item is read-only. */ readOnly?: boolean /** Whether the item is focused. */ focused?: boolean /** The function to call when the item is removed. */ onRemove: () => void /** * @hidden * @beta */ onInsert: (event: Omit<ArrayInputInsertEvent_2<T>, 'referenceItem'>) => void /** * @hidden * @beta */ onCopy: (event: Omit<ArrayInputCopyEvent_2<T>, 'referenceItem'>) => void /** The children of the item. */ children: ReactNode /** The validation markers for the item. */ validation: FormNodeValidation[] /** * @hidden * @beta */ presence: FormNodePresence_2[] /** The function to call to render the default item. See {@link ItemProps} */ renderDefault: (props: ItemProps_2) => React.JSX.Element } /** @internal */ export declare interface BaseResolvedPaneNode<T extends PaneNode_2['type']> { id: string type: T title: string i18n?: I18nTextRecord<'title'> menuItems?: PaneMenuItem_2[] menuItemGroups?: PaneMenuItemGroup_2[] canHandleIntent?: ( intentName: string, params: Record<string, string | undefined>, options: { pane: PaneNode_2 index: number }, ) => boolean child?: UnresolvedPaneNode_2 } declare interface BaseStructureToolPaneProps<T extends PaneNode_2['type']> { paneKey: string index: number itemId: string childItemId?: string isSelected?: boolean isActive?: boolean pane: Extract< PaneNode_2, { type: T } > /** * TODO: COREL - Remove this after updating sanity-assist to use <PerspectiveProvider> * * Allows to override the global version with a specific version or release. * @deprecated use <PerspectiveProvider> instead * @beta */ forcedVersion?: { selectedPerspectiveName: ReleaseId | 'published' | undefined isReleaseLocked: boolean selectedReleaseId: ReleaseId | undefined } /** * @deprecated Avoid specifying a key, instead use `paneKey` if need be */ key?: string } /** * @deprecated Import from `sanity/structure` instead * @hidden * @beta */ export declare type BaseView = BaseView_2 /** * Interface for base view * * @public */ declare interface BaseView_2 { /** View id */ id: string /** View Title */ title: string /** View Icon */ icon?: React.ComponentType | React.ReactNode } /** * @internal * Configuration for studio beta features. * */ declare interface BetaFeatures { /** beta features with the form namespace */ form?: { /** * Enhanced Object Dialog is a new dialog for editing objects in the studio. * @beta */ enhancedObjectDialog?: { enabled: boolean } } /** * @deprecated - The Start in Create flow has been removed and will be updated in an upcoming studio release. */ create?: { /** * When true, a "Start in Sanity Create" action will be shown for all new documents, in place of regular document actions, * when the following are true: * - the origin of the current url is listed under Studios in sanity.to/manage (OR fallbackStudioOrigin is provided) * - [origin]/static/create-manifest.json is available over HTTP GET * * The manifest file is automatically created and deployed when deploying studios with `sanity deploy` * * @see #fallbackStudioOrigin */ startInCreateEnabled?: boolean /** * To show the "Start in Create" button on localhost, or in studios not listed under Studios in https://www.sanity.io/manage * provide a fallback origin as a string. * * The string must be the exactly equal `name` as shown for the Studio in manage, and the studio must have create-manifest.json available. * * If the provided fallback Studio does not expose create-manifest.json "Start in Sanity Create" will fail when using the fallback. * * Example: `wonderful.sanity.studio` * * Keep in mind that when fallback origin is used, Sanity Create will used the schema types and dataset in the *deployed* Studio, * not from localhost. * * To see data synced from Sanity Create in your localhost Studio, you must ensure that the deployed fallback studio uses the same * workspace and schemas as your local configuration. * * @see #startInCreateEnabled */ fallbackStudioOrigin?: string } /** * Config for the history events API . * * If enabled, it will use the new events API to fetch document history. * * If it is not enabled, it will continue using the legacy Timeline. */ eventsAPI?: { documents?: boolean releases?: boolean } } /** * @internal * Configuration for studio beta features. * */ declare interface BetaFeatures_2 { /** beta features with the form namespace */ form?: { /** * Enhanced Object Dialog is a new dialog for editing objects in the studio. * @beta */ enhancedObjectDialog?: { enabled: boolean } } /** * @deprecated - The Start in Create flow has been removed and will be updated in an upcoming studio release. */ create?: { /** * When true, a "Start in Sanity Create" action will be shown for all new documents, in place of regular document actions, * when the following are true: * - the origin of the current url is listed under Studios in sanity.to/manage (OR fallbackStudioOrigin is provided) * - [origin]/static/create-manifest.json is available over HTTP GET * * The manifest file is automatically created and deployed when deploying studios with `sanity deploy` * * @see #fallbackStudioOrigin */ startInCreateEnabled?: boolean /** * To show the "Start in Create" button on localhost, or in studios not listed under Studios in https://www.sanity.io/manage * provide a fallback origin as a string. * * The string must be the exactly equal `name` as shown for the Studio in manage, and the studio must have create-manifest.json available. * * If the provided fallback Studio does not expose create-manifest.json "Start in Sanity Create" will fail when using the fallback. * * Example: `wonderful.sanity.studio` * * Keep in mind that when fallback origin is used, Sanity Create will used the schema types and dataset in the *deployed* Studio, * not from localhost. * * To see data synced from Sanity Create in your localhost Studio, you must ensure that the deployed fallback studio uses the same * workspace and schemas as your local configuration. * * @see #startInCreateEnabled */ fallbackStudioOrigin?: string } /** * Config for the history events API . * * If enabled, it will use the new events API to fetch document history. * * If it is not enabled, it will continue using the legacy Timeline. */ eventsAPI?: { documents?: boolean releases?: boolean } } /** * Props for rendering a Portable Text annotation * * @public * @remarks If you want to render a mix of the annotated text and non-text content, you have to attribute * the non-text containers with `contentEditable={false}`. See the second example. * @example Simple example of customizing the annotation text to render yellow. * ```ts * (props: BlockAnnotationProps) => * props.renderDefault({ * ...props, * textElement: <span style={{color: 'yellow'}}>{props.textElement}</span>, * }) * ``` * @example Simple example of rendering the annotation with a custom modal for editing. * Note that the form content container is attributed as `contentEditable={false}`. * This is to signal to the text editor that this content isn't part of the editable text. * ```ts * (props: BlockAnnotationProps) => { * return ( * <> * // Render the annotated text * <span onClick={props.onOpen}> * {props.textElement} * </span> * // Render the editing form if the object is opened * {props.open && ( * <Dialog * contentEditable={false} // Attribute this as non-editable to the text editor * header={`Edit ${props.schemaType.title}`} * id={`dialog-${props.value._key}`} *