@tiptap/react 2.0.0-beta.22 → 2.0.0-beta.220
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/README.md +2 -2
- package/dist/index.cjs +409 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +386 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +409 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/packages/react/src/BubbleMenu.d.ts +7 -3
- package/dist/packages/react/src/Editor.d.ts +8 -2
- package/dist/packages/react/src/EditorContent.d.ts +7 -3
- package/dist/packages/react/src/FloatingMenu.d.ts +6 -3
- package/dist/packages/react/src/NodeViewContent.d.ts +1 -1
- package/dist/packages/react/src/NodeViewWrapper.d.ts +1 -1
- package/dist/packages/react/src/ReactNodeViewRenderer.d.ts +13 -7
- package/dist/packages/react/src/ReactRenderer.d.ts +9 -5
- package/dist/packages/react/src/index.d.ts +6 -6
- package/dist/packages/react/src/useEditor.d.ts +2 -1
- package/dist/packages/react/src/useReactNodeView.d.ts +1 -0
- package/package.json +35 -15
- package/src/BubbleMenu.tsx +32 -16
- package/src/Editor.ts +9 -2
- package/src/EditorContent.tsx +61 -18
- package/src/FloatingMenu.tsx +36 -14
- package/src/NodeViewContent.tsx +10 -3
- package/src/NodeViewWrapper.tsx +11 -8
- package/src/ReactNodeViewRenderer.tsx +84 -35
- package/src/ReactRenderer.tsx +35 -25
- package/src/index.ts +6 -6
- package/src/useEditor.ts +16 -4
- package/src/useReactNodeView.ts +1 -0
- package/CHANGELOG.md +0 -198
- package/LICENSE.md +0 -21
- package/dist/tiptap-react.bundle.umd.min.js +0 -54
- package/dist/tiptap-react.bundle.umd.min.js.map +0 -1
- package/dist/tiptap-react.cjs.js +0 -318
- package/dist/tiptap-react.cjs.js.map +0 -1
- package/dist/tiptap-react.esm.js +0 -293
- package/dist/tiptap-react.esm.js.map +0 -1
- package/dist/tiptap-react.umd.js +0 -318
- package/dist/tiptap-react.umd.js.map +0 -1
package/README.md
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
## Introduction
|
|
8
8
|
tiptap is a headless wrapper around [ProseMirror](https://ProseMirror.net) – a toolkit for building rich text WYSIWYG editors, which is already in use at many well-known companies such as *New York Times*, *The Guardian* or *Atlassian*.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Official Documentation
|
|
11
11
|
Documentation can be found on the [tiptap website](https://tiptap.dev).
|
|
12
12
|
|
|
13
13
|
## License
|
|
14
|
-
tiptap is open sourced software licensed under the [MIT license](https://github.com/ueberdosis/tiptap
|
|
14
|
+
tiptap is open sourced software licensed under the [MIT license](https://github.com/ueberdosis/tiptap/blob/main/LICENSE.md).
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var extensionBubbleMenu = require('@tiptap/extension-bubble-menu');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var core = require('@tiptap/core');
|
|
8
|
+
var ReactDOM = require('react-dom');
|
|
9
|
+
var extensionFloatingMenu = require('@tiptap/extension-floating-menu');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
|
+
|
|
13
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
14
|
+
var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
|
|
15
|
+
|
|
16
|
+
const BubbleMenu = (props) => {
|
|
17
|
+
const [element, setElement] = React.useState(null);
|
|
18
|
+
React.useEffect(() => {
|
|
19
|
+
if (!element) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (props.editor.isDestroyed) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const { pluginKey = 'bubbleMenu', editor, tippyOptions = {}, updateDelay, shouldShow = null, } = props;
|
|
26
|
+
const plugin = extensionBubbleMenu.BubbleMenuPlugin({
|
|
27
|
+
updateDelay,
|
|
28
|
+
editor,
|
|
29
|
+
element,
|
|
30
|
+
pluginKey,
|
|
31
|
+
shouldShow,
|
|
32
|
+
tippyOptions,
|
|
33
|
+
});
|
|
34
|
+
editor.registerPlugin(plugin);
|
|
35
|
+
return () => editor.unregisterPlugin(pluginKey);
|
|
36
|
+
}, [props.editor, element]);
|
|
37
|
+
return (React__default["default"].createElement("div", { ref: setElement, className: props.className, style: { visibility: 'hidden' } }, props.children));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
class Editor extends core.Editor {
|
|
41
|
+
constructor() {
|
|
42
|
+
super(...arguments);
|
|
43
|
+
this.contentComponent = null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const Portals = ({ renderers }) => {
|
|
48
|
+
return (React__default["default"].createElement(React__default["default"].Fragment, null, Object.entries(renderers).map(([key, renderer]) => {
|
|
49
|
+
return ReactDOM__default["default"].createPortal(renderer.reactElement, renderer.element, key);
|
|
50
|
+
})));
|
|
51
|
+
};
|
|
52
|
+
class PureEditorContent extends React__default["default"].Component {
|
|
53
|
+
constructor(props) {
|
|
54
|
+
super(props);
|
|
55
|
+
this.editorContentRef = React__default["default"].createRef();
|
|
56
|
+
this.initialized = false;
|
|
57
|
+
this.state = {
|
|
58
|
+
renderers: {},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
componentDidMount() {
|
|
62
|
+
this.init();
|
|
63
|
+
}
|
|
64
|
+
componentDidUpdate() {
|
|
65
|
+
this.init();
|
|
66
|
+
}
|
|
67
|
+
init() {
|
|
68
|
+
const { editor } = this.props;
|
|
69
|
+
if (editor && editor.options.element) {
|
|
70
|
+
if (editor.contentComponent) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const element = this.editorContentRef.current;
|
|
74
|
+
element.append(...editor.options.element.childNodes);
|
|
75
|
+
editor.setOptions({
|
|
76
|
+
element,
|
|
77
|
+
});
|
|
78
|
+
editor.contentComponent = this;
|
|
79
|
+
editor.createNodeViews();
|
|
80
|
+
this.initialized = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
maybeFlushSync(fn) {
|
|
84
|
+
// Avoid calling flushSync until the editor is initialized.
|
|
85
|
+
// Initialization happens during the componentDidMount or componentDidUpdate
|
|
86
|
+
// lifecycle methods, and React doesn't allow calling flushSync from inside
|
|
87
|
+
// a lifecycle method.
|
|
88
|
+
if (this.initialized) {
|
|
89
|
+
queueMicrotask(() => {
|
|
90
|
+
ReactDOM.flushSync(fn);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
fn();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
setRenderer(id, renderer) {
|
|
98
|
+
this.maybeFlushSync(() => {
|
|
99
|
+
this.setState(({ renderers }) => ({
|
|
100
|
+
renderers: {
|
|
101
|
+
...renderers,
|
|
102
|
+
[id]: renderer,
|
|
103
|
+
},
|
|
104
|
+
}));
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
removeRenderer(id) {
|
|
108
|
+
this.maybeFlushSync(() => {
|
|
109
|
+
this.setState(({ renderers }) => {
|
|
110
|
+
const nextRenderers = { ...renderers };
|
|
111
|
+
delete nextRenderers[id];
|
|
112
|
+
return { renderers: nextRenderers };
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
componentWillUnmount() {
|
|
117
|
+
const { editor } = this.props;
|
|
118
|
+
if (!editor) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
this.initialized = false;
|
|
122
|
+
if (!editor.isDestroyed) {
|
|
123
|
+
editor.view.setProps({
|
|
124
|
+
nodeViews: {},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
editor.contentComponent = null;
|
|
128
|
+
if (!editor.options.element.firstChild) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const newElement = document.createElement('div');
|
|
132
|
+
newElement.append(...editor.options.element.childNodes);
|
|
133
|
+
editor.setOptions({
|
|
134
|
+
element: newElement,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
render() {
|
|
138
|
+
const { editor, ...rest } = this.props;
|
|
139
|
+
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
140
|
+
React__default["default"].createElement("div", { ref: this.editorContentRef, ...rest }),
|
|
141
|
+
React__default["default"].createElement(Portals, { renderers: this.state.renderers })));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const EditorContent = React__default["default"].memo(PureEditorContent);
|
|
145
|
+
|
|
146
|
+
const FloatingMenu = (props) => {
|
|
147
|
+
const [element, setElement] = React.useState(null);
|
|
148
|
+
React.useEffect(() => {
|
|
149
|
+
if (!element) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (props.editor.isDestroyed) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const { pluginKey = 'floatingMenu', editor, tippyOptions = {}, shouldShow = null, } = props;
|
|
156
|
+
const plugin = extensionFloatingMenu.FloatingMenuPlugin({
|
|
157
|
+
pluginKey,
|
|
158
|
+
editor,
|
|
159
|
+
element,
|
|
160
|
+
tippyOptions,
|
|
161
|
+
shouldShow,
|
|
162
|
+
});
|
|
163
|
+
editor.registerPlugin(plugin);
|
|
164
|
+
return () => editor.unregisterPlugin(pluginKey);
|
|
165
|
+
}, [
|
|
166
|
+
props.editor,
|
|
167
|
+
element,
|
|
168
|
+
]);
|
|
169
|
+
return (React__default["default"].createElement("div", { ref: setElement, className: props.className, style: { visibility: 'hidden' } }, props.children));
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const ReactNodeViewContext = React.createContext({
|
|
173
|
+
onDragStart: undefined,
|
|
174
|
+
});
|
|
175
|
+
const useReactNodeView = () => React.useContext(ReactNodeViewContext);
|
|
176
|
+
|
|
177
|
+
const NodeViewContent = props => {
|
|
178
|
+
const Tag = props.as || 'div';
|
|
179
|
+
const { nodeViewContentRef } = useReactNodeView();
|
|
180
|
+
return (React__default["default"].createElement(Tag, { ...props, ref: nodeViewContentRef, "data-node-view-content": "", style: {
|
|
181
|
+
whiteSpace: 'pre-wrap',
|
|
182
|
+
...props.style,
|
|
183
|
+
} }));
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const NodeViewWrapper = React__default["default"].forwardRef((props, ref) => {
|
|
187
|
+
const { onDragStart } = useReactNodeView();
|
|
188
|
+
const Tag = props.as || 'div';
|
|
189
|
+
return (React__default["default"].createElement(Tag, { ...props, ref: ref, "data-node-view-wrapper": "", onDragStart: onDragStart, style: {
|
|
190
|
+
whiteSpace: 'normal',
|
|
191
|
+
...props.style,
|
|
192
|
+
} }));
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
function isClassComponent(Component) {
|
|
196
|
+
return !!(typeof Component === 'function'
|
|
197
|
+
&& Component.prototype
|
|
198
|
+
&& Component.prototype.isReactComponent);
|
|
199
|
+
}
|
|
200
|
+
function isForwardRefComponent(Component) {
|
|
201
|
+
var _a;
|
|
202
|
+
return !!(typeof Component === 'object'
|
|
203
|
+
&& ((_a = Component.$$typeof) === null || _a === void 0 ? void 0 : _a.toString()) === 'Symbol(react.forward_ref)');
|
|
204
|
+
}
|
|
205
|
+
class ReactRenderer {
|
|
206
|
+
constructor(component, { editor, props = {}, as = 'div', className = '', }) {
|
|
207
|
+
this.ref = null;
|
|
208
|
+
this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString();
|
|
209
|
+
this.component = component;
|
|
210
|
+
this.editor = editor;
|
|
211
|
+
this.props = props;
|
|
212
|
+
this.element = document.createElement(as);
|
|
213
|
+
this.element.classList.add('react-renderer');
|
|
214
|
+
if (className) {
|
|
215
|
+
this.element.classList.add(...className.split(' '));
|
|
216
|
+
}
|
|
217
|
+
this.render();
|
|
218
|
+
}
|
|
219
|
+
render() {
|
|
220
|
+
var _a, _b;
|
|
221
|
+
const Component = this.component;
|
|
222
|
+
const props = this.props;
|
|
223
|
+
if (isClassComponent(Component) || isForwardRefComponent(Component)) {
|
|
224
|
+
props.ref = (ref) => {
|
|
225
|
+
this.ref = ref;
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
this.reactElement = React__default["default"].createElement(Component, { ...props });
|
|
229
|
+
(_b = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.contentComponent) === null || _b === void 0 ? void 0 : _b.setRenderer(this.id, this);
|
|
230
|
+
}
|
|
231
|
+
updateProps(props = {}) {
|
|
232
|
+
this.props = {
|
|
233
|
+
...this.props,
|
|
234
|
+
...props,
|
|
235
|
+
};
|
|
236
|
+
this.render();
|
|
237
|
+
}
|
|
238
|
+
destroy() {
|
|
239
|
+
var _a, _b;
|
|
240
|
+
(_b = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.contentComponent) === null || _b === void 0 ? void 0 : _b.removeRenderer(this.id);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
class ReactNodeView extends core.NodeView {
|
|
245
|
+
mount() {
|
|
246
|
+
const props = {
|
|
247
|
+
editor: this.editor,
|
|
248
|
+
node: this.node,
|
|
249
|
+
decorations: this.decorations,
|
|
250
|
+
selected: false,
|
|
251
|
+
extension: this.extension,
|
|
252
|
+
getPos: () => this.getPos(),
|
|
253
|
+
updateAttributes: (attributes = {}) => this.updateAttributes(attributes),
|
|
254
|
+
deleteNode: () => this.deleteNode(),
|
|
255
|
+
};
|
|
256
|
+
if (!this.component.displayName) {
|
|
257
|
+
const capitalizeFirstChar = (string) => {
|
|
258
|
+
return string.charAt(0).toUpperCase() + string.substring(1);
|
|
259
|
+
};
|
|
260
|
+
this.component.displayName = capitalizeFirstChar(this.extension.name);
|
|
261
|
+
}
|
|
262
|
+
const ReactNodeViewProvider = componentProps => {
|
|
263
|
+
const Component = this.component;
|
|
264
|
+
const onDragStart = this.onDragStart.bind(this);
|
|
265
|
+
const nodeViewContentRef = element => {
|
|
266
|
+
if (element && this.contentDOMElement && element.firstChild !== this.contentDOMElement) {
|
|
267
|
+
element.appendChild(this.contentDOMElement);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
return (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
271
|
+
React__default["default"].createElement(ReactNodeViewContext.Provider, { value: { onDragStart, nodeViewContentRef } },
|
|
272
|
+
React__default["default"].createElement(Component, { ...componentProps }))));
|
|
273
|
+
};
|
|
274
|
+
ReactNodeViewProvider.displayName = 'ReactNodeView';
|
|
275
|
+
this.contentDOMElement = this.node.isLeaf
|
|
276
|
+
? null
|
|
277
|
+
: document.createElement(this.node.isInline ? 'span' : 'div');
|
|
278
|
+
if (this.contentDOMElement) {
|
|
279
|
+
// For some reason the whiteSpace prop is not inherited properly in Chrome and Safari
|
|
280
|
+
// With this fix it seems to work fine
|
|
281
|
+
// See: https://github.com/ueberdosis/tiptap/issues/1197
|
|
282
|
+
this.contentDOMElement.style.whiteSpace = 'inherit';
|
|
283
|
+
}
|
|
284
|
+
let as = this.node.isInline ? 'span' : 'div';
|
|
285
|
+
if (this.options.as) {
|
|
286
|
+
as = this.options.as;
|
|
287
|
+
}
|
|
288
|
+
const { className = '' } = this.options;
|
|
289
|
+
this.renderer = new ReactRenderer(ReactNodeViewProvider, {
|
|
290
|
+
editor: this.editor,
|
|
291
|
+
props,
|
|
292
|
+
as,
|
|
293
|
+
className: `node-${this.node.type.name} ${className}`.trim(),
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
get dom() {
|
|
297
|
+
var _a;
|
|
298
|
+
if (this.renderer.element.firstElementChild
|
|
299
|
+
&& !((_a = this.renderer.element.firstElementChild) === null || _a === void 0 ? void 0 : _a.hasAttribute('data-node-view-wrapper'))) {
|
|
300
|
+
throw Error('Please use the NodeViewWrapper component for your node view.');
|
|
301
|
+
}
|
|
302
|
+
return this.renderer.element;
|
|
303
|
+
}
|
|
304
|
+
get contentDOM() {
|
|
305
|
+
if (this.node.isLeaf) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
return this.contentDOMElement;
|
|
309
|
+
}
|
|
310
|
+
update(node, decorations) {
|
|
311
|
+
const updateProps = (props) => {
|
|
312
|
+
this.renderer.updateProps(props);
|
|
313
|
+
};
|
|
314
|
+
if (node.type !== this.node.type) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
if (typeof this.options.update === 'function') {
|
|
318
|
+
const oldNode = this.node;
|
|
319
|
+
const oldDecorations = this.decorations;
|
|
320
|
+
this.node = node;
|
|
321
|
+
this.decorations = decorations;
|
|
322
|
+
return this.options.update({
|
|
323
|
+
oldNode,
|
|
324
|
+
oldDecorations,
|
|
325
|
+
newNode: node,
|
|
326
|
+
newDecorations: decorations,
|
|
327
|
+
updateProps: () => updateProps({ node, decorations }),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (node === this.node && this.decorations === decorations) {
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
this.node = node;
|
|
334
|
+
this.decorations = decorations;
|
|
335
|
+
updateProps({ node, decorations });
|
|
336
|
+
return true;
|
|
337
|
+
}
|
|
338
|
+
selectNode() {
|
|
339
|
+
this.renderer.updateProps({
|
|
340
|
+
selected: true,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
deselectNode() {
|
|
344
|
+
this.renderer.updateProps({
|
|
345
|
+
selected: false,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
destroy() {
|
|
349
|
+
this.renderer.destroy();
|
|
350
|
+
this.contentDOMElement = null;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function ReactNodeViewRenderer(component, options) {
|
|
354
|
+
return (props) => {
|
|
355
|
+
// try to get the parent component
|
|
356
|
+
// this is important for vue devtools to show the component hierarchy correctly
|
|
357
|
+
// maybe it’s `undefined` because <editor-content> isn’t rendered yet
|
|
358
|
+
if (!props.editor.contentComponent) {
|
|
359
|
+
return {};
|
|
360
|
+
}
|
|
361
|
+
return new ReactNodeView(component, props, options);
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function useForceUpdate() {
|
|
366
|
+
const [, setValue] = React.useState(0);
|
|
367
|
+
return () => setValue(value => value + 1);
|
|
368
|
+
}
|
|
369
|
+
const useEditor = (options = {}, deps = []) => {
|
|
370
|
+
const [editor, setEditor] = React.useState(null);
|
|
371
|
+
const forceUpdate = useForceUpdate();
|
|
372
|
+
React.useEffect(() => {
|
|
373
|
+
let isMounted = true;
|
|
374
|
+
const instance = new Editor(options);
|
|
375
|
+
setEditor(instance);
|
|
376
|
+
instance.on('transaction', () => {
|
|
377
|
+
requestAnimationFrame(() => {
|
|
378
|
+
requestAnimationFrame(() => {
|
|
379
|
+
if (isMounted) {
|
|
380
|
+
forceUpdate();
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
return () => {
|
|
386
|
+
instance.destroy();
|
|
387
|
+
isMounted = false;
|
|
388
|
+
};
|
|
389
|
+
}, deps);
|
|
390
|
+
return editor;
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
exports.BubbleMenu = BubbleMenu;
|
|
394
|
+
exports.Editor = Editor;
|
|
395
|
+
exports.EditorContent = EditorContent;
|
|
396
|
+
exports.FloatingMenu = FloatingMenu;
|
|
397
|
+
exports.NodeViewContent = NodeViewContent;
|
|
398
|
+
exports.NodeViewWrapper = NodeViewWrapper;
|
|
399
|
+
exports.PureEditorContent = PureEditorContent;
|
|
400
|
+
exports.ReactNodeViewRenderer = ReactNodeViewRenderer;
|
|
401
|
+
exports.ReactRenderer = ReactRenderer;
|
|
402
|
+
exports.useEditor = useEditor;
|
|
403
|
+
Object.keys(core).forEach(function (k) {
|
|
404
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
405
|
+
enumerable: true,
|
|
406
|
+
get: function () { return core[k]; }
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","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, { useEffect, useState } 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 updateDelay?: number;\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', editor, tippyOptions = {}, updateDelay, shouldShow = null,\n } = props\n\n const plugin = BubbleMenuPlugin({\n updateDelay,\n editor,\n element,\n pluginKey,\n shouldShow,\n tippyOptions,\n })\n\n editor.registerPlugin(plugin)\n return () => editor.unregisterPlugin(pluginKey)\n }, [props.editor, element])\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'\nimport { ReactRenderer } from './ReactRenderer'\n\ntype ContentComponent = React.Component<EditorContentProps, EditorContentState> & {\n setRenderer(id: string, renderer: ReactRenderer): void;\n removeRenderer(id: string): void;\n}\n\nexport class Editor extends CoreEditor {\n public contentComponent: ContentComponent | null = null\n}\n","import React, { HTMLProps } from 'react'\nimport ReactDOM, { flushSync } from 'react-dom'\n\nimport { Editor } from './Editor'\nimport { ReactRenderer } from './ReactRenderer'\n\nconst Portals: React.FC<{ renderers: Record<string, ReactRenderer> }> = ({ renderers }) => {\n return (\n <>\n {Object.entries(renderers).map(([key, renderer]) => {\n return ReactDOM.createPortal(renderer.reactElement, renderer.element, key)\n })}\n </>\n )\n}\n\nexport interface EditorContentProps extends HTMLProps<HTMLDivElement> {\n editor: Editor | null;\n}\n\nexport interface EditorContentState {\n renderers: Record<string, ReactRenderer>;\n}\n\nexport class PureEditorContent extends React.Component<EditorContentProps, EditorContentState> {\n editorContentRef: React.RefObject<any>\n\n initialized: boolean\n\n constructor(props: EditorContentProps) {\n super(props)\n this.editorContentRef = React.createRef()\n this.initialized = false\n\n this.state = {\n renderers: {},\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 this.initialized = true\n }\n }\n\n maybeFlushSync(fn: () => void) {\n // Avoid calling flushSync until the editor is initialized.\n // Initialization happens during the componentDidMount or componentDidUpdate\n // lifecycle methods, and React doesn't allow calling flushSync from inside\n // a lifecycle method.\n if (this.initialized) {\n queueMicrotask(() => {\n flushSync(fn)\n })\n } else {\n fn()\n }\n }\n\n setRenderer(id: string, renderer: ReactRenderer) {\n this.maybeFlushSync(() => {\n this.setState(({ renderers }) => ({\n renderers: {\n ...renderers,\n [id]: renderer,\n },\n }))\n })\n }\n\n removeRenderer(id: string) {\n this.maybeFlushSync(() => {\n this.setState(({ renderers }) => {\n const nextRenderers = { ...renderers }\n\n delete nextRenderers[id]\n\n return { renderers: nextRenderers }\n })\n })\n }\n\n componentWillUnmount() {\n const { editor } = this.props\n\n if (!editor) {\n return\n }\n\n this.initialized = false\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 {/* @ts-ignore */}\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 this.editor?.contentComponent?.setRenderer(this.id, this)\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 this.editor?.contentComponent?.removeRenderer(this.id)\n }\n}\n","import {\n DecorationWithType,\n NodeView,\n NodeViewProps,\n NodeViewRenderer,\n NodeViewRendererOptions,\n NodeViewRendererProps,\n} from '@tiptap/core'\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Decoration, NodeView as ProseMirrorNodeView } from '@tiptap/pm/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 <>\n {/* @ts-ignore */}\n <ReactNodeViewContext.Provider value={{ onDragStart, nodeViewContentRef }}>\n {/* @ts-ignore */}\n <Component {...componentProps} />\n </ReactNodeViewContext.Provider>\n </>\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: DecorationWithType[]) {\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","flushSync","FloatingMenuPlugin","createContext","useContext","NodeView"],"mappings":"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"}
|