@prosekit/react 0.3.9 → 0.3.11

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,12 +13,9 @@ 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';
18
+ import { config as default_alias_1 } from '@prosekit/dev/config-vitest';
22
19
  import { Editor } from '@prosekit/core';
23
20
  import type { EditorState } from '@prosekit/pm/state';
24
21
  import type { EditorView } from '@prosekit/pm/view';
@@ -29,8 +26,6 @@ import { HTMLAttributes } from 'react';
29
26
  import { InlinePopoverElement } from '@prosekit/web/inline-popover';
30
27
  import { InlinePopoverProps } from '@prosekit/web/inline-popover';
31
28
  import { Keymap } from '@prosekit/core';
32
- import type { Node as Node_2 } from '@prosekit/pm/model';
33
- import type { NodeViewConstructor } from '@prosekit/pm/view';
34
29
  import { Options } from 'tsup';
35
30
  import { PopoverContentElement } from '@prosekit/web/popover';
36
31
  import { PopoverContentProps } from '@prosekit/web/popover';
@@ -42,7 +37,6 @@ import { Priority } from '@prosekit/core';
42
37
  import type { ProseMirrorNode } from '@prosekit/pm/model';
43
38
  import { Provider } from 'react';
44
39
  import { ReactNode } from 'react';
45
- import { ReactPortal } from 'react';
46
40
  import { RefAttributes } from 'react';
47
41
  import { ResizableHandleElement } from '@prosekit/web/resizable';
48
42
  import { ResizableHandleProps } from '@prosekit/web/resizable';
@@ -81,19 +75,9 @@ export { BlockPopover as BlockPopover_alias_1 }
81
75
 
82
76
  export declare function createComponent<Props extends object, CustomElement extends HTMLElement>(tagName: string, displayName: string, defaultProps: Props): ForwardRefExoticComponent<Partial<Props> & RefAttributes<CustomElement> & HTMLAttributes<CustomElement>>;
83
77
 
84
- export declare const createNodeViewContext: Context<NodeViewFactory | null>;
85
-
86
- declare type CreateReactNodeView = ReturnType<typeof useReactNodeViewCreator>;
87
- export { CreateReactNodeView }
88
- export { CreateReactNodeView as CreateReactNodeView_alias_1 }
89
-
90
78
  export declare const default_alias: Options | Options[] | ((overrideOptions: Options) => Options | Options[] | Promise<Options | Options[]>);
91
79
 
92
- export declare const default_alias_1: {
93
- test: {
94
- environment: "jsdom";
95
- };
96
- };
80
+ export { default_alias_1 }
97
81
 
98
82
  /**
99
83
  * Defines a node view using a React component.
@@ -104,11 +88,6 @@ declare function defineReactNodeView(options: ReactNodeViewOptions): Extension;
104
88
  export { defineReactNodeView }
105
89
  export { defineReactNodeView as defineReactNodeView_alias_1 }
106
90
 
107
- /**
108
- * @internal
109
- */
110
- export declare function defineReactNodeViewFactory(nodeViewFactory: NodeViewFactory): Extension<any>;
111
-
112
91
  /**
113
92
  * @internal
114
93
  */
@@ -118,8 +97,6 @@ declare const InlinePopover: ForwardRefExoticComponent<Partial<InlinePopoverProp
118
97
  export { InlinePopover }
119
98
  export { InlinePopover as InlinePopover_alias_1 }
120
99
 
121
- export declare type NodeViewFactory = (options: ReactNodeViewUserOptions) => NodeViewConstructor;
122
-
123
100
  declare const PopoverContent: ForwardRefExoticComponent<Partial<PopoverContentProps> & RefAttributes<PopoverContentElement> & HTMLAttributes<PopoverContentElement>>;
124
101
  export { PopoverContent }
125
102
  export { PopoverContent as PopoverContent_alias_1 }
