@tiptap/react 2.0.0-beta.11 → 2.0.0-beta.114

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.
Files changed (34) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/react/src/BubbleMenu.d.ts +6 -3
  4. package/dist/packages/react/src/Editor.d.ts +1 -1
  5. package/dist/packages/react/src/EditorContent.d.ts +2 -2
  6. package/dist/packages/react/src/FloatingMenu.d.ts +6 -3
  7. package/dist/packages/react/src/NodeViewContent.d.ts +2 -2
  8. package/dist/packages/react/src/NodeViewWrapper.d.ts +2 -2
  9. package/dist/packages/react/src/ReactNodeViewRenderer.d.ts +12 -6
  10. package/dist/packages/react/src/ReactRenderer.d.ts +13 -10
  11. package/dist/packages/react/src/index.d.ts +6 -6
  12. package/dist/packages/react/src/useEditor.d.ts +2 -1
  13. package/dist/packages/react/src/useReactNodeView.d.ts +1 -1
  14. package/dist/tiptap-react.cjs.js +216 -147
  15. package/dist/tiptap-react.cjs.js.map +1 -1
  16. package/dist/tiptap-react.esm.js +215 -144
  17. package/dist/tiptap-react.esm.js.map +1 -1
  18. package/dist/tiptap-react.umd.js +218 -149
  19. package/dist/tiptap-react.umd.js.map +1 -1
  20. package/package.json +18 -10
  21. package/src/BubbleMenu.tsx +37 -15
  22. package/src/Editor.ts +2 -1
  23. package/src/EditorContent.tsx +9 -7
  24. package/src/FloatingMenu.tsx +37 -14
  25. package/src/NodeViewContent.tsx +10 -6
  26. package/src/NodeViewWrapper.tsx +12 -9
  27. package/src/ReactNodeViewRenderer.tsx +87 -33
  28. package/src/ReactRenderer.tsx +38 -14
  29. package/src/index.ts +6 -6
  30. package/src/useEditor.ts +16 -4
  31. package/src/useReactNodeView.ts +1 -2
  32. package/CHANGELOG.md +0 -96
  33. package/dist/tiptap-react.bundle.umd.min.js +0 -54
  34. package/dist/tiptap-react.bundle.umd.min.js.map +0 -1
@@ -1,28 +1,38 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tiptap/core'), require('react'), require('@tiptap/extension-bubble-menu'), require('@tiptap/extension-floating-menu'), require('react-dom')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@tiptap/core', 'react', '@tiptap/extension-bubble-menu', '@tiptap/extension-floating-menu', 'react-dom'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['@tiptap/react'] = {}, global.core, global.React, global.extensionBubbleMenu, global.extensionFloatingMenu, global.ReactDOM));
5
- }(this, (function (exports, core, React, extensionBubbleMenu, extensionFloatingMenu, ReactDOM) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@tiptap/extension-bubble-menu'), require('react'), require('@tiptap/core'), require('react-dom'), require('@tiptap/extension-floating-menu')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@tiptap/extension-bubble-menu', 'react', '@tiptap/core', 'react-dom', '@tiptap/extension-floating-menu'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["@tiptap/react"] = {}, global.extensionBubbleMenu, global.React, global.core, global.ReactDOM, global.extensionFloatingMenu));
5
+ })(this, (function (exports, extensionBubbleMenu, React, core, ReactDOM, extensionFloatingMenu) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
9
9
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
10
10
  var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
11
11
 
12
- const BubbleMenu = props => {
13
- const element = React.useRef(null);
12
+ const BubbleMenu = (props) => {
13
+ const [element, setElement] = React.useState(null);
14
14
  React.useEffect(() => {
15
- const { editor, keepInBounds = true } = props;
16
- editor.registerPlugin(extensionBubbleMenu.BubbleMenuPlugin({
15
+ if (!element) {
16
+ return;
17
+ }
18
+ if (props.editor.isDestroyed) {
19
+ return;
20
+ }
21
+ const { pluginKey = 'bubbleMenu', editor, tippyOptions = {}, shouldShow = null, } = props;
22
+ const plugin = extensionBubbleMenu.BubbleMenuPlugin({
23
+ pluginKey,
17
24
  editor,
18
- element: element.current,
19
- keepInBounds,
20
- }));
21
- return () => {
22
- editor.unregisterPlugin(extensionBubbleMenu.BubbleMenuPluginKey);
23
- };
24
- }, []);
25
- return (React__default['default'].createElement("div", { ref: element, className: props.className }, props.children));
25
+ element,
26
+ tippyOptions,
27
+ shouldShow,
28
+ });
29
+ editor.registerPlugin(plugin);
30
+ return () => editor.unregisterPlugin(pluginKey);
31
+ }, [
32
+ props.editor,
33
+ element,
34
+ ]);
35
+ return (React__default["default"].createElement("div", { ref: setElement, className: props.className, style: { visibility: 'hidden' } }, props.children));
26
36
  };
27
37
 
28
38
  class Editor extends core.Editor {
@@ -32,65 +42,152 @@
32
42
  }
33
43
  }
