UNPKG

@mdxeditor/editor

Version:

React component for rich text markdown editing

1,438 lines (1,274 loc) 107 kB
/// <reference types="react" /> import { Config } from 'mdast-util-from-markdown/lib'; import { ContentEditable } from '@lexical/react/LexicalContentEditable'; import { DecoratorNode } from 'lexical'; import { default as default_2 } from 'react'; import { Directives } from 'mdast-util-directive'; import { DOMConversionMap } from 'lexical'; import { DOMConversionOutput } from 'lexical'; import { DOMExportOutput } from 'lexical'; import { EditorConfig } from 'lexical'; import { EditorState } from 'lexical'; import { EditorThemeClasses } from 'lexical'; import { ElementNode } from 'lexical'; import { Extension } from 'micromark-util-types'; import { Extension as Extension_2 } from '@codemirror/state'; import { FC } from 'react'; import { HeadingTagType } from '@lexical/rich-text'; import { HistoryState } from '@lexical/history'; import { KlassConstructor } from 'lexical'; import * as lexical from 'lexical'; import { LexicalCommand } from 'lexical'; import { LexicalEditor } from 'lexical'; import { LexicalNode } from 'lexical'; import { LexicalNodeReplacement } from 'lexical'; import { LinkNode } from '@lexical/link'; import { LinkPlugin } from '@lexical/react/LexicalLinkPlugin'; import { ListType } from '@lexical/list'; import * as Mdast from 'mdast'; import { MdxJsxAttribute } from 'mdast-util-mdx-jsx'; import { MdxJsxExpressionAttribute } from 'mdast-util-mdx-jsx'; import { MdxJsxFlowElement } from 'mdast-util-mdx-jsx'; import { MdxJsxTextElement } from 'mdast-util-mdx-jsx'; import { Node as Node_2 } from 'unist'; import { NodeKey } from 'lexical'; import { NodeRef } from '@mdxeditor/gurx'; import { Options } from 'mdast-util-from-markdown'; import { Options as Options_2 } from 'mdast-util-to-markdown/lib/types'; import { Options as Options_3 } from 'mdast-util-gfm-table'; import { ParseOptions } from 'micromark-util-types'; import { PropsWithChildren } from 'react'; import * as RadixToolbar from '@radix-ui/react-toolbar'; import { RangeSelection } from 'lexical'; import { ReactNode } from 'react'; import { Realm } from '@mdxeditor/gurx'; import { RootNode } from 'lexical'; import { SandpackProvider } from '@codesandbox/sandpack-react'; import { SerializedElementNode } from 'lexical'; import { SerializedLexicalNode } from 'lexical'; import { Spread } from 'lexical'; import { TextFormatType } from 'lexical'; import { TextNode } from 'lexical'; import { Options as ToMarkdownOptions } from 'mdast-util-to-markdown'; /** * Converts a <pre> HTML element into a CodeBlockNode. * Extracts the code content, language, and meta information from the element's attributes. * The language is determined from the class attribute (e.g., class="language-javascript") or * the data-language attribute if available. * * @param element - The <pre> HTML element to convert. * @returns A DOMConversionOutput containing the created CodeBlockNode. * @group Code Block */ export declare function $convertPreElement(element: Element): DOMConversionOutput; /** * Converts an HTML table element into a {@link TableNode}. * This function is used to transform a DOM table element into a format that can be used by Lexical. * It extracts the rows and cells from the table, converting them into MDAST-compatible nodes. * * @param element - The HTML table element to convert. * @returns A {@link DOMConversionOutput} containing the converted {@link TableNode}. * @group Table */ export declare function $convertTableElement(element: HTMLElement): DOMConversionOutput; /** * Creates a {@link CodeBlockNode}. * @param options - The code contents, the language (i.e. js, jsx, etc.), and the additional meta data of the block. * @group Code Block */ export declare function $createCodeBlockNode(options: Partial<CreateCodeBlockNodeOptions>): CodeBlockNode; /** * Creates an {@link DirectiveNode}. Use this instead of the constructor to follow the Lexical conventions. * @group Directive */ export declare function $createDirectiveNode(mdastNode: Directives, key?: NodeKey): DirectiveNode; /** * Creates a {@link FrontmatterNode}. * @param yaml - The YAML string of the frontmatter. */ export declare function $createFrontmatterNode(yaml: string): FrontmatterNode; /** * Creates a new {@link GenericHTMLNode} with the specified MDAST HTML node as the object to edit. * @group HTML */ export declare function $createGenericHTMLNode(tag: KnownHTMLTagType, type: MdxNodeType, attributes: MdxJsxAttribute[]): GenericHTMLNode; /** * Creates an {@link ImageNode}. * @param params - The image attributes. * @group Image */ export declare function $createImageNode(params: CreateImageNodeParameters): ImageNode; /** * Creates a {@link TableNode}. Use this instead of the constructor to follow the Lexical conventions. * @param mdastNode - The mdast node to create the {@link TableNode} from. * @group Table */ export declare function $createTableNode(mdastNode: Mdast.Table): TableNode; /** * Returns true if the given node is a {@link CodeBlockNode}. * @group Code Block */ export declare function $isCodeBlockNode(node: LexicalNode | null | undefined): node is CodeBlockNode; /** * Returns true if the node is an {@link DirectiveNode}. * @group Directive */ export declare function $isDirectiveNode(node: LexicalNode | null | undefined): node is DirectiveNode; /** * Returns `true` if the given node is a {@link FrontmatterNode}. */ export declare function $isFrontmatterNode(node: LexicalNode | null | undefined): node is FrontmatterNode; /** * Determines if the specified node is a {@link GenericHTMLNode}. * @group HTML */ export declare function $isGenericHTMLNode(node: LexicalNode | null | undefined): node is GenericHTMLNode; /** * Returns true if the node is an {@link ImageNode}. * @group Image */ export declare function $isImageNode(node: LexicalNode | null | undefined): node is ImageNode; /** * Returns true if the given node is a {@link TableNode}. * @group Table */ export declare function $isTableNode(node: LexicalNode | null | undefined): node is TableNode; /** * Holds a reference to the current Lexical editor instance - can be the root editor or a nested editor. * @group Core */ export declare const activeEditor$: NodeRef<LexicalEditor | null>; /* Excluded from this release type: activeEditorSubscriptions$ */ /** * The names of the plugins that are currently active. * @group Core */ export declare const activePlugins$: NodeRef<string[]>; /** * Add a plugin name to the list of active plugins. * @group Core */ export declare const addActivePlugin$: NodeRef<string | string[]>; /** * Lets you add React components below the editor. * @group Core */ export declare const addBottomAreaChild$: NodeRef<default_2.ComponentType<{}> | default_2.ComponentType<{}>[]>; /** * Lets you add React components to the {@link https://lexical.dev/docs/react/plugins | Lexical Composer} element. * @group Core */ export declare const addComposerChild$: NodeRef<default_2.ComponentType<{}> | default_2.ComponentType<{}>[]>; /** * Lets you add React components as wrappers around the editor. * @group Core */ export declare const addEditorWrapper$: NodeRef<default_2.ComponentType<{ children: default_2.ReactNode; }> | default_2.ComponentType<{ children: default_2.ReactNode; }>[]>; /** * Adds an export visitor to be used when exporting markdown from the Lexical tree. * @group Markdown Processing */ export declare const addExportVisitor$: NodeRef< LexicalVisitor | LexicalVisitor[]>; /** * Registers a visitor to be used when importing markdown. * @group Markdown Processing */ export declare const addImportVisitor$: NodeRef<MdastImportVisitor<Mdast.Nodes> | MdastImportVisitor<Mdast.Nodes>[]>; export declare type AdditionalLexicalNode = KlassConstructor<typeof LexicalNode> | LexicalNodeReplacement; /** * Registers a lexical node to be used in the editor. * @group Core */ export declare const addLexicalNode$: NodeRef<KlassConstructor<typeof LexicalNode> | KlassConstructor<typeof LexicalNode>[]>; /** * Adds a mdast extension to the markdown parser. * @group Markdown Processing */ export declare const addMdastExtension$: NodeRef<Partial< Config> | Partial< Config>[] | (Partial< Config> | Partial< Config>[])[]>; /** * Lets you add React components as children of any registered nested editor (useful for Lexical plugins). * @group Core */ export declare const addNestedEditorChild$: NodeRef<default_2.ComponentType<{}> | default_2.ComponentType<{}>[]>; /** * Adds a syntax extension to the markdown parser. * @group Markdown Processing */ export declare const addSyntaxExtension$: NodeRef< Extension | Extension[]>; /** * Adds a markdown to string extension to be used when exporting markdown from the Lexical tree. * @group Markdown Processing */ export declare const addToMarkdownExtension$: NodeRef< Options_2 | Options_2[]>; /** * Lets you add React components on top of the editor (like the toolbar). * @group Core */ export declare const addTopAreaChild$: NodeRef<default_2.ComponentType<{}> | default_2.ComponentType<{}>[]>; export declare const ADMONITION_TYPES: readonly ["note", "tip", "danger", "info", "caution"]; /** * Pass this descriptor to the `directivesPlugin` `directiveDescriptors` parameter to enable {@link https://docusaurus.io/docs/markdown-features/admonitions | markdown admonitions}. * * @example * ```tsx * <MDXEditor * plugins={[ * directivesPlugin({ directiveDescriptors: [ AdmonitionDirectiveDescriptor] }), * ]} /> * ``` * @group Directive */ export declare const AdmonitionDirectiveDescriptor: DirectiveDescriptor; /* Excluded from this release type: AdmonitionKind */ export declare function admonitionLabelsMap(t: Translation): Record<(typeof ADMONITION_TYPES)[number], string>; /** * @group Headings */ export declare const ALL_HEADING_LEVELS: readonly [1, 2, 3, 4, 5, 6]; /** * Holds the allowed heading levels. * @group Headings */ export declare const allowedHeadingLevels$: NodeRef<readonly HEADING_LEVEL[]>; /** * Allow to set width and height of image through dialog window * @group Image */ export declare const allowSetImageDimensions$: NodeRef<boolean>; /** * returns a function which when called always returns the passed value * @group Utils */ export declare function always<T>(value: T): () => T; /** * A signal that appends a code block editor descriptor to the list of descriptors. * @group Code Block */ export declare const appendCodeBlockEditorDescriptor$: NodeRef<CodeBlockEditorDescriptor | CodeBlockEditorDescriptor[]>; /* Excluded from this release type: Appender */ /** * Allows you to change the block type of the current selection. * @group Core */ export declare const applyBlockType$: NodeRef<BlockType>; /** * Applies the published format to the current selection. * @group Core */ export declare const applyFormat$: NodeRef<TextFormatType>; /** * A signal that confirms the updated values of the current link. * @group Link Dialog */ export declare const applyLinkChanges$: NodeRef<void>; /** * Converts the current selection to the specified list type. * @group Lists */ export declare const applyListType$: NodeRef<"" | ListType>; /* Excluded from this release type: autoFocus$ */ declare interface BaseImageParameters { altText?: string; title?: string; width?: number; height?: number; } /** * The type of the block that the current selection is in. * @group Core */ export declare type BlockType = 'paragraph' | 'quote' | HeadingTagType | ''; /** * A toolbar component that allows the user to change the block type of the current selection. * Supports paragraphs, headings and block quotes. * @group Toolbar Components */ export declare const BlockTypeSelect: () => default_2.JSX.Element | null; /** * A toolbar component that lets the user toggle bold, italic and underline formatting. * @group Toolbar Components */ export declare const BoldItalicUnderlineToggles: default_2.FC<BoldItalicUnderlineTogglesProps>; export declare interface BoldItalicUnderlineTogglesProps { options?: ('Bold' | 'Italic' | 'Underline')[]; } /* Excluded from this release type: bottomAreaChildren$ */ /** * A toolbar button primitive. * @group Toolbar Primitives */ export declare const Button: default_2.ForwardRefExoticComponent<Omit<RadixToolbar.ToolbarButtonProps & default_2.RefAttributes<HTMLButtonElement>, "ref"> & default_2.RefAttributes<object>>; /** * Use this primitive to create a toolbar button that can be either a button or a dropdown, depending on the number of items passed. * @group Toolbar Primitives */ export declare const ButtonOrDropdownButton: <T extends string>(props: { /** * The contents of the button - usually an icon. */ children: default_2.ReactNode; /** * The title used for the tooltip. */ title: string; /** * The function to execute when the button is clicked or an item is chosen from the dropdown. * If there is only one item in the dropdown, the value will be an empty string. */ onChoose: (value: T) => void; /** * The items to show in the dropdown. */ items: { /** * The value to pass to the `onChoose` function when this item is chosen. */ value: T; /** * The label to show in the dropdown. */ label: string | JSX.Element; }[]; }) => default_2.JSX.Element; /** * A toolbar button with tooltip primitive. * @group Toolbar Primitives */ export declare const ButtonWithTooltip: ({ title, children, ...props }: Omit<RadixToolbar.ToolbarButtonProps & default_2.RefAttributes<HTMLButtonElement>, "ref"> & default_2.RefAttributes<object> & { title: string; }) => default_2.JSX.Element; /** * Calls the passed function. * @group Utils */ export declare function call(proc: () => unknown): void; /* Excluded from this release type: CAN_USE_DOM */ /** * An action that cancel the edit of the current link. * @group Link Dialog */ export declare const cancelLinkEdit$: NodeRef<void>; /** * A component that allows the user to change the admonition type of the current selection. * For this component to work, you must pass the {@link AdmonitionDirectiveDescriptor} to the `directivesPlugin` `directiveDescriptors` parameter. * @group Toolbar Components */ export declare const ChangeAdmonitionType: () => default_2.JSX.Element; /** * A component that allows the user to change the code block language of the current selection. * For this component to work, you must enable the `codeMirrorPlugin` for the editor. * See {@link ConditionalContents} for an example on how to display the dropdown only when a code block is in focus. * @group Toolbar Components */ export declare const ChangeCodeMirrorLanguage: () => default_2.JSX.Element; export declare type ClickLinkCallback = (url: string) => void; /** * Close the image dialog. * @group Image */ export declare const closeImageDialog$: NodeRef<void>; /* Excluded from this release type: cmExtensions$ */ /** * A set of functions that modify the underlying code block node. * Access this with the {@link useCodeBlockEditorContext} hook in your custom code editor components. * @group Code Block */ export declare interface CodeBlockEditorContextValue { /** * Updates the code contents of the code block. */ setCode: (code: string) => void; /** * Updates the language of the code block. See {@link https://www.markdownguide.org/extended-syntax/#syntax-highlighting} for language examples. * */ setLanguage: (language: string) => void; /** * Updates the meta of the code block. The meta is the additional string that comes after the code block language. */ setMeta: (meta: string) => void; /** * The Lexical node that's being edited. */ lexicalNode: CodeBlockNode; /** * The parent Lexical editor. */ parentEditor: LexicalEditor; } /** * Implement this interface to create a custom code block editor. * Pass the object in the {@link codeBlockPlugin} parameters. * @group Code Block */ export declare interface CodeBlockEditorDescriptor { /** * The priority of the descriptor when descriptors are matched against a given code block. Lower number means lower priority. * This allows you to implement a catch-all generic editor and a more specific editor for a given language / meta. */ priority: number; /** * A function that returns true if the descriptor's editor should be used for the given code block. * @param language - The language of the code block. * @param meta - The meta of the code block. */ match: (language: string | null | undefined, meta: string | null | undefined) => boolean; /** * The React component to be used. See {@link CodeBlockEditorProps} for the props passed to the component. */ Editor: React.ComponentType<CodeBlockEditorProps>; } /** * Contains the currently registered code block descriptors. * @group Code Block */ export declare const codeBlockEditorDescriptors$: NodeRef<CodeBlockEditorDescriptor[]>; /** * The properties passed to the {@link CodeBlockEditorDescriptor.Editor} component. * @group Code Block */ export declare interface CodeBlockEditorProps { /** * The code to edit. */ code: string; /** * The language of the fenced code block. */ language: string; /** * The meta of the fenced code block. */ meta: string; /** * The key of the Lexical node - use this if you are dealing with the Lexical APIs. */ nodeKey: string; /** * An emitter that will execute its subscription when the editor should be focused. * Note: you don't need to unsubscribe, the emiter has a single subscription model. */ focusEmitter: VoidEmitter; } /** * The codemirror code block languages. * @group CodeMirror */ export declare const codeBlockLanguages$: NodeRef<{ js: string; ts: string; tsx: string; jsx: string; css: string; }>; /** * A lexical node that represents a fenced code block. Use {@link "$createCodeBlockNode"} to construct one. * @group Code Block */ export declare class CodeBlockNode extends DecoratorNode<JSX.Element> { __code: string; __meta: string; __language: string; __focusEmitter: { publish: () => void; subscribe: (cb: () => void) => void; }; static getType(): string; static clone(node: CodeBlockNode): CodeBlockNode; static importJSON(serializedNode: SerializedCodeBlockNode): CodeBlockNode; static importDOM(): DOMConversionMap; constructor(code: string, language: string, meta: string, key?: NodeKey); exportJSON(): SerializedCodeBlockNode; createDOM(_config: EditorConfig): HTMLDivElement; updateDOM(): false; getCode(): string; getMeta(): string; getLanguage(): string; setCode: (code: string) => void; setMeta: (meta: string) => void; setLanguage: (language: string) => void; select: () => void; decorate(editor: LexicalEditor): JSX.Element; isInline(): boolean; } /** * A plugin that adds support for code blocks and custom code block editors. * @group Code Block */ export declare const codeBlockPlugin: (params?: { /** * Pass an array of {@link CodeBlockEditorDescriptor} to register custom code block editors. */ codeBlockEditorDescriptors?: CodeBlockEditorDescriptor[] | undefined; /** * The default language to use when creating a new code block if no language is passed. */ defaultCodeBlockLanguage?: string | undefined; } | undefined) => RealmPlugin; /** * Whether or not to try to dynamically load the code block language support. * Disable if you want to manually pass the supported languages. * @group CodeMirror */ export declare const codeMirrorAutoLoadLanguageSupport$: NodeRef<boolean>; export declare const CodeMirrorEditor: ({ language, nodeKey, code, focusEmitter }: CodeBlockEditorProps) => default_2.JSX.Element; /** * The code mirror extensions for the coemirror code block editor. * @group CodeMirror */ export declare const codeMirrorExtensions$: NodeRef<Extension_2[]>; /** * A plugin that adds lets users edit code blocks with CodeMirror. * @group CodeMirror */ export declare const codeMirrorPlugin: (params?: { codeBlockLanguages: Record<string, string>; /** * Optional, additional CodeMirror extensions to load in the diff/source mode. */ codeMirrorExtensions?: Extension_2[] | undefined; /** * Whether or not to try to dynamically load the code block language support. * Disable if you want to manually pass the supported languages. * @group CodeMirror */ autoLoadLanguageSupport?: boolean | undefined; } | undefined) => RealmPlugin; /** * A toolbar component that lets the user toggle code formatting. * Use for inline `code` elements (like variables, methods, etc). * @group Toolbar Components */ export declare const CodeToggle: default_2.FC; export declare const COMMON_STATE_CONFIG_EXTENSIONS: Extension_2[]; /** * Performs left to right composition of two functions. * @group Utils */ export declare function compose<I, A, R>(a: (arg: A) => R, b: (arg: I) => A): (arg: I) => R; /* Excluded from this release type: composerChildren$ */ /** * A toolbar primitive that allows you to show different contents based on the editor that is in focus. * Useful for code editors that have different features and don't support rich text formatting. * @example * ```tsx * <ConditionalContents * options={[ * { when: (editor) => editor?.editorType === 'codeblock', contents: () => <ChangeCodeMirrorLanguage /> }, * { when: (editor) => editor?.editorType === 'sandpack', contents: () => <ShowSandpackInfo /> }, * { * fallback: () => ( * <> * <UndoRedo /> * <BoldItalicUnderlineToggles /> * <InsertCodeBlock /> * </> * ) * } * ]} * /> * ``` * @group Toolbar Primitives */ export declare const ConditionalContents: default_2.FC<{ /** * A set of options that define the contents to show based on the editor that is in focus. * Can be either a {@link ConditionalContentsOption} or a {@link FallbackOption}. * See the {@link ConditionalContents} documentation for an example. */ options: (ConditionalContentsOption | FallbackOption)[]; }>; /** * An object that describes a possible option to be displayed in the {@link ConditionalContents} component. * @group Toolbar Primitives */ export declare interface ConditionalContentsOption { /** * A function that returns `true` if the option should be displayed for the current editor in focus. */ when: (rootNode: EditorInFocus | null) => boolean; /** * The contents to display if the `when` function returns `true`. */ contents: () => default_2.ReactNode; } /** * Holds the CSS class name of the content editable element. * @group Core */ export declare const contentEditableClassName$: NodeRef<string>; /** * A reference to the content editable element. * @group Core */ export declare const contentEditableRef$: NodeRef<default_2.RefObject<HTMLDivElement> | null>; export declare const contentEditableWrapperElement$: NodeRef<HTMLDivElement | null>; /** * Returns true if the user is pressing the control key on Windows or the meta key on Mac. * @group Utils */ export declare function controlOrMeta(metaKey: boolean, ctrlKey: boolean): boolean; /** * Converts the current selection to a node created by the published factory. * @group Core */ export declare const convertSelectionToNode$: NodeRef<() => ElementNode>; declare type CoordinatesSubscription = (coords: [colIndex: number, rowIndex: number]) => void; /* Excluded from this release type: corePlugin */ /** * An input signal that lets you register a new {@link EditorSubscription} for the active editor. * The subscriptions are automatically cleaned up and re-bound when the active editor changes. * @example * ```tsx * realm.pub(createActiveEditorSubscription$, (theEditor) => { * return theEditor.registerUpdateListener(() => { ... }) * // or a command * // return theEditor.registerCommand('my-command', () => { ... }) * }) * ``` * @group Core */ export declare const createActiveEditorSubscription$: NodeRef<EditorSubscription | EditorSubscription[]>; /** * The options necessary to construct a new code block node. * @group Code Block */ export declare interface CreateCodeBlockNodeOptions { /** * The code contents of the block. */ code: string; /** * The language of the code block (i.e. `js`, `jsx`, etc.). This is used for syntax highlighting. */ language: string; /** * The additional meta data of the block. */ meta: string; } /** * The parameters used to create an {@link ImageNode} through {@link $createImageNode}. * @group Image */ export declare interface CreateImageNodeParameters { altText: string; width?: number; height?: number; title?: string; key?: NodeKey; rest?: (MdxJsxAttribute | MdxJsxExpressionAttribute)[]; src: string; } /** * A toolbar component that opens the link edit dialog. * For this component to work, you must include the `linkDialogPlugin`. * @group Toolbar Components */ export declare const CreateLink: () => default_2.JSX.Element; /** * An input signal that lets you register a new {@link EditorSubscription} for the root editor. * @example * ```tsx * realm.pub(createRootEditorSubscription$, (theEditor) => { * return theEditor.registerUpdateListener(() => { ... }) * // or a command * // return theEditor.registerCommand('my-command', () => { ... }) * }) * ``` * @group Core */ export declare const createRootEditorSubscription$: NodeRef<EditorSubscription | EditorSubscription[]>; /** * Holds the current block type of the selection (i.e. Heading, Paragraph, etc). * @group Core */ export declare const currentBlockType$: NodeRef<BlockType>; /** * Holds the current format of the selection. * @group Core */ export declare const currentFormat$: NodeRef<FORMAT>; /** * The current list type in the editor. * @group Lists */ export declare const currentListType$: NodeRef<"" | ListType>; /** * Holds the current selection. * @group Core */ export declare const currentSelection$: NodeRef<RangeSelection | null>; /** * Takes a 1 argument function and returns a function which when called, executes it with the provided argument. * @group Utils */ export declare function curry1to0<T, R>(proc: (arg: T) => R, arg: T): () => R; /** * Takes a 2 argument function and partially applies the first argument. * @group Utils */ export declare function curry2to1<T, K, R>(proc: (arg1: T, arg2: K) => R, arg1: T): (arg2: K) => R; export declare const debouncedIndexer$: NodeRef<TextNodeIndex>; export declare const DEFAULT_FORMAT: 0; /** * Contains the default language to use when creating a new code block if no language is passed. * @group Code Block */ export declare const defaultCodeBlockLanguage$: NodeRef<string>; export declare const defaultSvgIcons: { undo: default_2.JSX.Element; redo: default_2.JSX.Element; format_bold: default_2.JSX.Element; format_italic: default_2.JSX.Element; format_underlined: default_2.JSX.Element; format_highlight: default_2.JSX.Element; code: default_2.JSX.Element; strikeThrough: default_2.JSX.Element; superscript: default_2.JSX.Element; subscript: default_2.JSX.Element; format_list_bulleted: default_2.JSX.Element; format_list_numbered: default_2.JSX.Element; format_list_checked: default_2.JSX.Element; link: default_2.JSX.Element; add_photo: default_2.JSX.Element; table: default_2.JSX.Element; horizontal_rule: default_2.JSX.Element; frontmatter: default_2.JSX.Element; frame_source: default_2.JSX.Element; arrow_drop_down: default_2.JSX.Element; admonition: default_2.JSX.Element; sandpack: default_2.JSX.Element; rich_text: default_2.JSX.Element; difference: default_2.JSX.Element; markdown: default_2.JSX.Element; open_in_new: default_2.JSX.Element; link_off: default_2.JSX.Element; edit: default_2.JSX.Element; content_copy: default_2.JSX.Element; more_horiz: default_2.JSX.Element; more_vert: default_2.JSX.Element; close: default_2.JSX.Element; settings: default_2.JSX.Element; delete_big: default_2.JSX.Element; delete_small: default_2.JSX.Element; format_align_center: default_2.JSX.Element; format_align_left: default_2.JSX.Element; format_align_right: default_2.JSX.Element; add_row: default_2.JSX.Element; add_column: default_2.JSX.Element; insert_col_left: default_2.JSX.Element; insert_row_above: default_2.JSX.Element; insert_row_below: default_2.JSX.Element; insert_col_right: default_2.JSX.Element; check: default_2.JSX.Element; }; /** * The registered descriptors for composite nodes (jsx, directives, code blocks). */ export declare interface Descriptors { jsxComponentDescriptors: JsxComponentDescriptor[]; directiveDescriptors: DirectiveDescriptor[]; codeBlockEditorDescriptors: CodeBlockEditorDescriptor[]; } /** * Use this primitive to create a toolbar button that opens a dialog with a text input, autocomplete suggestions, and a submit button. * @group Toolbar Primitives */ export declare const DialogButton: default_2.ForwardRefExoticComponent<{ /** * The autocomplete suggestions to show in the dialog input. */ autocompleteSuggestions?: string[] | undefined; /** * The callback to call when the dialog is submitted. The callback receives the value of the text input as a parameter. */ onSubmit: (value: string) => void; /** * The title to show in the tooltip of the toolbar button. */ tooltipTitle: string; /** * The contents of the button. Usually an icon. * @example * ```tsx * <DialogButton buttonContent={<CustomIcon />} /> * ``` */ buttonContent?: default_2.ReactNode; /** * The placeholder text to show in the dialog input. */ dialogInputPlaceholder: string; /** * The title of the submit button. */ submitButtonTitle: string; } & default_2.RefAttributes<HTMLButtonElement>>; /* Excluded from this release type: diffMarkdown$ */ /** * @group Diff/Source */ export declare const diffSourcePlugin: (params?: { /** * The initial view mode of the editor. * @default 'rich-text' */ viewMode?: ViewMode | undefined; /** * The markdown to show in the diff editor. * @default '' */ diffMarkdown?: string | undefined; /** * Optional, additional CodeMirror extensions to load in the diff/source mode. */ codeMirrorExtensions?: Extension_2[] | undefined; /** * Set the diff editor to read-only. * @default false */ readOnlyDiff?: boolean | undefined; } | undefined) => RealmPlugin; /** * A wrapper element for the toolbar contents that lets the user toggle between rich text, diff and source mode. * Put the rich text toolbar contents as children of this component. * For this component to work, you must include the `diffSourcePlugin`. * * @example * ```tsx * <MDXEditor markdown='Hello world' * plugins={[toolbarPlugin({ * toolbarContents: () => ( <> <DiffSourceToggleWrapper><UndoRedo /><BoldItalicUnderlineToggles /></DiffSourceToggleWrapper></>) * }), diffSourcePlugin()]} * /> * ``` * * @group Toolbar Components */ export declare const DiffSourceToggleWrapper: default_2.FC<{ children: default_2.ReactNode; options?: ViewMode[]; SourceToolbar?: default_2.ReactNode; }>; /** * Implement this interface to create a custom editor for markdown directives. * Pass the object in the `directivesPlugin` parameters. * @group Directive */ export declare interface DirectiveDescriptor<T extends Directives = Directives> { /** * Whether the descriptor's Editor should be used for the given node. * @param node - The directive mdast node. You can code your logic against the node's name, type, attributes, children, etc. */ testNode(node: Directives): boolean; /** * The name of the descriptor - use this if you're building UI for the user to select a directive. */ name: string; /** * The attributes that the directive has. This can be used when building the UI for the user to configure a directive. The {@link GenericDirectiveEditor} uses those to display a property form. */ attributes: string[]; /** * Whether or not the directive has inner markdown content as children. Used by the {@link GenericDirectiveEditor} to determine whether to show the inner markdown editor. */ hasChildren: boolean; /** * The type of the supported directive. Can be one of: 'leafDirective' | 'containerDirective' | 'textDirective'. */ type?: 'leafDirective' | 'containerDirective' | 'textDirective'; /** * The React component to be used as an Editor. See {@link DirectiveEditorProps} for the props passed to the component. */ Editor: React.ComponentType<DirectiveEditorProps<T>>; } /** * Contains the currently registered Markdown directive descriptors. * @group Directive */ export declare const directiveDescriptors$: NodeRef<DirectiveDescriptor< Directives>[]>; /** * The properties passed to the {@link DirectiveDescriptor.Editor} component. * @group Directive */ export declare interface DirectiveEditorProps<T extends Directives = Directives> { /** * The mdast directive node. */ mdastNode: T; /** * The parent lexical editor - use this if you are dealing with the Lexical APIs. */ parentEditor: LexicalEditor; /** * The Lexical directive node. */ lexicalNode: DirectiveNode; /** * The descriptor that activated the editor */ descriptor: DirectiveDescriptor; } /** * A lexical node that represents an image. Use {@link "$createDirectiveNode"} to construct one. * @group Directive */ export declare class DirectiveNode extends DecoratorNode<default_2.JSX.Element> { /* Excluded from this release type: __mdastNode */ /* Excluded from this release type: __focusEmitter */ /* Excluded from this release type: getType */ /* Excluded from this release type: clone */ /* Excluded from this release type: importJSON */ /** * Constructs a new {@link DirectiveNode} with the specified MDAST directive node as the object to edit. */ constructor(mdastNode: Directives, key?: NodeKey); /** * Returns the MDAST node that is being edited. */ getMdastNode(): Directives; /* Excluded from this release type: exportJSON */ /* Excluded from this release type: createDOM */ /* Excluded from this release type: updateDOM */ /** * Sets a new MDAST node to edit. */ setMdastNode(mdastNode: Directives): void; /** * Focuses the direcitive editor. */ select: () => void; /* Excluded from this release type: decorate */ /* Excluded from this release type: isInline */ /* Excluded from this release type: isKeyboardSelectable */ } /** * A plugin that adds support for markdown directives. * @group Directive */ export declare const directivesPlugin: (params?: { /** * Use this to register your custom directive editors. You can also use the built-in {@link GenericDirectiveEditor}. */ directiveDescriptors: DirectiveDescriptor<any>[]; /** * Set this option to display unknown text-directives as normal text nodes. * This is handy when colons are used to separate words, e.g. in german "Schüler:in" */ escapeUnknownTextDirectives?: boolean | undefined; } | undefined) => RealmPlugin; /** * Holds whether the auto-linking of URLs and email addresses is disabled. * @group Links */ export declare const disableAutoLink$: NodeRef<boolean>; /** * Holds the disable image resize configuration flag. * @group Image */ export declare const disableImageResize$: NodeRef<boolean>; export declare const disableImageSettingsButton$: NodeRef<boolean>; /** * Holds the custom EditImageToolbar component. * @group Image */ export declare const editImageToolbarComponent$: NodeRef<FC<EditImageToolbarProps>>; declare interface EditImageToolbarProps { nodeKey: string; imageSource: string; initialImagePath: string | null; title: string; alt: string; width?: number | 'inherit'; height?: number | 'inherit'; } /** * The state of the image dialog when it is in editing an existing node. * @group Image */ export declare interface EditingImageDialogState { type: 'editing'; nodeKey: string; initialValues: Omit<SaveImageParameters, 'file'>; } /** * The state of the link dialog when it is in edit mode. * @group Link Dialog */ export declare interface EditLinkDialog { type: 'edit'; initialUrl: string; url: string; title: string; text: string; withAnchorText: boolean; linkNodeKey: string; rectangle: RectData; } /** * The currently focused editor * @group Core */ export declare const editorInFocus$: NodeRef<EditorInFocus | null>; /** * The type of the editor being edited currently. Custom editors can override this, so that the toolbar can change its contents. * @group Core */ export declare interface EditorInFocus { editorType: string; rootNode: LexicalNode | null; editorRef: unknown; } /** * A reference to a DOM element. used for the various popups, dialogs, and tooltips * @group Core */ export declare const editorRootElementRef$: NodeRef<default_2.RefObject<HTMLDivElement> | null>; export declare const editorSearchCursor$: NodeRef<number>; export declare const editorSearchRanges$: NodeRef<Range[]>; export declare const editorSearchScrollableContent$: NodeRef<HTMLElement | null>; export declare const editorSearchTerm$: NodeRef<string>; export declare const editorSearchTermDebounced$: NodeRef<string>; export declare const editorSearchTextNodeIndex$: NodeRef<TextNodeIndex>; /** * A function that subscribes to Lexical editor updates or events, and retursns an unsubscribe function. * @group Core */ export declare type EditorSubscription = (activeEditor: LexicalEditor) => () => void; /** * @group Core */ export declare const editorWrapperElementRef$: NodeRef<default_2.RefObject<HTMLDivElement> | null>; /* Excluded from this release type: editorWrappers$ */ export declare const EmptyTextNodeIndex: TextNodeIndex; /* Excluded from this release type: ExportLexicalTreeOptions */ export declare function exportLexicalTreeToMdast({ root, visitors, jsxComponentDescriptors, jsxIsAvailable, addImportStatements }: ExportLexicalTreeOptions): Mdast.Root; /* Excluded from this release type: exportMarkdownFromLexical */ /* Excluded from this release type: ExportMarkdownFromLexicalOptions */ /** * Contains the currently registered export visitors. * @group Core */ export declare const exportVisitors$: NodeRef< LexicalVisitor[]>; /** * @group JSX */ export declare interface ExpressionValue { type: 'expression'; value: string; } /** * A default option to be displayed in the {@link ConditionalContents} component if none of the other options match. * @group Toolbar Primitives */ export declare interface FallbackOption { /** * The contents to display */ fallback: () => default_2.ReactNode; } /** * @group Image */ export declare interface FileImageParameters extends BaseImageParameters { file: File; } export declare type FORMAT = typeof DEFAULT_FORMAT | typeof IS_BOLD | typeof IS_ITALIC | typeof IS_STRIKETHROUGH | typeof IS_UNDERLINE | typeof IS_CODE | typeof IS_SUBSCRIPT | typeof IS_SUPERSCRIPT | typeof IS_HIGHLIGHT; /** * Fetches a value from the Lexical editor read cycle. * @group Utils */ export declare function fromWithinEditorRead<T>(editor: LexicalEditor, fn: () => T): T; /** * Whether the frontmatter dialog is open. * @group Frontmatter */ export declare const frontmatterDialogOpen$: NodeRef<boolean>; /** * Represents {@link https://daily-dev-tips.com/posts/what-exactly-is-frontmatter/ | the frontmatter} of the markdown document. * Use {@link "$createFrontmatterNode"} to construct one. */ export declare class FrontmatterNode extends DecoratorNode<JSX.Element> { __yaml: string; static getType(): string; static clone(node: FrontmatterNode): FrontmatterNode; static importJSON(serializedNode: SerializedFrontmatterNode): FrontmatterNode; constructor(code: string, key?: NodeKey); exportJSON(): SerializedFrontmatterNode; createDOM(_config: EditorConfig): HTMLDivElement; updateDOM(): false; getYaml(): string; setYaml(yaml: string): void; decorate(editor: LexicalEditor): JSX.Element; isKeyboardSelectable(): boolean; } /** * A plugin that adds support for frontmatter. * @group Frontmatter */ export declare const frontmatterPlugin: (params?: unknown) => RealmPlugin; /** * A generic editor that can be used as an universal UI for any directive. * Allows editing of the directive content and properties. * Use this editor for the {@link DirectiveDescriptor} Editor option. * @group Directive */ export declare const GenericDirectiveEditor: default_2.FC<DirectiveEditorProps>; /** * A Lexical node that represents a generic HTML element. Use {@link $createGenericHTMLNode} to construct one. * The generic HTML node is used as a "fallback" for HTML elements that are not explicitly supported by the editor. * @group HTML */ export declare class GenericHTMLNode extends ElementNode { /* Excluded from this release type: __tag */ /* Excluded from this release type: __nodeType */ /* Excluded from this release type: __attributes */ /* Excluded from this release type: getType */ /* Excluded from this release type: clone */ /** * Constructs a new {@link GenericHTMLNode} with the specified MDAST HTML node as the object to edit. */ constructor(tag: KnownHTMLTagType, type: MdxNodeType, attributes: MdxJsxAttribute[], key?: NodeKey); getTag(): KnownHTMLTagType; getNodeType(): MdxNodeType; getAttributes(): MdxJsxAttribute[]; updateAttributes(attributes: MdxJsxAttribute[]): void; getStyle(): string; createDOM(): HTMLElement; updateDOM(): boolean; static importDOM(): DOMConversionMap | null; exportDOM(editor: LexicalEditor): DOMExportOutput; static importJSON(serializedNode: SerializedGenericHTMLNode): GenericHTMLNode; exportJSON(): SerializedGenericHTMLNode; extractWithChild(): boolean; isInline(): boolean; } /** * A generic editor that can be used as an universal UI for any JSX element. * Allows editing of the element content and properties. * Use this editor for the {@link JsxComponentDescriptor} Editor option. * @group JSX */ export declare const GenericJsxEditor: default_2.FC<GenericJsxEditorProps>; /** * Properties for the Generic Jsx Editor */ export declare interface GenericJsxEditorProps extends JsxEditorProps { /** * A custom property editor component {@link PropertyEditorType} */ PropertyEditor?: PropertyEditorType; } /** * Gets the selected node from the Lexical editor. * @group Utils */ export declare function getSelectedNode(selection: RangeSelection): TextNode | ElementNode | null; /** * Gets the markdown representation of the current selection in the Lexical editor. * Returns an empty string if there is no selection or if the selection is collapsed. * Converts selected nodes to markdown by recursively processing them and preserving formatting. * Note: Selects entire nodes, not partial selections within nodes. * @group Utils */ export declare function getSelectionAsMarkdown(editor: LexicalEditor, _exportParams: Omit<ExportMarkdownFromLexicalOptions, 'root'>): string; /** * Gets the coordinates of the selection in the Lexical editor. * @group Utils */ export declare function getSelectionRectangle(editor: LexicalEditor): { top: number; left: number; width: number; height: number; } | null; /* Excluded from this release type: getStateAsMarkdown */ /** * Whether the markdown document has a frontmatter node. * @group Frontmatter */ export declare const hasFrontmatter$: NodeRef<boolean>; /** * @group Headings */ export declare type HEADING_LEVEL = 1 | 2 | 3 | 4 | 5 | 6; /** * A plugin that adds support for markdown headings. * @group Headings */ export declare const headingsPlugin: (params?: { /** * Allows you to limit the headings used in the editor. Affects the block type dropdown and the keyboard shortcuts. * @default [1, 2, 3, 4, 5, 6] */ allowedHeadingLevels?: readonly HEADING_LEVEL[] | undefined; } | undefined) => RealmPlugin; /** * A toolbar component that lets the user toggle highlight formatting. * @group Toolbar Components */ export declare const HighlightToggle: default_2.FC; /* Excluded from this release type: historyState$ */ /** * All the HTML tags supported by the generic html node. * @group HTML */ export declare const htmlTags: string[]; /** * A callback that returns the icon component for the given name. * @group Core */ export declare const iconComponentFor$: NodeRef<(name: IconKey) => default_2.ReactNode>; export declare type IconKey = 'undo' | 'redo' | 'format_bold' | 'format_italic' | 'format_underlined' | 'code' | 'strikeThrough' | 'superscript' | 'subscript' | 'format_list_bulleted' | 'format_list_numbered' | 'format_list_checked' | 'format_highlight' | 'link' | 'add_photo' | 'table' | 'horizontal_rule' | 'frontmatter' | 'frame_source' | 'arrow_drop_down' | 'admonition' | 'sandpack' | 'rich_text' | 'difference' | 'markdown' | 'open_in_new' | 'link_off' | 'edit' | 'content_copy' | 'more_horiz' | 'more_vert' | 'close' | 'settings' | 'delete_big' | 'delete_small' | 'format_align_center' | 'format_align_left' | 'format_align_right' | 'add_row' | 'add_column' | 'insert_col_left' | 'insert_row_above' | 'insert_row_below' | 'insert_col_right' | 'check'; /** * Holds the autocomplete suggestions for image sources. * @group Image */ export declare const imageAutocompleteSuggestions$: NodeRef<string[]>; /** * Holds the current state of the image dialog. * @group Image */ export declare const imageDialogState$: NodeRef<EditingImageDialogState | InactiveImageDialogState | NewImageDialogState>; /** * A lexical node that represents an image. Use {@link "$createImageNode"} to construct one. * @group Image */ export declare class ImageNode extends DecoratorNode<JSX.Element> { /* Excluded from this release type: __src */ /* Excluded from this release type: __altText */ /* Excluded from this release type: __title */ /* Excluded from this release type: __width */ /* Excluded from this release type: __height */ /* Excluded from this release type: __rest */ /* Excluded from this release type: getType */ /* Excluded from this release type: clone */ /* Excluded from this release type: importJSON */ /* Excluded from this release type: exportDOM */ /* Excluded from this release type: importDOM */ /** * Constructs a new {@link ImageNode} with the specified image parameters. * Use {@link $createImageNode} to construct one. */ constructor(src: string, altText: string, title: string | undefined, width?: 'inherit' | number, height?: 'inherit' | number, rest?: (MdxJsxAttribute | MdxJsxExpressionAttribute)[], key?: NodeKey); /* Excluded from this release type: exportJSON */ /** * Sets the image dimensions */ setWidthAndHeight(width: 'inherit' | number, height: 'inherit' | number): void; /* Excluded from this release type: createDOM */ /* Excluded from this release type: updateDOM */ getSrc(): string; getAltText(): string; getTitle(): string | undefined; getHeight(): 'inherit' | number; getWidth(): 'inherit' | number; getRest(): (MdxJsxAttribute | MdxJsxExpressionAttribute)[]; setTitle(title: string | undefined): void; setSrc(src: string): void; setAltText(altText: string | undefined): void;