@@ -157,13 +134,6 @@ declare interface ProseKitProps {
157
134
  export { ProseKitProps }
158
135
  export { ProseKitProps as ProseKitProps_alias_1 }
159
136
 
160
- export declare class ReactNodeView extends CoreNodeView<ReactNodeViewComponent> implements ReactRenderer<ReactNodeViewProps> {
161
- key: string;
162
- context: ReactNodeViewProps;
163
- updateContext: () => void;
164
- render: () => ReactPortal;
165
- }
166
-
167
137
  /**
168
138
  * @public
169
139
  */
@@ -197,7 +167,7 @@ declare interface ReactNodeViewProps {
197
167
  view: EditorView;
198
168
  getPos: () => number | undefined;
199
169
  setAttrs: (attrs: Attrs) => void;
200
- node: Node_2;
170
+ node: ProseMirrorNode;
201
171
  selected: boolean;
202
172
  decorations: readonly Decoration[];
203
173
  innerDecorations: DecorationSource;
@@ -205,31 +175,11 @@ declare interface ReactNodeViewProps {
205
175
  export { ReactNodeViewProps }
206
176
  export { ReactNodeViewProps as ReactNodeViewProps_alias_1 }
207
177
 
208
- export declare type ReactNodeViewSpec = CoreNodeViewSpec<ReactNodeViewComponent>;
209
-
210
- export declare type ReactNodeViewUserOptions = CoreNodeViewUserOptions<ReactNodeViewComponent>;
211
-
212
- export declare interface ReactRenderer<Context> {
213
- key: string;
214
- context: Context;
215
- render: () => ReactPortal;
216
- updateContext: () => void;
217
- }
218
-
219
- export declare interface ReactRendererResult {
220
- readonly portals: Record<string, ReactPortal>;
221
- readonly renderReactRenderer: (nodeView: ReactRenderer<unknown>, update?: boolean) => void;
222
- readonly removeReactRenderer: (nodeView: ReactRenderer<unknown>) => void;
223
- }
224
-
178
+ /**
179
+ * @internal
180
+ */
225
181
  export declare const ReactViewsConsumer: FC;
226
182
 
227
- declare const ReactViewsProvider: FC<{
228
- children: ReactNode;
229
- }>;
230
- export { ReactViewsProvider }
231
- export { ReactViewsProvider as ReactViewsProvider_alias_1 }
232
-
233
183
  declare const ResizableHandle: ForwardRefExoticComponent<Partial<ResizableHandleProps> & RefAttributes<ResizableHandleElement> & HTMLAttributes<ResizableHandleElement>>;
234
184
  export { ResizableHandle }
235
185
  export { ResizableHandle as ResizableHandle_alias_1 }
@@ -316,17 +266,11 @@ declare function useKeymap(keymap: Keymap, options?: UseExtensionOptions): void;
316
266
  export { useKeymap }
317
267
  export { useKeymap as useKeymap_alias_1 }
318
268
 
319
- export declare function useNodeViewFactory(): NodeViewFactory;
320
-
321
269
  /**
322
270
  * @internal
323
271
  */
324
272
  export declare function usePriorityExtension<T extends Extension = Extension>(extension: T | null, priority?: Priority | null): T | null;
325
273
 
326
- export declare function useReactNodeViewCreator(renderReactRenderer: ReactRendererResult['renderReactRenderer'], removeReactRenderer: ReactRendererResult['removeReactRenderer']): (options: ReactNodeViewUserOptions) => NodeViewConstructor;
327
-
328
- export declare function useReactRenderer(): ReactRendererResult;
329
-
330
274
  /**
331
275
  * Calls the given handler whenever the editor state changes.
332
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.9",
4
+ "version": "0.3.11",
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.6.1",
71
70
  "@prosekit/pm": "^0.1.5",
72
- "@prosekit/web": "^0.2.1"
71
+ "@prosekit/core": "^0.7.1",
72
+ "@prosekit/web": "^0.2.3"
73
73
  },
74
74
  "peerDependencies": {
75
75
  "react": ">= 18.2.0",
@@ -89,8 +89,8 @@
89
89
  "react": "^18.3.1",
90
90
  "react-dom": "^18.3.1",
91
91
  "tsup": "^8.1.0",
92
- "typescript": "^5.5.2",
93
- "vitest": "^1.6.0",
92
+ "typescript": "^5.5.3",
93
+ "vitest": "^2.0.0-beta.13",
94
94
  "@prosekit/dev": "0.0.0"
95
95
  },
96
96
  "scripts": {