34
44
 
35
- const FloatingMenu = props => {
36
- const element = React.useRef(null);
45
+ const Portals = ({ renderers }) => {
46
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, Array.from(renderers).map(([key, renderer]) => {
47
+ return ReactDOM__default["default"].createPortal(renderer.reactElement, renderer.element, key);
48
+ })));
49
+ };
50
+ class PureEditorContent extends React__default["default"].Component {
51
+ constructor(props) {
52
+ super(props);
53
+ this.editorContentRef = React__default["default"].createRef();
54
+ this.state = {
55
+ renderers: new Map(),
56
+ };
57
+ }
58
+ componentDidMount() {
59
+ this.init();
60
+ }
61
+ componentDidUpdate() {
62
+ this.init();
63
+ }
64
+ init() {
65
+ const { editor } = this.props;
66
+ if (editor && editor.options.element) {
67
+ if (editor.contentComponent) {
68
+ return;
69
+ }
70
+ const element = this.editorContentRef.current;
71
+ element.append(...editor.options.element.childNodes);
72
+ editor.setOptions({
73
+ element,
74
+ });
75
+ editor.contentComponent = this;
76
+ editor.createNodeViews();
77
+ }
78
+ }
79
+ componentWillUnmount() {
80
+ const { editor } = this.props;
81
+ if (!editor) {
82
+ return;
83
+ }
84
+ if (!editor.isDestroyed) {
85
+ editor.view.setProps({
86
+ nodeViews: {},
87
+ });
88
+ }
89
+ editor.contentComponent = null;
90
+ if (!editor.options.element.firstChild) {
91
+ return;
92
+ }
93
+ const newElement = document.createElement('div');
94
+ newElement.append(...editor.options.element.childNodes);
95
+ editor.setOptions({
96
+ element: newElement,
97
+ });
98
+ }
99
+ render() {
100
+ const { editor, ...rest } = this.props;
101
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
102
+ React__default["default"].createElement("div", { ref: this.editorContentRef, ...rest }),
103
+ React__default["default"].createElement(Portals, { renderers: this.state.renderers })));
104
+ }
105
+ }
106
+ const EditorContent = React__default["default"].memo(PureEditorContent);
107
+
108
+ const FloatingMenu = (props) => {
109
+ const [element, setElement] = React.useState(null);
37
110
  React.useEffect(() => {
38
- const { editor } = props;
39
- editor.registerPlugin(extensionFloatingMenu.FloatingMenuPlugin({
111
+ if (!element) {
112
+ return;
113
+ }
114
+ if (props.editor.isDestroyed) {
115
+ return;
116
+ }
117
+ const { pluginKey = 'floatingMenu', editor, tippyOptions = {}, shouldShow = null, } = props;
118
+ const plugin = extensionFloatingMenu.FloatingMenuPlugin({
119
+ pluginKey,
40
120
  editor,
41
- element: element.current,
42
- }));
43
- return () => {
44
- editor.unregisterPlugin(extensionFloatingMenu.FloatingMenuPluginKey);
45
- };
46
- }, []);
47
- return (React__default['default'].createElement("div", { ref: element, className: props.className }, props.children));
121
+ element,
122
+ tippyOptions,
123
+ shouldShow,
124
+ });
125
+ editor.registerPlugin(plugin);
126
+ return () => editor.unregisterPlugin(pluginKey);
127
+ }, [
128
+ props.editor,
129
+ element,
130
+ ]);
131
+ return (React__default["default"].createElement("div", { ref: setElement, className: props.className, style: { visibility: 'hidden' } }, props.children));
48
132
  };
