UNPKG

@blocknote/react

Version:

A "Notion-style" block-based extensible text editor built on top of Prosemirror and Tiptap.

55 lines (50 loc) 1.58 kB
/** * A portal mount target. * * - `HTMLElement` — used as-is. * - `string` — treated as a CSS selector and resolved via `document.querySelector`. */ export type PortalElement = HTMLElement | string; /** * Per-element portal targets for BlockNote's floating UI. Keys mirror the * default UI element flags on `BlockNoteView`. * * `default` is the fallback used for any element whose key is omitted. If * `default` is also omitted, floating UI portals into the element wrapping the * editor: its `bn-container`, or what `BlockNoteViewEditor` was rendered into. */ export type PortalElementsMap = { default?: PortalElement; formattingToolbar?: PortalElement; linkToolbar?: PortalElement; slashMenu?: PortalElement; emojiPicker?: PortalElement; sideMenu?: PortalElement; filePanel?: PortalElement; tableHandles?: PortalElement; comments?: PortalElement; attributionTooltip?: PortalElement; }; export type PortalElementKey = Exclude<keyof PortalElementsMap, "default">; export function resolvePortalElement( target: PortalElement | undefined, ): HTMLElement | undefined { if (target === undefined) { return undefined; } if (typeof target === "string") { if (typeof document === "undefined") { return undefined; } const el = document.querySelector(target); if (!el) { // eslint-disable-next-line no-console console.warn( `[BlockNote] portalElements selector "${target}" did not match any element`, ); return undefined; } return el as HTMLElement; } return target; }