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
TypeScript
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}`}
*