@prosekit/react 0.3.10 → 0.3.12

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.
@@ -13,10 +13,6 @@ import { BlockDragHandleProps } from '@prosekit/web/block-handle';
13
13
  import { BlockPopoverElement } from '@prosekit/web/block-handle';
14
14
  import { BlockPopoverProps } from '@prosekit/web/block-handle';
15
15
  import { ComponentType } from 'react';
16
- import { Context } from 'react';
17
- import { CoreNodeView } from '@prosemirror-adapter/core';
18
- import type { CoreNodeViewSpec } from '@prosemirror-adapter/core';
19
- import type { CoreNodeViewUserOptions } from '@prosemirror-adapter/core';
20
16
  import type { Decoration } from '@prosekit/pm/view';
21
17
  import type { DecorationSource } from '@prosekit/pm/view';
22
18
  import { config as default_alias_1 } from '@prosekit/dev/config-vitest';
@@ -24,15 +20,12 @@ import { Editor } from '@prosekit/core';
24
20
  import type { EditorState } from '@prosekit/pm/state';
25
21
  import type { EditorView } from '@prosekit/pm/view';
26
22
  import { Extension } from '@prosekit/core';
27
- import { ExtensionTyping } from '@prosekit/core';
28
23
  import { FC } from 'react';
29
24
  import { ForwardRefExoticComponent } from 'react';
30
25
  import { HTMLAttributes } from 'react';
31
26
  import { InlinePopoverElement } from '@prosekit/web/inline-popover';
32
27
  import { InlinePopoverProps } from '@prosekit/web/inline-popover';
33
28
  import { Keymap } from '@prosekit/core';
34
- import type { Node as Node_2 } from '@prosekit/pm/model';
35
- import type { NodeViewConstructor } from '@prosekit/pm/view';
36
29
  import { Options } from 'tsup';
37
30
  import { PopoverContentElement } from '@prosekit/web/popover';
38
31
  import { PopoverContentProps } from '@prosekit/web/popover';
@@ -44,7 +37,6 @@ import { Priority } from '@prosekit/core';
44
37
  import type { ProseMirrorNode } from '@prosekit/pm/model';
45
38
  import { Provider } from 'react';
46
39
  import { ReactNode } from 'react';
47
- import { ReactPortal } from 'react';
48
40
  import { RefAttributes } from 'react';
49
41
  import { ResizableHandleElement } from '@prosekit/web/resizable';
50
42
  import { ResizableHandleProps } from '@prosekit/web/resizable';
@@ -83,12 +75,6 @@ export { BlockPopover as BlockPopover_alias_1 }
83
75
 
84
76
  export declare function createComponent<Props extends object, CustomElement extends HTMLElement>(tagName: string, displayName: string, defaultProps: Props): ForwardRefExoticComponent<Partial<Props> & RefAttributes<CustomElement> & HTMLAttributes<CustomElement>>;
85
77
 
86
- export declare const createNodeViewContext: Context<NodeViewFactory | null>;
87
-
88
- declare type CreateReactNodeView = ReturnType<typeof useReactNodeViewCreator>;
89
- export { CreateReactNodeView }
90
- export { CreateReactNodeView as CreateReactNodeView_alias_1 }
91
-
92
78
  export declare const default_alias: Options | Options[] | ((overrideOptions: Options) => Options | Options[] | Promise<Options | Options[]>);
93
79
 
94
80
  export { default_alias_1 }
@@ -102,11 +88,6 @@ declare function defineReactNodeView(options: ReactNodeViewOptions): Extension;
102
88
  export { defineReactNodeView }
103
89
  export { defineReactNodeView as defineReactNodeView_alias_1 }
104
90
 
105
- /**
106
- * @internal
107
- */
108
- export declare function defineReactNodeViewFactory(nodeViewFactory: NodeViewFactory): Extension<ExtensionTyping<any, any, any>>;
109
-
110
91
  /**
111
92
  * @internal
112
93
  */
@@ -116,8 +97,6 @@ declare const InlinePopover: ForwardRefExoticComponent<Partial<InlinePopoverProp
116
97
  export { InlinePopover }
117
98
  export { InlinePopover as InlinePopover_alias_1 }
118
99
 