49
133
 
50
- function useForceUpdate() {
51
- const [, setValue] = React.useState(0);
52
- return () => setValue(value => value + 1);
53
- }
54
- const useEditor = (options = {}) => {
55
- const [editor, setEditor] = React.useState(null);
56
- const forceUpdate = useForceUpdate();
57
- React.useEffect(() => {
58
- const instance = new Editor(options);
59
- setEditor(instance);
60
- instance.on('transaction', forceUpdate);
61
- return () => {
62
- instance.destroy();
63
- };
64
- }, []);
65
- return editor;
134
+ const ReactNodeViewContext = React.createContext({
135
+ onDragStart: undefined,
136
+ });
137
+ const useReactNodeView = () => React.useContext(ReactNodeViewContext);
138
+
139
+ const NodeViewContent = props => {
140
+ const Tag = props.as || 'div';
141
+ const { nodeViewContentRef } = useReactNodeView();
142
+ return (React__default["default"].createElement(Tag, { ...props, ref: nodeViewContentRef, "data-node-view-content": "", style: {
143
+ whiteSpace: 'pre-wrap',
144
+ ...props.style,
145
+ } }));
66
146
  };
67
147
 
148
+ const NodeViewWrapper = React__default["default"].forwardRef((props, ref) => {
149
+ const { onDragStart } = useReactNodeView();
150
+ const Tag = props.as || 'div';
151
+ return (React__default["default"].createElement(Tag, { ...props, ref: ref, "data-node-view-wrapper": "", onDragStart: onDragStart, style: {
152
+ whiteSpace: 'normal',
153
+ ...props.style,
154
+ } }));
155
+ });
156
+
68
157
  function isClassComponent(Component) {
69
158
  return !!(typeof Component === 'function'
70
159
  && Component.prototype
71
160
  && Component.prototype.isReactComponent);
72
161
  }
162
+ function isForwardRefComponent(Component) {
163
+ var _a;
164
+ return !!(typeof Component === 'object'
165
+ && ((_a = Component.$$typeof) === null || _a === void 0 ? void 0 : _a.toString()) === 'Symbol(react.forward_ref)');
166
+ }
73
167
  class ReactRenderer {
74
- constructor(component, { props = {}, editor }) {
168
+ constructor(component, { editor, props = {}, as = 'div', className = '', }) {
75
169
  this.ref = null;
76
170
  this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString();
77
171
  this.component = component;
78
172
  this.editor = editor;
79
173
  this.props = props;
80
- this.element = document.createElement('div');
174
+ this.element = document.createElement(as);
81
175
  this.element.classList.add('react-renderer');
176
+ if (className) {
177
+ this.element.classList.add(...className.split(' '));
178
+ }
82
179
  this.render();
83
180
  }
84
181
  render() {
85
182
  var _a;
86
183
  const Component = this.component;
87
184
  const props = this.props;
88
- if (isClassComponent(Component)) {
185
+ if (isClassComponent(Component) || isForwardRefComponent(Component)) {
89
186
  props.ref = (ref) => {
90
187
  this.ref = ref;
91
188
  };
92
189
  }
93
- this.reactElement = React__default['default'].createElement(Component, Object.assign({}, props));
190
+ this.reactElement = React__default["default"].createElement(Component, { ...props });
94
191
  if ((_a = this.editor) === null || _a === void 0 ? void 0 : _a.contentComponent) {
95
192
  this.editor.contentComponent.setState({
96
193
  renderers: this.editor.contentComponent.state.renderers.set(this.id, this),
@@ -116,12 +213,6 @@
116
213
  }
117
214
  }
118
215
 
119
- const ReactNodeViewContext = React.createContext({
120
- isEditable: undefined,
121
- onDragStart: undefined,
122
- });
123
- const useReactNodeView = () => React.useContext(ReactNodeViewContext);
124
-
125
216
  class ReactNodeView extends core.NodeView {
126
217
  mount() {
127
218
  const props = {
@@ -132,38 +223,52 @@
132
223
  extension: this.extension,
133
224
  getPos: () => this.getPos(),
134
225
  updateAttributes: (attributes = {}) => this.updateAttributes(attributes),
226
+ deleteNode: () => this.deleteNode(),
135
227
  };
136
228
  if (!this.component.displayName) {
137
229
  const capitalizeFirstChar = (string) => {
138
230
  return string.charAt(0).toUpperCase() + string.substring(1);
139
231
  };
140
- // @ts-ignore
141
- this.component.displayName = capitalizeFirstChar(this.extension.config.name);
232
+ this.component.displayName = capitalizeFirstChar(this.extension.name);
142
233
  }
143
234
  const ReactNodeViewProvider = componentProps => {
144
- const [isEditable, setIsEditable] = React.useState(this.editor.isEditable);
145
- const onDragStart = this.onDragStart.bind(this);
146
- const onViewUpdate = () => setIsEditable(this.editor.isEditable);
147
235
  const Component = this.component;
148
- React.useEffect(() => {
149
- this.editor.on('viewUpdate', onViewUpdate);
150
- return () => {
151
- this.editor.off('viewUpdate', onViewUpdate);
152
- };
153
- }, []);
154
- return (React__default['default'].createElement(ReactNodeViewContext.Provider, { value: { onDragStart, isEditable } },
155
- React__default['default'].createElement(Component, Object.assign({}, componentProps))));
236
+ const onDragStart = this.onDragStart.bind(this);
237
+ const nodeViewContentRef = element => {
238
+ if (element && this.contentDOMElement && element.firstChild !== this.contentDOMElement) {
239
+ element.appendChild(this.contentDOMElement);
240
+ }
241
+ };
242
+ return (React__default["default"].createElement(ReactNodeViewContext.Provider, { value: { onDragStart, nodeViewContentRef } },
243
+ React__default["default"].createElement(Component, { ...componentProps })));
156
244
  };
157
245
  ReactNodeViewProvider.displayName = 'ReactNodeView';
246
+ this.contentDOMElement = this.node.isLeaf
247
+ ? null
248
+ : document.createElement(this.node.isInline ? 'span' : 'div');
249
+ if (this.contentDOMElement) {
250
+ // For some reason the whiteSpace prop is not inherited properly in Chrome and Safari
251
+ // With this fix it seems to work fine
252
+ // See: https://github.com/ueberdosis/tiptap/issues/1197
253
+ this.contentDOMElement.style.whiteSpace = 'inherit';
254
+ }
255
+ let as = this.node.isInline ? 'span' : 'div';
256
+ if (this.options.as) {
257
+ as = this.options.as;
258
+ }
259
+ const { className = '' } = this.options;
158
260
  this.renderer = new ReactRenderer(ReactNodeViewProvider, {
159
261
  editor: this.editor,
160
262
  props,
263
+ as,
264
+ className: `node-${this.node.type.name} ${className}`.trim(),
161
265
  });
162
266
  }
163
267
  get dom() {
164
268
  var _a;
165
- if (!((_a = this.renderer.element.firstElementChild) === null || _a === void 0 ? void 0 : _a.hasAttribute('data-node-view-wrapper'))) {
166
- throw Error('Please use the ReactViewWrapper component for your node view.');
269
+ if (this.renderer.element.firstElementChild
270
+ && !((_a = this.renderer.element.firstElementChild) === null || _a === void 0 ? void 0 : _a.hasAttribute('data-node-view-wrapper'))) {
271
+ throw Error('Please use the NodeViewWrapper component for your node view.');
167
272
  }
168
273
  return this.renderer.element;
169
274
  }
@@ -171,22 +276,34 @@
171
276
  if (this.node.isLeaf) {
172
277
  return null;
173
278
  }
174
- const contentElement = this.dom.querySelector('[data-node-view-content]');
175
- return contentElement || this.dom;
279
+ return this.contentDOMElement;
176
280
  }
177
281
  update(node, decorations) {
178
- if (typeof this.options.update === 'function') {
179
- return this.options.update(node, decorations);
180
- }
282
+ const updateProps = (props) => {
283
+ this.renderer.updateProps(props);
284
+ };
181
285
  if (node.type !== this.node.type) {
182
286
  return false;
183
287
  }
288
+ if (typeof this.options.update === 'function') {
289
+ const oldNode = this.node;
290
+ const oldDecorations = this.decorations;
291
+ this.node = node;
292
+ this.decorations = decorations;
293
+ return this.options.update({
294
+ oldNode,
295
+ oldDecorations,
296
+ newNode: node,
297
+ newDecorations: decorations,
298
+ updateProps: () => updateProps({ node, decorations }),
299
+ });
300
+ }
184
301
  if (node === this.node && this.decorations === decorations) {
185
302
  return true;
186
303
  }
187
304
  this.node = node;
188
305
  this.decorations = decorations;
189
- this.renderer.updateProps({ node, decorations });
306
+ updateProps({ node, decorations });
190
307
  return true;
191
308
  }
192
309
  selectNode() {
@@ -201,6 +318,7 @@
201
318
  }
202
319
  destroy() {
203
320
  this.renderer.destroy();
321
+ this.contentDOMElement = null;
204
322
  }
205
323
  }
206
324
  function ReactNodeViewRenderer(component, options) {
@@ -215,79 +333,32 @@
215
333
  };
216
334
  }
217
335
 
218
- const Portals = ({ renderers }) => {
219
- return (React__default['default'].createElement(React__default['default'].Fragment, null, Array.from(renderers).map(([key, renderer]) => {
220
- return ReactDOM__default['default'].createPortal(renderer.reactElement, renderer.element, key);
221
- })));
222
- };
223
- class PureEditorContent extends React__default['default'].Component {
224
- constructor(props) {
225
- super(props);
226
- this.editorContentRef = React__default['default'].createRef();
227
- this.state = {
228
- renderers: new Map(),
229
- };
230
- }
231
- componentDidMount() {
232
- this.init();
233
- }
234
- componentDidUpdate() {
235
- this.init();
236
- }
237
- init() {
238
- const { editor } = this.props;
239
- if (editor && editor.options.element) {
240
- if (editor.contentComponent) {
241
- return;
242
- }
243
- const element = this.editorContentRef.current;
244
- element.appendChild(editor.options.element.firstChild);
245
- editor.setOptions({
246
- element,
247
- });
248
- editor.contentComponent = this;
249
- // TODO: alternative to setTimeout?
250
- setTimeout(() => editor.createNodeViews(), 0);
251
- }
252
- }
253
- componentWillUnmount() {
254
- const { editor } = this.props;
255
- if (!editor) {
256
- return;
257
- }
258
- if (!editor.isDestroyed) {
259
- editor.view.setProps({
260
- nodeViews: {},
336
+ function useForceUpdate() {
337
+ const [, setValue] = React.useState(0);
338
+ return () => setValue(value => value + 1);
339
+ }
340
+ const useEditor = (options = {}, deps = []) => {
341
+ const [editor, setEditor] = React.useState(null);
342
+ const forceUpdate = useForceUpdate();
343
+ React.useEffect(() => {
344
+ let isMounted = true;
345
+ const instance = new Editor(options);
346
+ setEditor(instance);
347
+ instance.on('transaction', () => {
348
+ requestAnimationFrame(() => {
349
+ requestAnimationFrame(() => {
350
+ if (isMounted) {
351
+ forceUpdate();
352
+ }
353
+ });
261
354
  });
262
- }
263
- editor.contentComponent = null;
264
- if (!editor.options.element.firstChild) {
265
- return;
266
- }
267
- const newElement = document.createElement('div');
268
- newElement.appendChild(editor.options.element.firstChild);
269
- editor.setOptions({
270
- element: newElement,
271
355
  });
272
- }
273
- render() {
274
- return (React__default['default'].createElement(React__default['default'].Fragment, null,
275
- React__default['default'].createElement("div", { ref: this.editorContentRef }),
276
- React__default['default'].createElement(Portals, { renderers: this.state.renderers })));
277
- }
278
- }
279
- const EditorContent = React__default['default'].memo(PureEditorContent);
280
-
281
- const NodeViewWrapper = props => {
282
- const { onDragStart } = useReactNodeView();
283
- const Tag = props.as || 'div';
284
- return (React__default['default'].createElement(Tag, { className: props.className, "data-node-view-wrapper": "", onDragStart: onDragStart, style: { whiteSpace: 'normal' } }, props.children));
285
- };
286
-
287
- const NodeViewContent = props => {
288
- const { isEditable } = useReactNodeView();
289
- const Tag = props.as || 'div';
290
- return (React__default['default'].createElement(Tag, { className: props.className, "data-node-view-content": "", contentEditable: isEditable, style: { whiteSpace: 'pre-wrap' } }));
356
+ return () => {
357
+ instance.destroy();
358
+ isMounted = false;
359
+ };
360
+ }, deps);
361
+ return editor;
291
362
  };
292
363
 
293
364
  exports.BubbleMenu = BubbleMenu;
@@ -303,13 +374,11 @@
303
374
  Object.keys(core).forEach(function (k) {
304
375
  if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
305
376
  enumerable: true,
306
- get: function () {
307
- return core[k];
308
- }
377
+ get: function () { return core[k]; }
309
378
  });
310
379
  });
311
380
 
312
381
  Object.defineProperty(exports, '__esModule', { value: true });
313
382
 
314
- })));
383
+ }));
315
384
  //# sourceMappingURL=tiptap-react.umd.js.map
@@ -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, keepInBounds = true } = props\n\n editor.registerPlugin(BubbleMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n keepInBounds,\n }))\n\n return () => {\n editor.unregisterPlugin(BubbleMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className}>\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 } = props\n\n editor.registerPlugin(FloatingMenuPlugin({\n editor,\n element: element.current as HTMLElement,\n }))\n\n return () => {\n editor.unregisterPlugin(FloatingMenuPluginKey)\n }\n }, [])\n\n return (\n <div ref={element} className={props.className}>\n {props.children}\n </div>\n )\n}\n","import { useState, useEffect } 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> = {}) => {\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 }, [])\n\n return editor\n}\n","import React from 'react'\nimport { AnyObject } from '@tiptap/core'\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 as?: string,\n editor: Editor,\n props?: AnyObject,\n}\n\nexport class ReactRenderer {\n id: string\n\n editor: Editor\n\n component: any\n\n element: Element\n\n props: AnyObject\n\n reactElement: React.ReactNode\n\n ref: React.Component | null = null\n\n constructor(component: React.Component | React.FunctionComponent, { props = {}, editor }: 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('div')\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: AnyObject = {}): 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 isEditable: boolean,\n onDragStart: (event: DragEvent) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n isEditable: undefined,\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React, { useState, useEffect } 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 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 }\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 // @ts-ignore\n this.component.displayName = capitalizeFirstChar(this.extension.config.name)\n }\n\n const ReactNodeViewProvider: React.FunctionComponent = componentProps => {\n const [isEditable, setIsEditable] = useState(this.editor.isEditable)\n const onDragStart = this.onDragStart.bind(this)\n const onViewUpdate = () => setIsEditable(this.editor.isEditable)\n const Component = this.component\n\n useEffect(() => {\n this.editor.on('viewUpdate', onViewUpdate)\n\n return () => {\n this.editor.off('viewUpdate', onViewUpdate)\n }\n }, [])\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart, isEditable }}>\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n )\n }\n\n ReactNodeViewProvider.displayName = 'ReactNodeView'\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n })\n }\n\n get dom() {\n if (!this.renderer.element.firstElementChild?.hasAttribute('data-node-view-wrapper')) {\n throw Error('Please use the ReactViewWrapper 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 const contentElement = this.dom.querySelector('[data-node-view-content]')\n\n return contentElement || this.dom\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\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 }\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 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 {\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.appendChild(editor.options.element.firstChild)\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.appendChild(editor.options.element.firstChild)\n\n editor.setOptions({\n element: newElement,\n })\n }\n\n render() {\n return (\n <>\n <div ref={this.editorContentRef} />\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 className?: string,\n as: React.ElementType,\n}\n\nexport const NodeViewWrapper: React.FC<NodeViewWrapperProps> = props => {\n const { onDragStart } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n className={props.className}\n data-node-view-wrapper=\"\"\n onDragStart={onDragStart}\n style={{ whiteSpace: 'normal' }}\n >\n {props.children}\n </Tag>\n )\n}\n","import React from 'react'\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewContentProps {\n className?: string,\n as: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = props => {\n const { isEditable } = useReactNodeView()\n const Tag = props.as || 'div'\n\n return (\n <Tag\n className={props.className}\n data-node-view-content=\"\"\n contentEditable={isEditable}\n style={{ whiteSpace: 'pre-wrap' }}\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.umd.js","sources":["../src/BubbleMenu.tsx","../src/Editor.ts","../src/EditorContent.tsx","../src/FloatingMenu.tsx","../src/useReactNodeView.ts","../src/NodeViewContent.tsx","../src/NodeViewWrapper.tsx","../src/ReactRenderer.tsx","../src/ReactNodeViewRenderer.tsx","../src/useEditor.ts"],"sourcesContent":["import { BubbleMenuPlugin, BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu'\nimport React, {\n useEffect, useState,\n} from 'react'\n\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type BubbleMenuProps = Omit<Optional<BubbleMenuPluginProps, 'pluginKey'>, 'element'> & {\n className?: string,\n children: React.ReactNode\n}\n\nexport const BubbleMenu = (props: BubbleMenuProps) => {\n const [element, setElement] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!element) {\n return\n }\n\n if (props.editor.isDestroyed) {\n return\n }\n\n const {\n pluginKey = 'bubbleMenu',\n editor,\n tippyOptions = {},\n shouldShow = null,\n } = props\n\n const plugin = BubbleMenuPlugin({\n pluginKey,\n editor,\n element,\n tippyOptions,\n shouldShow,\n })\n\n editor.registerPlugin(plugin)\n return () => editor.unregisterPlugin(pluginKey)\n }, [\n props.editor,\n element,\n ])\n\n return (\n <div ref={setElement} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { Editor as CoreEditor } from '@tiptap/core'\nimport React from 'react'\n\nimport { EditorContentProps, EditorContentState } from './EditorContent'\n\nexport class Editor extends CoreEditor {\n public contentComponent: React.Component<EditorContentProps, EditorContentState> | null = null\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM from 'react-dom'\n\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 editor.createNodeViews()\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 { FloatingMenuPlugin, FloatingMenuPluginProps } from '@tiptap/extension-floating-menu'\nimport React, {\n useEffect, useState,\n} from 'react'\n\ntype Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>\n\nexport type FloatingMenuProps = Omit<Optional<FloatingMenuPluginProps, 'pluginKey'>, 'element'> & {\n className?: string,\n children: React.ReactNode\n}\n\nexport const FloatingMenu = (props: FloatingMenuProps) => {\n const [element, setElement] = useState<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!element) {\n return\n }\n\n if (props.editor.isDestroyed) {\n return\n }\n\n const {\n pluginKey = 'floatingMenu',\n editor,\n tippyOptions = {},\n shouldShow = null,\n } = props\n\n const plugin = FloatingMenuPlugin({\n pluginKey,\n editor,\n element,\n tippyOptions,\n shouldShow,\n })\n\n editor.registerPlugin(plugin)\n return () => editor.unregisterPlugin(pluginKey)\n }, [\n props.editor,\n element,\n ])\n\n return (\n <div ref={setElement} className={props.className} style={{ visibility: 'hidden' }}>\n {props.children}\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport interface ReactNodeViewContextProps {\n onDragStart: (event: DragEvent) => void,\n nodeViewContentRef: (element: HTMLElement | null) => void,\n}\n\nexport const ReactNodeViewContext = createContext<Partial<ReactNodeViewContextProps>>({\n onDragStart: undefined,\n})\n\nexport const useReactNodeView = () => useContext(ReactNodeViewContext)\n","import React from 'react'\n\nimport { useReactNodeView } from './useReactNodeView'\n\nexport interface NodeViewContentProps {\n [key: string]: any,\n as?: React.ElementType,\n}\n\nexport const NodeViewContent: React.FC<NodeViewContentProps> = props => {\n const Tag = props.as || 'div'\n const { nodeViewContentRef } = useReactNodeView()\n\n return (\n <Tag\n {...props}\n ref={nodeViewContentRef}\n data-node-view-content=\"\"\n style={{\n whiteSpace: 'pre-wrap',\n ...props.style,\n }}\n />\n )\n}\n","import React from 'react'\n\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 whiteSpace: 'normal',\n ...props.style,\n }}\n />\n )\n})\n","import { Editor } from '@tiptap/core'\nimport React from 'react'\n\nimport { Editor as ExtendedEditor } from './Editor'\n\nfunction isClassComponent(Component: any) {\n return !!(\n typeof Component === 'function'\n && Component.prototype\n && Component.prototype.isReactComponent\n )\n}\n\nfunction isForwardRefComponent(Component: any) {\n return !!(\n typeof Component === 'object'\n && Component.$$typeof?.toString() === 'Symbol(react.forward_ref)'\n )\n}\n\nexport interface ReactRendererOptions {\n editor: Editor,\n props?: Record<string, any>,\n as?: string,\n className?: string,\n}\n\ntype ComponentType<R, P> =\n React.ComponentClass<P> |\n React.FunctionComponent<P> |\n React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<R>>;\n\nexport class ReactRenderer<R = unknown, P = unknown> {\n id: string\n\n editor: ExtendedEditor\n\n component: any\n\n element: Element\n\n props: Record<string, any>\n\n reactElement: React.ReactNode\n\n ref: R | null = null\n\n constructor(component: ComponentType<R, P>, {\n editor,\n props = {},\n as = 'div',\n className = '',\n }: ReactRendererOptions) {\n this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString()\n this.component = component\n this.editor = editor as ExtendedEditor\n this.props = props\n this.element = document.createElement(as)\n this.element.classList.add('react-renderer')\n\n if (className) {\n this.element.classList.add(...className.split(' '))\n }\n\n this.render()\n }\n\n render(): void {\n const Component = this.component\n const props = this.props\n\n if (isClassComponent(Component) || isForwardRefComponent(Component)) {\n props.ref = (ref: R) => {\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 {\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererOptions,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Node as ProseMirrorNode } from 'prosemirror-model'\nimport { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'\nimport React from 'react'\n\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\nimport { ReactNodeViewContext, ReactNodeViewContextProps } from './useReactNodeView'\n\nexport interface ReactNodeViewRendererOptions extends NodeViewRendererOptions {\n update:\n | ((props: {\n oldNode: ProseMirrorNode;\n oldDecorations: Decoration[];\n newNode: ProseMirrorNode;\n newDecorations: Decoration[];\n updateProps: () => void;\n }) => boolean)\n | null;\n as?: string;\n className?: string;\n}\n\nclass ReactNodeView extends NodeView<\n React.FunctionComponent,\n Editor,\n 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 Component = this.component\n const onDragStart = this.onDragStart.bind(this)\n const nodeViewContentRef: ReactNodeViewContextProps['nodeViewContentRef'] = element => {\n if (element && this.contentDOMElement && element.firstChild !== this.contentDOMElement) {\n element.appendChild(this.contentDOMElement)\n }\n }\n\n return (\n <ReactNodeViewContext.Provider value={{ onDragStart, nodeViewContentRef }}>\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 let as = this.node.isInline ? 'span' : 'div'\n\n if (this.options.as) {\n as = this.options.as\n }\n\n const { className = '' } = this.options\n\n this.renderer = new ReactRenderer(ReactNodeViewProvider, {\n editor: this.editor,\n props,\n as,\n className: `node-${this.node.type.name} ${className}`.trim(),\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 as HTMLElement\n }\n\n get contentDOM() {\n if (this.node.isLeaf) {\n return null\n }\n\n return this.contentDOMElement\n }\n\n update(node: ProseMirrorNode, decorations: Decoration[]) {\n const updateProps = (props?: Record<string, any>) => {\n this.renderer.updateProps(props)\n }\n\n if (node.type !== this.node.type) {\n return false\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 === 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(\n component: any,\n options?: Partial<ReactNodeViewRendererOptions>,\n): 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 unknown as ProseMirrorNodeView\n }\n}\n","import { EditorOptions } from '@tiptap/core'\nimport { DependencyList, useEffect, useState } from 'react'\n\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 let isMounted = true\n\n const instance = new Editor(options)\n\n setEditor(instance)\n\n instance.on('transaction', () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (isMounted) {\n forceUpdate()\n }\n })\n })\n })\n\n return () => {\n instance.destroy()\n isMounted = false\n }\n }, deps)\n\n return editor\n}\n"],"names":["useState","useEffect","BubbleMenuPlugin","React","CoreEditor","ReactDOM","FloatingMenuPlugin","createContext","useContext","NodeView"],"mappings":"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"}