@tiptap/react 2.0.0-beta.51 → 2.0.0-beta.55

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,47 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [2.0.0-beta.55](https://github.com/ueberdosis/tiptap/compare/@tiptap/react@2.0.0-beta.54...@tiptap/react@2.0.0-beta.55) (2021-07-28)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * fix updating node views, fix [#1656](https://github.com/ueberdosis/tiptap/issues/1656) ([d7f6e0c](https://github.com/ueberdosis/tiptap/commit/d7f6e0ce3f99381d3822cde5ab1c484ed13a4c20))
12
+
13
+
14
+
15
+
16
+
17
+ # [2.0.0-beta.54](https://github.com/ueberdosis/tiptap/compare/@tiptap/react@2.0.0-beta.53...@tiptap/react@2.0.0-beta.54) (2021-07-27)
18
+
19
+
20
+ ### Features
21
+
22
+ * add ignoreMutation option to NodeViewRenderer, fix [#1538](https://github.com/ueberdosis/tiptap/issues/1538) ([651e691](https://github.com/ueberdosis/tiptap/commit/651e6911e3ea5407df6a48783ee16733e0a4f474))
23
+
24
+
25
+
26
+
27
+
28
+ # [2.0.0-beta.53](https://github.com/ueberdosis/tiptap/compare/@tiptap/react@2.0.0-beta.52...@tiptap/react@2.0.0-beta.53) (2021-07-26)
29
+
30
+ **Note:** Version bump only for package @tiptap/react
31
+
32
+
33
+
34
+
35
+
36
+ # [2.0.0-beta.52](https://github.com/ueberdosis/tiptap/compare/@tiptap/react@2.0.0-beta.51...@tiptap/react@2.0.0-beta.52) (2021-06-24)
37
+
38
+
39
+ ### Bug Fixes
40
+
41
+ * check for destroyed editor before creating node views in react ([44e4722](https://github.com/ueberdosis/tiptap/commit/44e47222a03be60835d5058d01bc510e4cf31d60))
42
+
43
+
44
+
45
+
46
+
6
47
  # [2.0.0-beta.51](https://github.com/ueberdosis/tiptap/compare/@tiptap/react@2.0.0-beta.50...@tiptap/react@2.0.0-beta.51) (2021-06-23)
7
48
 
8
49
  **Note:** Version bump only for package @tiptap/react
@@ -1,9 +1,13 @@
1
- import { NodeViewRenderer } from '@tiptap/core';
1
+ import { NodeViewRenderer, NodeViewRendererOptions } from '@tiptap/core';
2
2
  import { Decoration } from 'prosemirror-view';
3
3
  import { Node as ProseMirrorNode } from 'prosemirror-model';
4
- interface ReactNodeViewRendererOptions {
5
- stopEvent: ((event: Event) => boolean) | null;
6
- update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null;
4
+ export interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {
5
+ update: ((props: {
6
+ oldNode: ProseMirrorNode;
7
+ oldDecorations: Decoration[];
8
+ newNode: ProseMirrorNode;
9
+ newDecorations: Decoration[];
10
+ updateProps: () => void;
11
+ }) => boolean) | null;
7
12
  }
8
13
  export declare function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer;
9
- export {};
@@ -192,8 +192,22 @@ class ReactNodeView extends core.NodeView {
192
192
  }
193
193
  }
194
194
  update(node, decorations) {
195
+ const updateProps = (props) => {
196
+ this.renderer.updateProps(props);
197
+ this.maybeMoveContentDOM();
198
+ };
195
199
  if (typeof this.options.update === 'function') {
196
- return this.options.update(node, decorations);
200
+ const oldNode = this.node;
201
+ const oldDecorations = this.decorations;
202
+ this.node = node;
203
+ this.decorations = decorations;
204
+ return this.options.update({
205
+ oldNode,
206
+ oldDecorations,
207
+ newNode: node,
208
+ newDecorations: decorations,
209
+ updateProps: () => updateProps({ node, decorations }),
210
+ });
197
211
  }
198
212
  if (node.type !== this.node.type) {
199
213
  return false;
@@ -203,8 +217,7 @@ class ReactNodeView extends core.NodeView {
203
217
  }
204
218
  this.node = node;
205
219
  this.decorations = decorations;
206
- this.renderer.updateProps({ node, decorations });
207
- this.maybeMoveContentDOM();
220
+ updateProps({ node, decorations });
208
221
  return true;
209
222
  }
210
223
  selectNode() {
@@ -266,7 +279,11 @@ class PureEditorContent extends React__default['default'].Component {
266
279
  });
267
280
  editor.contentComponent = this;
268
281
  // TODO: alternative to setTimeout?
269
- setTimeout(() => editor.createNodeViews(), 0);
282
+ setTimeout(() => {
283
+ if (!editor.isDestroyed) {
284
+ editor.createNodeViews();
285
+ }
286
+ }, 0);
270
287
  }
271
288
  }
272
289
  componentWillUnmount() {
@@ -1 +1 @@
1
- {"version":3,"file":"tiptap-react.cjs.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\ninterface ReactNodeViewRendererOptions {\n stopEvent: ((event: Event) => boolean) | null,\n update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n if (typeof this.options.update === 'function') {\n return this.options.update(node, decorations)\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n this.renderer.updateProps({ node, decorations })\n this.maybeMoveContentDOM()\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => editor.createNodeViews(), 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["useRef","useEffect","BubbleMenuPlugin","BubbleMenuPluginKey","React","CoreEditor","FloatingMenuPlugin","FloatingMenuPluginKey","useState","createContext","useContext","NodeView","ReactDOM"],"mappings":"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"}
1
+ {"version":3,"file":"tiptap-react.cjs.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n NodeViewRendererOptions,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\nexport interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {\n update: ((props: {\n oldNode: ProseMirrorNode,\n oldDecorations: Decoration[],\n newNode: ProseMirrorNode,\n newDecorations: Decoration[],\n updateProps: () => void,\n }) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor, ReactNodeViewRendererOptions> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n const updateProps = (props?: Record<string, any>) => {\n this.renderer.updateProps(props)\n this.maybeMoveContentDOM()\n }\n\n if (typeof this.options.update === 'function') {\n const oldNode = this.node\n const oldDecorations = this.decorations\n\n this.node = node\n this.decorations = decorations\n\n return this.options.update({\n oldNode,\n oldDecorations,\n newNode: node,\n newDecorations: decorations,\n updateProps: () => updateProps({ node, decorations }),\n })\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n\n updateProps({ node, decorations })\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => {\n if (!editor.isDestroyed) {\n editor.createNodeViews()\n }\n }, 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["useRef","useEffect","BubbleMenuPlugin","BubbleMenuPluginKey","React","CoreEditor","FloatingMenuPlugin","FloatingMenuPluginKey","useState","createContext","useContext","NodeView","ReactDOM"],"mappings":"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"}
@@ -184,8 +184,22 @@ class ReactNodeView extends NodeView {
184
184
  }
185
185
  }
186
186
  update(node, decorations) {
187
+ const updateProps = (props) => {
188
+ this.renderer.updateProps(props);
189
+ this.maybeMoveContentDOM();
190
+ };
187
191
  if (typeof this.options.update === 'function') {
188
- return this.options.update(node, decorations);
192
+ const oldNode = this.node;
193
+ const oldDecorations = this.decorations;
194
+ this.node = node;
195
+ this.decorations = decorations;
196
+ return this.options.update({
197
+ oldNode,
198
+ oldDecorations,
199
+ newNode: node,
200
+ newDecorations: decorations,
201
+ updateProps: () => updateProps({ node, decorations }),
202
+ });
189
203
  }
190
204
  if (node.type !== this.node.type) {
191
205
  return false;
@@ -195,8 +209,7 @@ class ReactNodeView extends NodeView {
195
209
  }
196
210
  this.node = node;
197
211
  this.decorations = decorations;
198
- this.renderer.updateProps({ node, decorations });
199
- this.maybeMoveContentDOM();
212
+ updateProps({ node, decorations });
200
213
  return true;
201
214
  }
202
215
  selectNode() {
@@ -258,7 +271,11 @@ class PureEditorContent extends React.Component {
258
271
  });
259
272
  editor.contentComponent = this;
260
273
  // TODO: alternative to setTimeout?
261
- setTimeout(() => editor.createNodeViews(), 0);
274
+ setTimeout(() => {
275
+ if (!editor.isDestroyed) {
276
+ editor.createNodeViews();
277
+ }
278
+ }, 0);
262
279
  }
263
280
  }
264
281
  componentWillUnmount() {
@@ -1 +1 @@
1
- {"version":3,"file":"tiptap-react.esm.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\ninterface ReactNodeViewRendererOptions {\n stopEvent: ((event: Event) => boolean) | null,\n update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n if (typeof this.options.update === 'function') {\n return this.options.update(node, decorations)\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n this.renderer.updateProps({ node, decorations })\n this.maybeMoveContentDOM()\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => editor.createNodeViews(), 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["CoreEditor"],"mappings":"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"}
1
+ {"version":3,"file":"tiptap-react.esm.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n NodeViewRendererOptions,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\nexport interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {\n update: ((props: {\n oldNode: ProseMirrorNode,\n oldDecorations: Decoration[],\n newNode: ProseMirrorNode,\n newDecorations: Decoration[],\n updateProps: () => void,\n }) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor, ReactNodeViewRendererOptions> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n const updateProps = (props?: Record<string, any>) => {\n this.renderer.updateProps(props)\n this.maybeMoveContentDOM()\n }\n\n if (typeof this.options.update === 'function') {\n const oldNode = this.node\n const oldDecorations = this.decorations\n\n this.node = node\n this.decorations = decorations\n\n return this.options.update({\n oldNode,\n oldDecorations,\n newNode: node,\n newDecorations: decorations,\n updateProps: () => updateProps({ node, decorations }),\n })\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n\n updateProps({ node, decorations })\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => {\n if (!editor.isDestroyed) {\n editor.createNodeViews()\n }\n }, 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["CoreEditor"],"mappings":"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"}
@@ -188,8 +188,22 @@
188
188
  }
189
189
  }
190
190
  update(node, decorations) {
191
+ const updateProps = (props) => {
192
+ this.renderer.updateProps(props);
193
+ this.maybeMoveContentDOM();
194
+ };
191
195
  if (typeof this.options.update === 'function') {
192
- return this.options.update(node, decorations);
196
+ const oldNode = this.node;
197
+ const oldDecorations = this.decorations;
198
+ this.node = node;
199
+ this.decorations = decorations;
200
+ return this.options.update({
201
+ oldNode,
202
+ oldDecorations,
203
+ newNode: node,
204
+ newDecorations: decorations,
205
+ updateProps: () => updateProps({ node, decorations }),
206
+ });
193
207
  }
194
208
  if (node.type !== this.node.type) {
195
209
  return false;
@@ -199,8 +213,7 @@
199
213
  }
200
214
  this.node = node;
201
215
  this.decorations = decorations;
202
- this.renderer.updateProps({ node, decorations });
203
- this.maybeMoveContentDOM();
216
+ updateProps({ node, decorations });
204
217
  return true;
205
218
  }
206
219
  selectNode() {
@@ -262,7 +275,11 @@
262
275
  });
263
276
  editor.contentComponent = this;
264
277
  // TODO: alternative to setTimeout?
265
- setTimeout(() => editor.createNodeViews(), 0);
278
+ setTimeout(() => {
279
+ if (!editor.isDestroyed) {
280
+ editor.createNodeViews();
281
+ }
282
+ }, 0);
266
283
  }
267
284
  }
268
285
  componentWillUnmount() {
@@ -1 +1 @@
1
- {"version":3,"file":"tiptap-react.umd.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\ninterface ReactNodeViewRendererOptions {\n stopEvent: ((event: Event) => boolean) | null,\n update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n if (typeof this.options.update === 'function') {\n return this.options.update(node, decorations)\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n this.renderer.updateProps({ node, decorations })\n this.maybeMoveContentDOM()\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => editor.createNodeViews(), 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["useRef","useEffect","BubbleMenuPlugin","BubbleMenuPluginKey","React","CoreEditor","FloatingMenuPlugin","FloatingMenuPluginKey","useState","createContext","useContext","NodeView","ReactDOM"],"mappings":";;;;;;;;;;;QAOa,UAAU,GAA8B,KAAK;MACxD,MAAM,OAAO,GAAGA,YAAM,CAAiB,IAAI,CAAC,CAAA;MAE5CC,eAAS,CAAC;UACR,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;UAEtC,MAAM,CAAC,cAAc,CAACC,oCAAgB,CAAC;cACrC,MAAM;cACN,OAAO,EAAE,OAAO,CAAC,OAAsB;cACvC,YAAY;WACb,CAAC,CAAC,CAAA;UAEH,OAAO;cACL,MAAM,CAAC,gBAAgB,CAACC,uCAAmB,CAAC,CAAA;WAC7C,CAAA;OACF,EAAE,EAAE,CAAC,CAAA;MAEN,QACEC,iDAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAC3E,KAAK,CAAC,QAAQ,CACX,EACP;EACH;;QCzBa,MAAO,SAAQC,WAAU;MAAtC;;UACS,qBAAgB,GAAmE,IAAI,CAAA;OAC/F;;;QCCY,YAAY,GAAgC,KAAK;MAC5D,MAAM,OAAO,GAAGL,YAAM,CAAiB,IAAI,CAAC,CAAA;MAE5CC,eAAS,CAAC;UACR,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;UAEtC,MAAM,CAAC,cAAc,CAACK,wCAAkB,CAAC;cACvC,MAAM;cACN,OAAO,EAAE,OAAO,CAAC,OAAsB;cACvC,YAAY;WACb,CAAC,CAAC,CAAA;UAEH,OAAO;cACL,MAAM,CAAC,gBAAgB,CAACC,2CAAqB,CAAC,CAAA;WAC/C,CAAA;OACF,EAAE,EAAE,CAAC,CAAA;MAEN,QACEH,iDAAK,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAC3E,KAAK,CAAC,QAAQ,CACX,EACP;EACH;;ECzBA,SAAS,cAAc;MACrB,MAAM,GAAG,QAAQ,CAAC,GAAGI,cAAQ,CAAC,CAAC,CAAC,CAAA;MAEhC,OAAO,MAAM,QAAQ,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;EAC3C,CAAC;QAEY,SAAS,GAAG,CAAC,UAAkC,EAAE,EAAE,OAAuB,EAAE;MACvF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC,CAAA;MACzD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;MAEpCP,eAAS,CAAC;UACR,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;UAEpC,SAAS,CAAC,QAAQ,CAAC,CAAA;UAEnB,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;UAEvC,OAAO;cACL,QAAQ,CAAC,OAAO,EAAE,CAAA;WACnB,CAAA;OACF,EAAE,IAAI,CAAC,CAAA;MAER,OAAO,MAAM,CAAA;EACf;;ECxBA,SAAS,gBAAgB,CAAC,SAAc;MACtC,OAAO,CAAC,EACN,OAAO,SAAS,KAAK,UAAU;aAC5B,SAAS,CAAC,SAAS;aACnB,SAAS,CAAC,SAAS,CAAC,gBAAgB,CACxC,CAAA;EACH,CAAC;QAQY,aAAa;MAexB,YAAY,SAAoD,EAAE,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,EAAwB;UAF1H,QAAG,GAA2B,IAAI,CAAA;UAGhC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAA;UAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;UAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;UACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;UAClB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;UACzC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;UAC5C,IAAI,CAAC,MAAM,EAAE,CAAA;OACd;MAED,MAAM;;UACJ,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;UAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;UAExB,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;cAC/B,KAAK,CAAC,GAAG,GAAG,CAAC,GAAoB;kBAC/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;eACf,CAAA;WACF;UAED,IAAI,CAAC,YAAY,GAAGG,wCAAC,SAAS,OAAK,KAAK,GAAK,CAAA;UAE7C,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,gBAAgB,EAAE;cACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;kBACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CACzD,IAAI,CAAC,EAAE,EACP,IAAI,CACL;eACF,CAAC,CAAA;WACH;OACF;MAED,WAAW,CAAC,QAA6B,EAAE;UACzC,IAAI,CAAC,KAAK,GAAG;cACX,GAAG,IAAI,CAAC,KAAK;cACb,GAAG,KAAK;WACT,CAAA;UAED,IAAI,CAAC,MAAM,EAAE,CAAA;OACd;MAED,OAAO;;UACL,IAAI,MAAA,IAAI,CAAC,MAAM,0CAAE,gBAAgB,EAAE;cACjC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAA;cAExD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;cAEzB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC;kBACpC,SAAS;eACV,CAAC,CAAA;WACH;OACF;;;EC7EI,MAAM,oBAAoB,GAAGK,mBAAa,CAAqC;MACpF,WAAW,EAAE,SAAS;GACvB,CAAC,CAAA;EAEK,MAAM,gBAAgB,GAAG,MAAMC,gBAAU,CAAC,oBAAoB,CAAC;;ECQtE,MAAM,aAAc,SAAQC,aAAyC;MAMnE,KAAK;UACH,MAAM,KAAK,GAAkB;cAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;cACnB,IAAI,EAAE,IAAI,CAAC,IAAI;cACf,WAAW,EAAE,IAAI,CAAC,WAAW;cAC7B,QAAQ,EAAE,KAAK;cACf,SAAS,EAAE,IAAI,CAAC,SAAS;cACzB,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE;cAC3B,gBAAgB,EAAE,CAAC,UAAU,GAAG,EAAE,KAAK,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;cACxE,UAAU,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;WACpC,CAAA;UAED,IAAI,CAAE,IAAI,CAAC,SAAiB,CAAC,WAAW,EAAE;cACxC,MAAM,mBAAmB,GAAG,CAAC,MAAc;kBACzC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;eAC5D,CAAA;cAED,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;WACtE;UAED,MAAM,qBAAqB,GAA4B,cAAc;cACnE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;cAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;cAEhC,QACEP,wCAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,WAAW,EAAE;kBACnDA,wCAAC,SAAS,OAAK,cAAc,GAAI,CACH,EACjC;WACF,CAAA;UAED,qBAAqB,CAAC,WAAW,GAAG,eAAe,CAAA;UAEnD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;gBACrC,IAAI;gBACJ,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,CAAA;UAE/D,IAAI,IAAI,CAAC,iBAAiB,EAAE;;;;cAI1B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAA;WACpD;UAED,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,qBAAqB,EAAE;cACvD,MAAM,EAAE,IAAI,CAAC,MAAM;cACnB,KAAK;cACL,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAClB,MAAM;oBACN,KAAK;WACV,CAAC,CAAA;OACH;MAED,IAAI,GAAG;;UACL,IACE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB;iBACpC,EAAC,MAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,0CAAE,YAAY,CAAC,wBAAwB,CAAC,CAAA,EACnF;cACA,MAAM,KAAK,CAAC,8DAA8D,CAAC,CAAA;WAC5E;UAED,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;OAC7B;MAED,IAAI,UAAU;UACZ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;cACpB,OAAO,IAAI,CAAA;WACZ;UAED,IAAI,CAAC,mBAAmB,EAAE,CAAA;UAE1B,OAAO,IAAI,CAAC,iBAAiB,CAAA;OAC9B;MAED,mBAAmB;UACjB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,0BAA0B,CAAC,CAAA;UAEzE,IACE,IAAI,CAAC,iBAAiB;iBACnB,cAAc;iBACd,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,EACnD;cACA,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;WACnD;OACF;MAED,MAAM,CAAC,IAAqB,EAAE,WAAyB;UACrD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE;cAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;WAC9C;UAED,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;cAChC,OAAO,KAAK,CAAA;WACb;UAED,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;cAC1D,OAAO,IAAI,CAAA;WACZ;UAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;UAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;UAC9B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;UAChD,IAAI,CAAC,mBAAmB,EAAE,CAAA;UAE1B,OAAO,IAAI,CAAA;OACZ;MAED,UAAU;UACR,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;cACxB,QAAQ,EAAE,IAAI;WACf,CAAC,CAAA;OACH;MAED,YAAY;UACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;cACxB,QAAQ,EAAE,KAAK;WAChB,CAAC,CAAA;OACH;MAED,OAAO;UACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;UACvB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;OAC9B;GACF;WAEe,qBAAqB,CAAC,SAAc,EAAE,OAA+C;MACnG,OAAO,CAAC,KAA4B;;;;UAIlC,IAAI,CAAE,KAAK,CAAC,MAAiB,CAAC,gBAAgB,EAAE;cAC9C,OAAO,EAAE,CAAA;WACV;UAED,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAwB,CAAA;OAC3E,CAAA;EACH;;EC3JA,MAAM,OAAO,GAAwD,CAAC,EAAE,SAAS,EAAE;MACjF,QACEA,kFACG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;UACzC,OAAOQ,4BAAQ,CAAC,YAAY,CAC1B,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,OAAO,EAChB,GAAG,CACJ,CAAA;OACF,CAAC,CACD,EACJ;EACH,CAAC,CAAA;QAUY,iBAAkB,SAAQR,yBAAK,CAAC,SAAiD;MAG5F,YAAY,KAAyB;UACnC,KAAK,CAAC,KAAK,CAAC,CAAA;UACZ,IAAI,CAAC,gBAAgB,GAAGA,yBAAK,CAAC,SAAS,EAAE,CAAA;UAEzC,IAAI,CAAC,KAAK,GAAG;cACX,SAAS,EAAE,IAAI,GAAG,EAAE;WACrB,CAAA;OACF;MAED,iBAAiB;UACf,IAAI,CAAC,IAAI,EAAE,CAAA;OACZ;MAED,kBAAkB;UAChB,IAAI,CAAC,IAAI,EAAE,CAAA;OACZ;MAED,IAAI;UACF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;UAE7B,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;cACpC,IAAI,MAAM,CAAC,gBAAgB,EAAE;kBAC3B,OAAM;eACP;cAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAA;cAE7C,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;cAEpD,MAAM,CAAC,UAAU,CAAC;kBAChB,OAAO;eACR,CAAC,CAAA;cAEF,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAA;;cAG9B,UAAU,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAA;WAC9C;OACF;MAED,oBAAoB;UAClB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;UAE7B,IAAI,CAAC,MAAM,EAAE;cACX,OAAM;WACP;UAED,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;cACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;kBACnB,SAAS,EAAE,EAAE;eACd,CAAC,CAAA;WACH;UAED,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAA;UAE9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE;cACtC,OAAM;WACP;UAED,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;UAEhD,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;UAEvD,MAAM,CAAC,UAAU,CAAC;cAChB,OAAO,EAAE,UAAU;WACpB,CAAC,CAAA;OACH;MAED,MAAM;UACJ,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAA;UAEtC,QACEA;cACEA,iDAAK,GAAG,EAAE,IAAI,CAAC,gBAAgB,KAAM,IAAI,GAAI;cAC7CA,wCAAC,OAAO,IAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAI,CAC3C,EACJ;OACF;GACF;QAEY,aAAa,GAAGA,yBAAK,CAAC,IAAI,CAAC,iBAAiB;;QCtG5C,eAAe,GAAmCA,yBAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,GAAG;MACzF,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAAA;MAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAA;MAE7B,QACEA,wCAAC,GAAG,OACE,KAAK,EACT,GAAG,EAAE,GAAG,4BACe,EAAE,EACzB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE;cACL,GAAG,KAAK,CAAC,KAAK;cACd,UAAU,EAAE,QAAQ;WACrB,GACD,EACH;EACH,CAAC;;QCjBY,eAAe,GAAmCA,yBAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,GAAG;MACzF,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAA;MAE7B,QACEA,wCAAC,GAAG,OACE,KAAK,EACT,GAAG,EAAE,GAAG,4BACe,EAAE,EACzB,KAAK,EAAE;cACL,GAAG,KAAK,CAAC,KAAK;cACd,UAAU,EAAE,UAAU;WACvB,GACD,EACH;EACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tiptap-react.umd.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/FloatingMenu.tsx","../src/useEditor.ts","../src/ReactRenderer.tsx","../src/useReactNodeView.ts","../src/ReactNodeViewRenderer.tsx","../src/EditorContent.tsx","../src/NodeViewWrapper.tsx","../src/NodeViewContent.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\nimport { BubbleMenuPlugin, BubbleMenuPluginKey, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\n\nexport type BubbleMenuProps = Omit<BubbleMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const BubbleMenu: React.FC<BubbleMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import React from 'react'\nimport { Editor as CoreEditor } from '@tiptap/core'\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { useEffect, useRef } from 'react'\nimport { FloatingMenuPlugin, FloatingMenuPluginKey, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\n\nexport type FloatingMenuProps = Omit<FloatingMenuPluginProps, 'element'> & {\n className?: string,\n}\n\nexport const FloatingMenu: React.FC<FloatingMenuProps> = props => {\n const element = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const { editor, tippyOptions } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n tippyOptions,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect, DependencyList } from 'react'\nimport { EditorOptions } from '@tiptap/core'\nimport { Editor } from './Editor'\n\nfunction useForceUpdate() {\n const [, setValue] = useState(0)\n\n return () => setValue(value => value + 1)\n}\n\nexport const useEditor = (options: Partial<EditorOptions> = {}, deps: DependencyList = []) => {\n const [editor, setEditor] = useState<Editor | null>(null)\n const forceUpdate = useForceUpdate()\n\n useEffect(() => {\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', forceUpdate)\n\n return () => {\n instance.destroy()\n }\n }, deps)\n\n return editor\n}\n","import React from 'react'\nimport { Editor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { editor, props = {}, as = 'div' }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component)) {\n props.ref = (ref: React.Component) => {\n this.ref = ref\n }\n }\n\n this.reactElement = <Component {...props } />\n\n if (this.editor?.contentComponent) {\n this.editor.contentComponent.setState({\n renderers: this.editor.contentComponent.state.renderers.set(\n this.id,\n this,\n ),\n })\n }\n }\n\n updateProps(props: Record<string, any> = {}): void {\n this.props = {\n ...this.props,\n ...props,\n }\n\n this.render()\n }\n\n destroy(): void {\n if (this.editor?.contentComponent) {\n const { renderers } = this.editor.contentComponent.state\n\n renderers.delete(this.id)\n\n this.editor.contentComponent.setState({\n renderers,\n })\n }\n }\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\nimport {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererProps,\n NodeViewRendererOptions,\n} from '@tiptap/core'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext } from './useReactNodeView'\n\nexport interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {\n update: ((props: {\n oldNode: ProseMirrorNode,\n oldDecorations: Decoration[],\n newNode: ProseMirrorNode,\n newDecorations: Decoration[],\n updateProps: () => void,\n }) => boolean) | null,\n}\n\nclass ReactNodeView extends NodeView<React.FunctionComponent, Editor, ReactNodeViewRendererOptions> {\n\n renderer!: ReactRenderer\n\n contentDOMElement!: HTMLElement | null\n\n mount() {\n const props: NodeViewProps = {\n editor: this.editor,\n node: this.node,\n decorations: this.decorations,\n selected: false,\n extension: this.extension,\n getPos: () => this.getPos(),\n updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n deleteNode: () => this.deleteNode(),\n }\n\n if (!(this.component as any).displayName) {\n const capitalizeFirstChar = (string: string): string => {\n return string.charAt(0).toUpperCase() + string.substring(1)\n }\n\n this.component.displayName = capitalizeFirstChar(this.extension.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const onDragStart = this.onDragStart.bind(this)\n const Component = this.component\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.contentDOMElement = this.node.isLeaf\n ? null\n : document.createElement(this.node.isInline ? 'span' : 'div')\n\n if (this.contentDOMElement) {\n // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari\n // With this fix it seems to work fine\n // See: https://github.com/ueberdosis/tiptap/issues/1197\n this.contentDOMElement.style.whiteSpace = 'inherit'\n }\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as: this.node.isInline\n ? 'span'\n : 'div',\n })\n }\n\n get dom() {\n if (\n this.renderer.element.firstElementChild\n && !this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')\n ) {\n throw Error('Please use the NodeViewWrapper component for your node view.')\n }\n\n return this.renderer.element\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n this.maybeMoveContentDOM()\n\n return this.contentDOMElement\n }\n\n maybeMoveContentDOM(): void {\n const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n if (\n this.contentDOMElement\n && contentElement\n && !contentElement.contains(this.contentDOMElement)\n ) {\n contentElement.appendChild(this.contentDOMElement)\n }\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n const updateProps = (props?: Record<string, any>) => {\n this.renderer.updateProps(props)\n this.maybeMoveContentDOM()\n }\n\n if (typeof this.options.update === 'function') {\n const oldNode = this.node\n const oldDecorations = this.decorations\n\n this.node = node\n this.decorations = decorations\n\n return this.options.update({\n oldNode,\n oldDecorations,\n newNode: node,\n newDecorations: decorations,\n updateProps: () => updateProps({ node, decorations }),\n })\n }\n\n if (node.type !== this.node.type) {\n return false\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true\n }\n\n this.node = node\n this.decorations = decorations\n\n updateProps({ node, decorations })\n\n return true\n }\n\n selectNode() {\n this.renderer.updateProps({\n selected: true,\n })\n }\n\n deselectNode() {\n this.renderer.updateProps({\n selected: false,\n })\n }\n\n destroy() {\n this.renderer.destroy()\n this.contentDOMElement = null\n }\n}\n\nexport function ReactNodeViewRenderer(component: any, options?: Partial<ReactNodeViewRendererOptions>): NodeViewRenderer {\n return (props: NodeViewRendererProps) => {\n // try to get the parent component\n // this is important for vue devtools to show the component hierarchy correctly\n // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n if (!(props.editor as Editor).contentComponent) {\n return {}\n }\n\n return new ReactNodeView(component, props, options) as ProseMirrorNodeView\n }\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Map<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Array.from(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(\n renderer.reactElement,\n renderer.element,\n key,\n )\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null,\n}\n\nexport interface EditorContentState {\n renderers: Map<string, ReactRenderer>\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n\n this.state = {\n renderers: new Map(),\n }\n }\n\n componentDidMount() {\n this.init()\n }\n\n componentDidUpdate() {\n this.init()\n }\n\n init() {\n const { editor } = this.props\n\n if (editor && editor.options.element) {\n if (editor.contentComponent) {\n return\n }\n\n const element = this.editorContentRef.current\n\n element.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element,\n })\n\n editor.contentComponent = this\n\n // TODO: alternative to setTimeout?\n setTimeout(() => {\n if (!editor.isDestroyed) {\n editor.createNodeViews()\n }\n }, 0)\n }\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n if (!editor.isDestroyed) {\n editor.view.setProps({\n nodeViews: {},\n })\n }\n\n editor.contentComponent = null\n\n if (!editor.options.element.firstChild) {\n return\n }\n\n const newElement = document.createElement('div')\n\n newElement.append(...editor.options.element.childNodes)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n const { editor, ...rest } = this.props\n\n return (\n <>\n <div ref={this.editorContentRef} {...rest} />\n <Portals renderers={this.state.renderers} />\n </>\n )\n }\n}\n\nexport const EditorContent = React.memo(PureEditorContent)\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewWrapperProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = React.forwardRef((props, ref) => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{\n ...props.style,\n whiteSpace: 'normal',\n }}\n />\n )\n})\n","import React from 'react'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = React.forwardRef((props, ref) => {\n const Tag = props.as || 'div'\n\n return (\n <Tag\n {...props}\n ref={ref}\n data-node-view-content=\"\"\n style={{\n ...props.style,\n whiteSpace: 'pre-wrap',\n }}\n />\n )\n})\n"],"names":["useRef","useEffect","BubbleMenuPlugin","BubbleMenuPluginKey","React","CoreEditor","FloatingMenuPlugin","FloatingMenuPluginKey","useState","createContext","useContext","NodeView","ReactDOM"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiptap/react",
3
3
  "description": "React components for tiptap",
4
- "version": "2.0.0-beta.51",
4
+ "version": "2.0.0-beta.55",
5
5
  "homepage": "https://tiptap.dev",
6
6
  "keywords": [
7
7
  "tiptap",
@@ -26,13 +26,18 @@
26
26
  "react-dom": "^17.0.1"
27
27
  },
28
28
  "dependencies": {
29
- "@tiptap/extension-bubble-menu": "^2.0.0-beta.24",
30
- "@tiptap/extension-floating-menu": "^2.0.0-beta.18",
31
- "prosemirror-view": "^1.18.8"
29
+ "@tiptap/extension-bubble-menu": "^2.0.0-beta.25",
30
+ "@tiptap/extension-floating-menu": "^2.0.0-beta.19",
31
+ "prosemirror-view": "^1.18.11"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/react": "^17.0.11",
35
35
  "@types/react-dom": "^17.0.7"
36
36
  },
37
- "gitHead": "84d732f7a579e6ceea1489a54d596c16b796e250"
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/ueberdosis/tiptap",
40
+ "directory": "packages/react"
41
+ },
42
+ "gitHead": "eb27b1fbb1ba0cd20bde7ae4b414f64a97aebf6f"
38
43
  }
@@ -64,7 +64,11 @@ export class PureEditorContent extends React.Component<EditorContentProps, Edito
64
64
  editor.contentComponent = this
65
65
 
66
66
  // TODO: alternative to setTimeout?
67
- setTimeout(() => editor.createNodeViews(), 0)
67
+ setTimeout(() => {
68
+ if (!editor.isDestroyed) {
69
+ editor.createNodeViews()
70
+ }
71
+ }, 0)
68
72
  }
69
73
  }
70
74
 
@@ -4,6 +4,7 @@ import {
4
4
  NodeViewProps,
5
5
  NodeViewRenderer,
6
6
  NodeViewRendererProps,
7
+ NodeViewRendererOptions,
7
8
  } from '@tiptap/core'
8
9
  import { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'
9
10
  import { Node as ProseMirrorNode } from 'prosemirror-model'
@@ -11,12 +12,17 @@ import { Editor } from './Editor'
11
12
  import { ReactRenderer } from './ReactRenderer'
12
13
  import { ReactNodeViewContext } from './useReactNodeView'
13
14
 
14
- interface ReactNodeViewRendererOptions {
15
- stopEvent: ((event: Event) => boolean) | null,
16
- update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,
15
+ export interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {
16
+ update: ((props: {
17
+ oldNode: ProseMirrorNode,
18
+ oldDecorations: Decoration[],
19
+ newNode: ProseMirrorNode,
20
+ newDecorations: Decoration[],
21
+ updateProps: () => void,
22
+ }) => boolean) | null,
17
23
  }
18
24
 
19
- class ReactNodeView extends NodeView<React.FunctionComponent, Editor> {
25
+ class ReactNodeView extends NodeView<React.FunctionComponent, Editor, ReactNodeViewRendererOptions> {
20
26
 
21
27
  renderer!: ReactRenderer
22
28
 
@@ -109,8 +115,25 @@ class ReactNodeView extends NodeView<React.FunctionComponent, Editor> {
109
115
  }
110
116
 
111
117
  update(node: ProseMirrorNode, decorations: Decoration[]) {
118
+ const updateProps = (props?: Record<string, any>) => {
119
+ this.renderer.updateProps(props)
120
+ this.maybeMoveContentDOM()
121
+ }
122
+
112
123
  if (typeof this.options.update === 'function') {
113
- return this.options.update(node, decorations)
124
+ const oldNode = this.node
125
+ const oldDecorations = this.decorations
126
+
127
+ this.node = node
128
+ this.decorations = decorations
129
+
130
+ return this.options.update({
131
+ oldNode,
132
+ oldDecorations,
133
+ newNode: node,
134
+ newDecorations: decorations,
135
+ updateProps: () => updateProps({ node, decorations }),
136
+ })
114
137
  }
115
138
 
116
139
  if (node.type !== this.node.type) {
@@ -123,8 +146,8 @@ class ReactNodeView extends NodeView<React.FunctionComponent, Editor> {
123
146
 
124
147
  this.node = node
125
148
  this.decorations = decorations
126
- this.renderer.updateProps({ node, decorations })
127
- this.maybeMoveContentDOM()
149
+
150
+ updateProps({ node, decorations })
128
151
 
129
152
  return true
130
153
  }