diff --git a/packages/@sanity/types/src/schema/definition/type/block.ts b/packages/@sanity/types/src/schema/definition/type/block.ts index 7d066b702da..abb73d1079e 100644 --- a/packages/@sanity/types/src/schema/definition/type/block.ts +++ b/packages/@sanity/types/src/schema/definition/type/block.ts @@ -54,8 +54,11 @@ export interface BlockDecoratorDefinition { /** * Schema definition for a text block style. + * A text block may have a block style like 'header', 'normal', 'lead' + * attached to it, which is stored on the `.style` property for that block. * * @public + * @remarks The first defined style will become the default style.ยดยด * @example The default set of styles * ```ts * { @@ -79,6 +82,29 @@ export interface BlockDecoratorDefinition { * ] * } * ``` + * @example Example of defining a block type with custom styles and render components. + * ```ts + * defineArrayMember({ + * type: 'block', + * styles: [ + * { + * title: 'Paragraph', + * value: 'paragraph', + * component: ParagraphStyle, + * }, + * { + * title: 'Lead', + * value: 'lead', + * component: LeadStyle, + * }, + * { + * title: 'Heading', + * value: 'heading', + * component: HeadingStyle, + * }, + * ], + * }) + * ``` */ export interface BlockStyleDefinition { title: string diff --git a/packages/sanity/src/core/components/previews/types.ts b/packages/sanity/src/core/components/previews/types.ts index 3c033f358f5..105b360e3db 100644 --- a/packages/sanity/src/core/components/previews/types.ts +++ b/packages/sanity/src/core/components/previews/types.ts @@ -24,7 +24,7 @@ export type PreviewLayoutKey = GeneralPreviewLayoutKey | PortableTextPreviewLayo /** * @hidden - * @beta + * @public */ export interface PreviewMediaDimensions { aspect?: number diff --git a/packages/sanity/src/core/form/FormBuilderContext.ts b/packages/sanity/src/core/form/FormBuilderContext.ts index 72845f995e4..15292b0a118 100644 --- a/packages/sanity/src/core/form/FormBuilderContext.ts +++ b/packages/sanity/src/core/form/FormBuilderContext.ts @@ -3,7 +3,6 @@ import {createContext} from 'react' import {DocumentFieldAction} from '../config' import {PatchChannel} from './patch' import { - FormBuilderArrayFunctionComponent, FormBuilderCustomMarkersComponent, FormBuilderFilterFieldFn, FormBuilderMarkersComponent, diff --git a/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx b/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx index 9196bb501d1..6b1f2b525d2 100644 --- a/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx +++ b/packages/sanity/src/core/form/inputs/PortableText/PortableTextInput.tsx @@ -45,10 +45,16 @@ export interface PortableTextMemberItem { } /** - * The root Portable Text Input component + * Input component for editing block content + * ({@link https://github.com/portabletext/portabletext | Portable Text}) in the Sanity Studio. * - * @hidden - * @beta + * Supports multi-user real-time block content editing on larger documents. + * + * This component can be configured and customized extensively. + * {@link https://www.sanity.io/docs/portable-text-features | Go to the documentation for more details}. + * + * @public + * @param props - {@link PortableTextInputProps} component props. */ export function PortableTextInput(props: PortableTextInputProps) { const { diff --git a/packages/sanity/src/core/form/types/_transitional.ts b/packages/sanity/src/core/form/types/_transitional.ts index 6babe7c3d11..1762993b5c6 100644 --- a/packages/sanity/src/core/form/types/_transitional.ts +++ b/packages/sanity/src/core/form/types/_transitional.ts @@ -14,18 +14,20 @@ import {FieldProps} from './fieldProps' import {ItemProps} from './itemProps' /** - * Export `PortableTextMarker` so it can be used to build custom Portable Text markers. + * Function for rendering custom block markers * - * @beta + * @public * @hidden - * @deprecated - use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead + * @deprecated use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead */ export type RenderCustomMarkers = (markers: PortableTextMarker[]) => React.ReactNode /** + * Props for rendering block actions * + * @public * @hidden - * @beta + * @deprecated use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead */ export interface RenderBlockActionsProps { block: PortableTextBlock @@ -36,18 +38,20 @@ export interface RenderBlockActionsProps { } /** + * Function for rendering custom block actions * + * @public * @hidden - * @beta + * @deprecated use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead */ export type RenderBlockActionsCallback = (props: RenderBlockActionsProps) => React.ReactNode /** * A generic marker for attaching metadata to specific nodes of the Portable Text input. * - * @beta + * @public * @hidden - * @deprecated - use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead + * @deprecated use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead * @param type - a type name for this marker * @param data - some data connected to this marker * @param path - the path to the Portable Text content connected to this marker @@ -59,18 +63,11 @@ export interface PortableTextMarker { } /** + * Component for rendering custom block markers * + * @public * @hidden - * @beta - */ -export type FormBuilderArrayFunctionComponent = React.ComponentType< - ArrayInputFunctionsProps -> - -/** - * - * @hidden - * @beta + * @deprecated use `renderBlock`, `renderInlineBlock`, `renderAnnotation` interfaces instead */ export type FormBuilderCustomMarkersComponent = React.ComponentType<{markers: PortableTextMarker[]}> diff --git a/packages/sanity/src/core/form/types/blockProps.ts b/packages/sanity/src/core/form/types/blockProps.ts index d3342feb1de..f5e2e51918f 100644 --- a/packages/sanity/src/core/form/types/blockProps.ts +++ b/packages/sanity/src/core/form/types/blockProps.ts @@ -24,111 +24,413 @@ import { } from './renderCallback' /** - * @hidden - * @beta */ + * Props for rendering text decorations in Portable Text blocks. + * It could be decorations like bold, italic, subscript etc. + * + * @public + */ export interface BlockDecoratorProps { + /** + * The span node as rendered without the decorator. + */ children: React.ReactElement + /** + * If the span node currently is focused by the user. + */ focused: boolean + /** + * The default render function for this decorator, + * some decorators are proved by default and has a default rendering. + */ renderDefault: (props: BlockDecoratorProps) => React.ReactElement + /** + * The decorator schema type. Icon can be found here. + */ schemaType: BlockDecoratorDefinition + /** + * If the span node text currently is selected by the user. + */ selected: boolean + /** + * The title of the decorator (e.g. 'Underlined text') for UI-representation. + */ title: string + /** + * The value of the decorator (e.g. 'underlined') as it + * appears in the child.marks array of the text node. + */ value: string } /** - * @hidden - * @beta */ + * Props for rendering a text block style. + * + * @public + */ export interface BlockStyleProps { + /** + * The value of the block that is rendered style for. + */ block: PortableTextTextBlock + /** + * The block as rendered without this style. + */ children: React.ReactElement + /** + * If the block currently has focus in the text editor. + */ focused: boolean + /** + * The default rendering function for this style. + */ renderDefault: (props: BlockStyleProps) => React.ReactElement + /** + * The schema type for this style. + */ schemaType: BlockStyleDefinition + /** + * If the block currently have a text selection. + */ selected: boolean + /** + * The title of the style (e.g. 'Large Heading') for UI-representation. + */ title: string + /** + * The value of the style (e.g. 'h1') as it appears in the block's `.style` property value. + */ value: string } /** - * @hidden - * @beta */ + * Props for rendering a Portable Text block as a list item. + * + * @public + */ export interface BlockListItemProps { + /** + * The block that is rendered as a list item. + */ block: PortableTextTextBlock + /** + * The block rendered without the list style. + */ children: React.ReactElement + /** + * If the block currently is focused by the user. + */ focused: boolean + /** + * The nesting level of this list item. + */ level: number + /** + * The default function for rendering this as a list item. Some list types are built in and + * will have a default rendering. + */ renderDefault: (props: BlockListItemProps) => React.ReactElement + /** + * The schema type for this list type. Icon can be found here. + */ schemaType: BlockListDefinition + /** + * If the user currently has a text selection in this block. + */ selected: boolean + /** + * The title of the list item type (e.g. 'Bullet list') for UI-representation. + */ title: string + /** + * The value of the list item type (e.g. 'bullet') as it appears in the block.listItem attribute. + */ value: string } /** - * @hidden - * @beta */ + * 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: {props.textElement}, + * }) + * ``` + * @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 + * + * {props.textElement} + * + * // Render the editing form if the object is opened + * {props.open && ( + * + * + * {props.children} + * + * + * )} + * + * ) + * } + * ``` + * */ export interface BlockAnnotationProps { + /** + * Boundary element of the floating toolbar element. + */ __unstable_floatingBoundary: HTMLElement | null + /** + * Boundary element where the text for this annotation appears. + */ __unstable_referenceBoundary: HTMLElement | null - __unstable_referenceElement: HTMLElement | null // Reference element representing the annotation in the DOM - __unstable_textElementFocus?: boolean // Wether the related text element (in the editor) has selection focus. Differs from form state focus. + /** + * DOM element for the annotated text. + */ + __unstable_referenceElement: HTMLElement | null + /** + * Wether the annotated text node has editor focus. + * @remarks differs from `focused` which is wether the annotation object has form focus. + */ + __unstable_textElementFocus?: boolean + /** + * The input form for the annotation object. + * @remarks If you wrap this in something, you must make sure to put `contentEditable={false}` on the root container. + * Otherwise the editor will think content is part of the editable text and will error. + */ children: ReactNode - focused: boolean // Whether the annotation data object has form focus + /** + * If the editor form for this annotation object currently have form focus. + */ + focused: boolean + /** + * Markers (meta data) connected to this annotation. + * @deprecated - use `renderBlock` and `renderInlineBlock` interfaces instead + */ markers: PortableTextMarker[] + /** + * Closes the editing form connected to this annotation. + */ onClose: () => void + /** + * Opens the editing form connected to this annotation. + */ onOpen: () => void + /** + * Focus a form node in the object for this annotation. + * @param path - the relative path to the form node to put focus on. + */ onPathFocus: (path: Path) => void + /** + * Removes the annotation object from the text. + */ onRemove: () => void + /** + * If the annotation is currently opened for editing. + */ open: boolean + /** + * The parent schema type. For annotations this this the block type. + */ parentSchemaType: SchemaType + /** + * The full form path to this annotation from document root. + */ path: Path + /** + * Form presence for this annotation. + */ presence: FormNodePresence[] + /** + * Is the annotation object read only? + */ readOnly: boolean + /** + * Plugin chain render callback. + */ renderAnnotation?: RenderAnnotationCallback + /** + * Plugin chain render callback. + */ renderBlock?: RenderBlockCallback + /** + * Plugin chain render callback. + */ renderDefault: (props: BlockAnnotationProps) => ReactElement + /** + * Plugin chain render callback. + */ renderField: RenderFieldCallback + /** + * Plugin chain render callback. + */ renderInlineBlock?: RenderBlockCallback + /** + * Plugin chain render callback. + */ renderInput: RenderInputCallback + /** + * Plugin chain render callback. + */ renderItem: RenderArrayOfObjectsItemCallback + /** + * Plugin chain render callback. + */ renderPreview: RenderPreviewCallback + /** + * The schema type for the annotation object. + */ schemaType: ObjectSchemaType - selected: boolean // Whether the object is selected in the editor + /** + * If the annotated text currently is selected by the user. + */ + selected: boolean + /** + * React element of the text that is being annotated. + */ textElement: ReactElement + /** + * Form validation for the annotation object. + */ validation: FormNodeValidation[] + /** + * Value of the annotation object. + */ value: PortableTextObject } /** - * @hidden - * @beta */ + * Props for rendering a Portable Text block + * + * @public + */ export interface BlockProps { + /** + * Boundary element of the floating toolbar element. + */ __unstable_floatingBoundary: HTMLElement | null + /** + * Boundary element for the block. + */ __unstable_referenceBoundary: HTMLElement | null - __unstable_referenceElement: HTMLElement | null // Reference element representing the block in the DOM + /** + * DOM element for the block. + */ + __unstable_referenceElement: HTMLElement | null + /** + * The default rendering of the block (the text). + */ children: ReactNode - focused: boolean // Whether the object has form focus + /** + * If the block currently is focused by the user. + */ + focused: boolean + /** + * Markers (meta data) connected to this annotation. + * @deprecated - use `renderBlock` and `renderInlineBlock` interfaces instead + */ markers: PortableTextMarker[] + /** + * Closes the editing form connected to this block. + * For regular text blocks this is not relevant. + */ onClose: () => void + /** + * Opens the editing form connected to this block. + * For regular text blocks this is not relevant. + */ onOpen: () => void + /** + * Focus a form node in this block. + * @param path - the relative path to the form node to put focus on. + */ onPathFocus: (path: Path) => void + /** + * Removes the block. + */ onRemove: () => void + /** + * If the block is currently opened for editing. + */ open: boolean + /** + * The parent schema type (array type). + */ parentSchemaType: ArraySchemaType | ObjectSchemaType + /** + * The full form path to this block from document root. + */ path: Path + /** + * Form presence for this block. + */ presence: FormNodePresence[] + /** + * Is the block object read only? + */ readOnly: boolean + /** + * Plugin chain render callback. + */ renderAnnotation?: RenderAnnotationCallback + /** + * Plugin chain render callback. + */ renderBlock?: RenderBlockCallback + /** + * Plugin chain render callback (default rendering function of the block). + */ renderDefault: (props: BlockProps) => ReactElement + /** + * Plugin chain render callback. + */ renderField: RenderFieldCallback + /** + * Plugin chain render callback. + */ renderInlineBlock?: RenderBlockCallback + /** + * Plugin chain render callback. + */ renderInput: RenderInputCallback + /** + * Plugin chain render callback. + */ renderItem: RenderArrayOfObjectsItemCallback + /** + * Plugin chain render callback. + */ renderPreview: RenderPreviewCallback + /** + * The schema type for the block. + */ schemaType: ObjectSchemaType - selected: boolean // Whether the object is selected in the editor + /** + * If the block is in the user's selection. + */ + selected: boolean + /** + * Form validation for the block object. + */ validation: FormNodeValidation[] + /** + * Value of the block. + */ value: PortableTextBlock } diff --git a/packages/sanity/src/core/form/types/definitionExtensions.ts b/packages/sanity/src/core/form/types/definitionExtensions.ts index 8950f873186..2958f6efaab 100644 --- a/packages/sanity/src/core/form/types/definitionExtensions.ts +++ b/packages/sanity/src/core/form/types/definitionExtensions.ts @@ -326,26 +326,66 @@ declare module '@sanity/types' { export interface BlockDecoratorDefinition { /** + * Component for rendering a decorator. * - * @hidden - * @beta + * See also {@link BlockDecoratorProps | BlockDecoratorProps} + * + * @public + * @remarks - Try not to hard code CSS properties that could be derived from `@sanity/ui`. + * This will make sure your rendering looks good independent of the theme context it appears in. + * - Don't render arbitrary text nodes as this will confuse the editor with + * what is editable text and not. If you need arbitrary text, make sure to wrap them in in a + * container with `contentEditable={false}`. + * @example Example of rendering custom decorator that highlights text. + * ```ts + * const Highlight = (props: BlockDecoratorProps) => ( + * + * {props.children} + * + * ) + * ``` */ component?: ComponentType } - export interface BlockStyleDefinition { /** + * Component for rendering a text style. * - * @hidden - * @beta + * See also {@link BlockStyleProps | BlockStyleProps} + * + * @public + * @remarks - Try not to hard code CSS properties that could be derived from `@sanity/ui`. + * This will make sure your rendering looks good independent of the theme context it appears in. + * - Don't render arbitrary text nodes as this will confuse the editor with + * what is editable text and not. If you need arbitrary text, make sure to wrap them in in a + * container with `contentEditable={false}`. + * @example Example of rendering a custom style for article leads which is bigger, + * and bolder, but will adapt to what the current `@sanity/ui` theme has defined + * as actual values for weight "bold" and `size={3}`. + * ```ts + * import {Text} from '@sanity/ui' + * + * const LeadStyle = (props: BlockStyleProps) => ( + * + * {props.children} + * + * ) + * ``` */ component?: ComponentType } export interface BlockListDefinition { /** + * Component for rendering a block as a list item * - * @hidden - * @beta + * See also {@link BlockListItemProps | BlockListItemProps} + * + * @public + * @remarks - Try not to hard code CSS properties that could be derived from `@sanity/ui`. + * This will make sure your rendering looks good independent of the theme context it appears in. + * - Don't render arbitrary text nodes as this will confuse the editor with + * what is editable text and not. If you need arbitrary text, make sure to wrap them in in a + * container with `contentEditable={false}`. */ component?: ComponentType } diff --git a/packages/sanity/src/core/form/types/fieldProps.ts b/packages/sanity/src/core/form/types/fieldProps.ts index 37ecd62c7d0..5d2da58b8dc 100644 --- a/packages/sanity/src/core/form/types/fieldProps.ts +++ b/packages/sanity/src/core/form/types/fieldProps.ts @@ -28,7 +28,7 @@ import { /** * @hidden - * @beta */ + * @public */ export interface BaseFieldProps { /** @beta */ actions?: DocumentFieldAction[] @@ -55,7 +55,7 @@ export interface BaseFieldProps { /** * @hidden - * @beta */ + * @public */ export interface ObjectFieldProps> extends BaseFieldProps { schemaType: ObjectSchemaType value: {[field in string]: unknown} | undefined @@ -71,7 +71,7 @@ export interface ObjectFieldProps> extends BaseFieldProp /** * @hidden - * @beta */ + * @public */ export interface ArrayFieldProps extends BaseFieldProps { schemaType: ArraySchemaType value: unknown[] | undefined @@ -84,7 +84,7 @@ export interface ArrayFieldProps extends BaseFieldProps { /** * @hidden - * @beta */ + * @public */ export interface ArrayOfPrimitivesFieldProps extends BaseFieldProps { schemaType: ArraySchemaType value: unknown[] | undefined @@ -97,7 +97,7 @@ export interface ArrayOfPrimitivesFieldProps extends BaseFieldProps { /** * @hidden - * @beta */ + * @public */ export interface NumberFieldProps extends BaseFieldProps { schemaType: NumberSchemaType value: number | undefined @@ -106,7 +106,7 @@ export interface NumberFieldProps extends BaseFieldProps { /** * @hidden - * @beta */ + * @public */ export interface BooleanFieldProps extends BaseFieldProps { schemaType: BooleanSchemaType value: boolean | undefined @@ -115,7 +115,7 @@ export interface BooleanFieldProps extends BaseFieldProps { /** * @hidden - * @beta */ + * @public */ export interface StringFieldProps extends BaseFieldProps { schemaType: StringSchemaType value: string | undefined @@ -127,7 +127,7 @@ export type PrimitiveFieldProps = NumberFieldProps | BooleanFieldProps | StringF /** * @hidden - * @beta */ + * @public */ export type FieldProps = | ObjectFieldProps | ObjectFieldProps diff --git a/packages/sanity/src/core/form/types/inputProps.ts b/packages/sanity/src/core/form/types/inputProps.ts index 402e2c86f2a..668ef9bf892 100644 --- a/packages/sanity/src/core/form/types/inputProps.ts +++ b/packages/sanity/src/core/form/types/inputProps.ts @@ -43,14 +43,14 @@ import {ArrayInputFunctionsProps, PortableTextMarker, RenderCustomMarkers} from /** * @hidden - * @beta */ + * @public */ export interface BaseInputProps { renderDefault: (props: InputProps) => React.ReactElement } /** * @hidden - * @beta */ + * @public */ export interface ObjectInputProps< T = Record, S extends ObjectSchemaType = ObjectSchemaType, @@ -149,7 +149,7 @@ export interface ObjectInputProps< /** * @hidden - * @beta */ + * @public */ export interface ArrayOfObjectsInputProps< T extends {_key: string} = {_key: string}, S extends ArraySchemaType = ArraySchemaType, @@ -285,7 +285,7 @@ export type ArrayOfPrimitivesElementType = T extends (infer K)[ /** * @hidden - * @beta */ + * @public */ export interface ArrayOfPrimitivesInputProps< T extends string | boolean | number = string | boolean | number, S extends ArraySchemaType = ArraySchemaType, @@ -382,7 +382,7 @@ export interface ArrayOfPrimitivesInputProps< /** * @hidden - * @beta */ + * @public */ export interface PrimitiveInputElementProps { value?: string id: string @@ -408,7 +408,7 @@ export interface ComplexElementProps { /** * @hidden - * @beta */ + * @public */ export interface StringInputProps extends BaseInputProps, StringFormNode { @@ -425,7 +425,7 @@ export interface StringInputProps /** * @hidden - * @beta */ + * @public */ export interface NumberInputProps extends BaseInputProps, NumberFormNode { @@ -442,7 +442,7 @@ export interface NumberInputProps /** * @hidden - * @beta */ + * @public */ export interface BooleanInputProps extends BaseInputProps, BooleanFormNode { @@ -470,21 +470,49 @@ export interface BooleanInputProps> { + /** + * Assign hotkeys that can be attached to custom editing functions + */ hotkeys?: HotkeyOptions + /** + * Array of {@link PortableTextMarker} with meta data connected to the content. + * @deprecated will be removed in the next major version of Sanity Studio. + * Use the `renderBlock` interface instead. + */ markers?: PortableTextMarker[] + /** + * Custom copy function + */ onCopy?: OnCopyFn + /** + * Custom paste function + */ onPaste?: OnPasteFn + /** + * Function to render custom block actions + * @deprecated will be removed in the next major version of Sanity Studio. + * Use the `renderBlock` interface instead. + */ renderBlockActions?: RenderBlockActionsCallback + /** + * Function to render custom markers + * @deprecated will be removed in the next major version of Sanity Studio. + * Use the `renderBlock` interface instead. + */ renderCustomMarkers?: RenderCustomMarkers } /** * @hidden - * @beta */ + * @public */ export type InputProps = | ArrayOfObjectsInputProps | ArrayOfPrimitivesInputProps diff --git a/packages/sanity/src/core/form/types/renderCallback.ts b/packages/sanity/src/core/form/types/renderCallback.ts index 6c0e5bb5ed8..7f5f27bf539 100644 --- a/packages/sanity/src/core/form/types/renderCallback.ts +++ b/packages/sanity/src/core/form/types/renderCallback.ts @@ -8,7 +8,7 @@ import {BlockAnnotationProps, BlockProps} from './blockProps' /** * @hidden - * @beta */ + * @public */ export type RenderArrayOfObjectsItemCallback = ( itemProps: Omit, ) => ReactNode @@ -22,35 +22,35 @@ export type RenderArrayOfPrimitivesItemCallback = ( /** * @hidden - * @beta */ + * @public */ export type RenderItemCallback = ( itemProps: Omit | Omit, ) => ReactNode /** * @hidden - * @beta */ + * @public */ export type RenderFieldCallback = ( fieldProps: Omit, ) => ReactNode /** * @hidden - * @beta */ + * @public */ export type RenderInputCallback = ( inputProps: Omit, ) => ReactNode /** * @hidden - * @beta */ + * @public */ export type RenderBlockCallback = ( blockProps: Omit, ) => ReactNode /** * @hidden - * @beta */ + * @public */ export type RenderAnnotationCallback = ( annotationProps: Omit, ) => ReactNode @@ -58,7 +58,7 @@ export type RenderAnnotationCallback { actions?: ReactNode | ComponentType<{layout: TLayoutKey}> @@ -81,5 +81,5 @@ export interface RenderPreviewCallbackProps { /** * @hidden - * @beta */ + * @public */ export type RenderPreviewCallback = (props: RenderPreviewCallbackProps) => ReactNode diff --git a/packages/sanity/src/core/presence/types.ts b/packages/sanity/src/core/presence/types.ts index f05008b5358..3872d75ad1f 100644 --- a/packages/sanity/src/core/presence/types.ts +++ b/packages/sanity/src/core/presence/types.ts @@ -40,7 +40,7 @@ export interface Location { /** * @hidden - * @beta */ + * @public */ export interface FormNodePresence { user: User path: Path