119
- export declare type NodeViewFactory = (options: ReactNodeViewUserOptions) => NodeViewConstructor;
120
-
121
100
  declare const PopoverContent: ForwardRefExoticComponent<Partial<PopoverContentProps> & RefAttributes<PopoverContentElement> & HTMLAttributes<PopoverContentElement>>;
122
101
  export { PopoverContent }
123
102
  export { PopoverContent as PopoverContent_alias_1 }
@@ -155,13 +134,6 @@ declare interface ProseKitProps {
155
134
  export { ProseKitProps }
156
135
  export { ProseKitProps as ProseKitProps_alias_1 }
157
136
 
158
- export declare class ReactNodeView extends CoreNodeView<ReactNodeViewComponent> implements ReactRenderer<ReactNodeViewProps> {
159
- key: string;
160
- context: ReactNodeViewProps;
161
- updateContext: () => void;
162
- render: () => ReactPortal;
163
- }
164
-
165
137
  /**
166
138
  * @public
167
139
  */
@@ -195,7 +167,7 @@ declare interface ReactNodeViewProps {
195
167
  view: EditorView;
196
168
  getPos: () => number | undefined;
197
169
  setAttrs: (attrs: Attrs) => void;
198
- node: Node_2;
170
+ node: ProseMirrorNode;
199
171
  selected: boolean;
200
172
  decorations: readonly Decoration[];
201
173
  innerDecorations: DecorationSource;
@@ -203,31 +175,11 @@ declare interface ReactNodeViewProps {
203
175
  export { ReactNodeViewProps }
204
176
  export { ReactNodeViewProps as ReactNodeViewProps_alias_1 }
205
177
 
206
- export declare type ReactNodeViewSpec = CoreNodeViewSpec<ReactNodeViewComponent>;
207
-
208
- export declare type ReactNodeViewUserOptions = CoreNodeViewUserOptions<ReactNodeViewComponent>;
209
-
210
- export declare interface ReactRenderer<Context> {
211
- key: string;
212
- context: Context;
213
- render: () => ReactPortal;
214
- updateContext: () => void;
215
- }
216
-
217
- export declare interface ReactRendererResult {
218
- readonly portals: Record<string, ReactPortal>;
219
- readonly renderReactRenderer: (nodeView: ReactRenderer<unknown>, update?: boolean) => void;
220
- readonly removeReactRenderer: (nodeView: ReactRenderer<unknown>) => void;
221
- }
222
-
178
+ /**
179
+ * @internal
180
+ */
223
181
  export declare const ReactViewsConsumer: FC;
224
182
 
225
- declare const ReactViewsProvider: FC<{
226
- children: ReactNode;
227
- }>;
228
- export { ReactViewsProvider }
229
- export { ReactViewsProvider as ReactViewsProvider_alias_1 }
230
-
231
183
  declare const ResizableHandle: ForwardRefExoticComponent<Partial<ResizableHandleProps> & RefAttributes<ResizableHandleElement> & HTMLAttributes<ResizableHandleElement>>;
232
184
  export { ResizableHandle }
233
185
  export { ResizableHandle as ResizableHandle_alias_1 }
@@ -314,17 +266,11 @@ declare function useKeymap(keymap: Keymap, options?: UseExtensionOptions): void;
314
266
  export { useKeymap }
315
267
  export { useKeymap as useKeymap_alias_1 }
316
268
 
317
- export declare function useNodeViewFactory(): NodeViewFactory;
318
-
319
269
  /**
320
270
  * @internal
321
271
  */
322
272
  export declare function usePriorityExtension<T extends Extension = Extension>(extension: T | null, priority?: Priority | null): T | null;
323
273
 
324
- export declare function useReactNodeViewCreator(renderReactRenderer: ReactRendererResult['renderReactRenderer'], removeReactRenderer: ReactRendererResult['removeReactRenderer']): (options: ReactNodeViewUserOptions) => NodeViewConstructor;
325
-
326
- export declare function useReactRenderer(): ReactRendererResult;
327
-
328
274
  /**
329
275
  * Calls the given handler whenever the editor state changes.
330
276
  *
@@ -1,13 +1,13 @@
1
1
  export { ProseKit } from './_tsup-dts-rollup';
2
2
  export { ProseKitProps } from './_tsup-dts-rollup';
3
3
  export { defineReactNodeView } from './_tsup-dts-rollup';
4
+ export { ReactNodeViewComponent } from './_tsup-dts-rollup';
4
5
  export { ReactNodeViewOptions } from './_tsup-dts-rollup';
6
+ export { ReactNodeViewProps } from './_tsup-dts-rollup';
7
+ export { useDocChange } from './_tsup-dts-rollup';
5
8
  export { useEditor } from './_tsup-dts-rollup';
6
9
  export { useExtension } from './_tsup-dts-rollup';
7
10
  export { UseExtensionOptions } from './_tsup-dts-rollup';
8
11
  export { useKeymap } from './_tsup-dts-rollup';
9
12
  export { useStateUpdate } from './_tsup-dts-rollup';
10
- export { useDocChange } from './_tsup-dts-rollup';
11
13
  export { PropsWithClassName } from './_tsup-dts-rollup';
12
- export { ReactNodeViewComponent } from './_tsup-dts-rollup';
13
- export { ReactNodeViewProps } from './_tsup-dts-rollup';
@@ -5,29 +5,19 @@ import {
5
5
 
6
6
  // src/components/prosekit.ts
7
7
  import "@prosekit/core";
8
- import { createElement as createElement3 } from "react";
9
-
10
- // src/views/react-views-consumer.ts
11
- import { useMemo as useMemo2 } from "react";
8
+ import { ProsemirrorAdapterProvider } from "@prosemirror-adapter/react";
9
+ import { createElement as createElement2 } from "react";
12
10
 
13
11
  // src/extensions/react-node-view.ts
14
12
  import {
13
+ defineNodeViewComponent,
15
14
  defineNodeViewFactory
16
15
  } from "@prosekit/core";
17
- function defineReactNodeView(options) {
18
- let { name, ...userOptions } = options;
19
- return defineNodeViewFactory({
20
- group: "react",
21
- name,
22
- args: userOptions
23
- });
24
- }
25
- function defineReactNodeViewFactory(nodeViewFactory) {
26
- return defineNodeViewFactory({
27
- group: "react",
28
- factory: nodeViewFactory
29
- });
30
- }
16
+ import {
17
+ useNodeViewContext,
18
+ useNodeViewFactory
19
+ } from "@prosemirror-adapter/react";
20
+ import { createElement, useMemo as useMemo2 } from "react";
31
21
 
32
22
  // src/hooks/use-extension.ts
33
23
  import "@prosekit/core";
@@ -60,18 +50,13 @@ function useExtension(extension, options) {
60
50
  );
61
51
  }
62
52
 
63
- // src/views/node-view/node-view-context.ts
64
- import { ProseKitError } from "@prosekit/core";
65
- import { createContext, useContext } from "react";
66
- var createNodeViewContext = createContext(null);
67
- function useNodeViewFactory() {
68
- let nodeViewFactory = useContext(createNodeViewContext);
69
- if (!nodeViewFactory)
70
- throw new ProseKitError("Cannot find node view factory context.");
71
- return nodeViewFactory;
53
+ // src/extensions/react-node-view.ts
54
+ function withNodeViewProps(component) {
55
+ return function() {
56
+ let props = useNodeViewContext();
57
+ return createElement(component, props);
58
+ };
72
59
  }
73
-
74
- // src/views/react-views-consumer.ts
75
60
  var ReactViewsConsumer = () => {
76
61
  let nodeViewFactory = useNodeViewFactory(), extension = useMemo2(
77
62
  () => defineReactNodeViewFactory(nodeViewFactory),
@@ -79,177 +64,67 @@ var ReactViewsConsumer = () => {
79
64
  );
80
65
  return useExtension(extension), null;
81
66
  };
82
-
83
- // src/views/react-views-provider.ts
84
- import { createElement as createElement2, useMemo as useMemo3 } from "react";
85
-
86
- // src/views/node-view/use-react-node-view-creator.ts
87
- import { useCallback } from "react";
88
-
89
- // src/views/node-view/react-node-view.ts
90
- import { _getId } from "@prosekit/core";
91
- import { CoreNodeView } from "@prosemirror-adapter/core";
92
- import { createElement } from "react";
93
- import { createPortal } from "react-dom";
94
- var ReactNodeView = class extends CoreNodeView {
95
- constructor() {
96
- super(...arguments);
97
- this.key = _getId();
98
- this.context = {
99
- contentRef: (element) => {
100
- element && this.contentDOM && element.firstChild !== this.contentDOM && element.appendChild(this.contentDOM);
101
- },
102
- view: this.view,
103
- getPos: this.getPos,
104
- setAttrs: this.setAttrs,
105
- node: this.node,
106
- selected: this.selected,
107
- decorations: this.decorations,
108
- innerDecorations: this.innerDecorations
109
- };
110
- this.updateContext = () => {
111
- Object.assign(this.context, {
112
- node: this.node,
113
- selected: this.selected,
114
- decorations: this.decorations,
115
- innerDecorations: this.innerDecorations
116
- });
117
- };
118
- this.render = () => {
119
- let UserComponent = this.component;
120
- return createPortal(
121
- createElement(UserComponent, this.context),
122
- this.dom,
123
- this.key
124
- );
125
- };
126
- }
127
- };
128
-
129
- // src/views/node-view/use-react-node-view-creator.ts
130
- function useReactNodeViewCreator(renderReactRenderer, removeReactRenderer) {
131
- return useCallback(
132
- (options) => (node, view, getPos, decorations, innerDecorations) => {
133
- let nodeView = new ReactNodeView({
134
- node,
135
- view,
136
- getPos,
137
- decorations,
138
- innerDecorations,
139
- options: {
140
- ...options,
141
- onUpdate() {
142
- var _a;
143
- (_a = options.onUpdate) == null || _a.call(options), renderReactRenderer(nodeView);
144
- },
145
- selectNode() {
146
- var _a;
147
- (_a = options.selectNode) == null || _a.call(options), renderReactRenderer(nodeView);
148
- },
149
- deselectNode() {
150
- var _a;
151
- (_a = options.deselectNode) == null || _a.call(options), renderReactRenderer(nodeView);
152
- },
153
- destroy() {
154
- var _a;
155
- (_a = options.destroy) == null || _a.call(options), removeReactRenderer(nodeView);
156
- }
157
- }
158
- });
159
- return renderReactRenderer(nodeView, !1), nodeView;
160
- },
161
- [removeReactRenderer, renderReactRenderer]
162
- );
163
- }
164
-
165
- // src/views/react-renderer.ts
166
- import { useCallback as useCallback2, useEffect as useEffect2, useRef, useState } from "react";
167
- import { flushSync } from "react-dom";
168
- function useReactRenderer() {
169
- let [portals, setPortals] = useState({}), mountedRef = useRef(!1);
170
- useEffect2(() => (requestAnimationFrame(() => {
171
- mountedRef.current = !0;
172
- }), () => {
173
- mountedRef.current = !1;
174
- }), []);
175
- let maybeFlushSync = useCallback2((fn) => {
176
- mountedRef.current ? flushSync(fn) : fn();
177
- }, []), renderReactRenderer = useCallback2(
178
- (nodeView, update = !0) => {
179
- maybeFlushSync(() => {
180
- update && nodeView.updateContext(), setPortals((prev) => ({
181
- ...prev,
182
- [nodeView.key]: nodeView.render()
183
- }));
184
- });
185
- },
186
- [maybeFlushSync]
187
- ), removeReactRenderer = useCallback2(
188
- (nodeView) => {
189
- maybeFlushSync(() => {
190
- setPortals((prev) => {
191
- let next = { ...prev };
192
- return delete next[nodeView.key], next;
193
- });
194
- });
195
- },
196
- [maybeFlushSync]
197
- );
198
- return {
199
- portals,
200
- renderReactRenderer,
201
- removeReactRenderer
67
+ function defineReactNodeView(options) {
68
+ let { name, component, ...userOptions } = options, args = {
69
+ ...userOptions,
70
+ component: withNodeViewProps(component)
202
71
  };
72
+ return defineNodeViewComponent({
73
+ group: "react",
74
+ name,
75
+ args
76
+ });
77
+ }
78
+ function defineReactNodeViewFactory(factory) {
79
+ return defineNodeViewFactory({
80
+ group: "react",
81
+ factory
82
+ });
203
83
  }
204
-
205
- // src/views/react-views-provider.ts
206
- var ReactViewsProvider = ({
207
- children
208
- }) => {
209
- let { renderReactRenderer, removeReactRenderer, portals } = useReactRenderer(), createReactNodeView = useReactNodeViewCreator(
210
- renderReactRenderer,
211
- removeReactRenderer
212
- ), memoizedPortals = useMemo3(() => Object.values(portals), [portals]);
213
- return createElement2(
214
- createNodeViewContext.Provider,
215
- { value: createReactNodeView },
216
- children,
217
- memoizedPortals
218
- );
219
- };
220
84
 
221
85
  // src/components/prosekit.ts
222
86
  var ProseKit = (props) => {
223
87
  let { editor, children } = props;
224
- return createElement3(
225
- ReactViewsProvider,
88
+ return createElement2(
89
+ ProsemirrorAdapterProvider,
226
90
  null,
227
- createElement3(
91
+ createElement2(
228
92
  EditorContextProvider,
229
93
  { value: editor },
230
- createElement3(ReactViewsConsumer),
94
+ createElement2(ReactViewsConsumer),
231
95
  children
232
96
  )
233
97
  );
234
98
  };
235
99
 
100
+ // src/hooks/use-doc-change.ts
101
+ import { defineDocChangeHandler } from "@prosekit/core";
102
+ import { useMemo as useMemo3 } from "react";
103
+ function useDocChange(handler, options) {
104
+ let extension = useMemo3(
105
+ () => defineDocChangeHandler((view) => handler(view.state.doc)),
106
+ [handler]
107
+ );
108
+ return useExtension(extension, options);
109
+ }
110
+
236
111
  // src/hooks/use-editor.ts
237
112
  import {
238
- ProseKitError as ProseKitError2,
113
+ ProseKitError,
239
114
  defineMountHandler,
240
115
  defineUpdateHandler,
241
116
  union
242
117
  } from "@prosekit/core";
243
- import { useEffect as useEffect3, useReducer } from "react";
118
+ import { useEffect as useEffect2, useReducer } from "react";
244
119
  function useEditor(options) {
245
120
  var _a;
246
121
  let update = (_a = options == null ? void 0 : options.update) != null ? _a : !1, editor = useEditorContext();
247
122
  if (!editor)
248
- throw new ProseKitError2(
123
+ throw new ProseKitError(
249
124
  "useEditor must be used within the ProseKit component"
250
125
  );
251
126
  let forceUpdate = useForceUpdate();
252
- return useEffect3(() => {
127
+ return useEffect2(() => {
253
128
  if (update) {
254
129
  let extension = union([
255
130
  defineMountHandler(forceUpdate),
@@ -282,17 +157,6 @@ function useStateUpdate(handler, options) {
282
157
  );
283
158
  return useExtension(extension, options);
284
159
  }
285
-
286
- // src/hooks/use-doc-change.ts
287
- import { defineDocChangeHandler } from "@prosekit/core";
288
- import { useMemo as useMemo6 } from "react";
289
- function useDocChange(handler, options) {
290
- let extension = useMemo6(
291
- () => defineDocChangeHandler((view) => handler(view.state.doc)),
292
- [handler]
293
- );
294
- return useExtension(extension, options);
295
- }
296
160
  export {
297
161
  ProseKit,
298
162
  defineReactNodeView,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/react",
3
3
  "type": "module",
4
- "version": "0.3.10",
4
+ "version": "0.3.12",
5
5
  "private": false,
6
6
  "author": {
7
7
  "name": "ocavue",
@@ -65,11 +65,11 @@
65
65
  "dist"
66
66
  ],
67
67
  "dependencies": {
68
- "@prosemirror-adapter/core": "^0.2.6",
68
+ "@prosemirror-adapter/react": "^0.2.6",
69
69
  "react-merge-refs": "^2.1.1",
70
- "@prosekit/core": "^0.7.0",
70
+ "@prosekit/core": "^0.7.1",
71
71
  "@prosekit/pm": "^0.1.5",
72
- "@prosekit/web": "^0.2.2"
72
+ "@prosekit/web": "^0.3.0"
73
73
  },
74
74
  "peerDependencies": {
75
75
  "react": ">= 18.2.0",