@prosekit/svelte 0.8.9 → 0.8.10

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 (49) hide show
  1. package/dist/build/components/prosekit/prosekit.svelte +4 -7
  2. package/dist/build/components/view-renderer/index.d.ts +2 -0
  3. package/dist/build/components/view-renderer/index.d.ts.map +1 -0
  4. package/dist/build/components/view-renderer/index.js +1 -0
  5. package/dist/build/components/view-renderer/view-renderer.svelte +23 -0
  6. package/dist/build/extensions/svelte-mark-view.d.ts +6 -4
  7. package/dist/build/extensions/svelte-mark-view.d.ts.map +1 -1
  8. package/dist/build/extensions/svelte-mark-view.js +30 -24
  9. package/dist/build/extensions/svelte-node-view.d.ts +6 -4
  10. package/dist/build/extensions/svelte-node-view.d.ts.map +1 -1
  11. package/dist/build/extensions/svelte-node-view.js +30 -24
  12. package/package.json +8 -8
  13. package/src/components/prosekit/prosekit.svelte +4 -7
  14. package/src/components/view-renderer/index.ts +1 -0
  15. package/src/components/view-renderer/view-renderer.svelte +23 -0
  16. package/src/extensions/svelte-mark-view.ts +39 -39
  17. package/src/extensions/svelte-node-view.ts +39 -39
  18. package/dist/build/components/mark-view-consumer/index.d.ts +0 -6
  19. package/dist/build/components/mark-view-consumer/index.d.ts.map +0 -1
  20. package/dist/build/components/mark-view-consumer/index.js +0 -5
  21. package/dist/build/components/mark-view-consumer/mark-view-consumer.svelte +0 -12
  22. package/dist/build/components/mark-view-wrapper/index.d.ts +0 -4
  23. package/dist/build/components/mark-view-wrapper/index.d.ts.map +0 -1
  24. package/dist/build/components/mark-view-wrapper/index.js +0 -2
  25. package/dist/build/components/mark-view-wrapper/mark-view-wrapper.svelte +0 -17
  26. package/dist/build/components/mark-view-wrapper/props.d.ts +0 -6
  27. package/dist/build/components/mark-view-wrapper/props.d.ts.map +0 -1
  28. package/dist/build/components/mark-view-wrapper/props.js +0 -1
  29. package/dist/build/components/node-view-consumer/index.d.ts +0 -6
  30. package/dist/build/components/node-view-consumer/index.d.ts.map +0 -1
  31. package/dist/build/components/node-view-consumer/index.js +0 -5
  32. package/dist/build/components/node-view-consumer/node-view-consumer.svelte +0 -12
  33. package/dist/build/components/node-view-wrapper/index.d.ts +0 -4
  34. package/dist/build/components/node-view-wrapper/index.d.ts.map +0 -1
  35. package/dist/build/components/node-view-wrapper/index.js +0 -2
  36. package/dist/build/components/node-view-wrapper/node-view-wrapper.svelte +0 -22
  37. package/dist/build/components/node-view-wrapper/props.d.ts +0 -6
  38. package/dist/build/components/node-view-wrapper/props.d.ts.map +0 -1
  39. package/dist/build/components/node-view-wrapper/props.js +0 -1
  40. package/src/components/mark-view-consumer/index.ts +0 -8
  41. package/src/components/mark-view-consumer/mark-view-consumer.svelte +0 -12
  42. package/src/components/mark-view-wrapper/index.ts +0 -6
  43. package/src/components/mark-view-wrapper/mark-view-wrapper.svelte +0 -17
  44. package/src/components/mark-view-wrapper/props.ts +0 -7
  45. package/src/components/node-view-consumer/index.ts +0 -8
  46. package/src/components/node-view-consumer/node-view-consumer.svelte +0 -12
  47. package/src/components/node-view-wrapper/index.ts +0 -6
  48. package/src/components/node-view-wrapper/node-view-wrapper.svelte +0 -22
  49. package/src/components/node-view-wrapper/props.ts +0 -7
@@ -1,16 +1,13 @@
1
1
  <script lang="ts">
2
2
  import type { Editor } from '@prosekit/core'
3
- import { useProsemirrorAdapterProvider } from '@prosemirror-adapter/svelte'
4
3
  import { setEditorContext } from '../../contexts/editor-context.js'
5
- import { MarkViewConsumer } from '../mark-view-consumer/index.js'
6
- import { NodeViewConsumer } from '../node-view-consumer/index.js'
4
+ import { ViewRenderer } from '../view-renderer/index.js'
7
5
 
8
6
  export let editor: Editor
9
7
 
10
8
  setEditorContext(editor)
11
- useProsemirrorAdapterProvider()
12
9
  </script>
13
10
 
14
- <slot />
15
- <NodeViewConsumer />
16
- <MarkViewConsumer />
11
+ <ViewRenderer {editor}>
12
+ <slot />
13
+ </ViewRenderer>
@@ -0,0 +1,2 @@
1
+ export { default as ViewRenderer } from './view-renderer.svelte';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/view-renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1 @@
1
+ export { default as ViewRenderer } from './view-renderer.svelte';
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { union, type Editor } from '@prosekit/core'
3
+ import { useSvelteRenderer } from '@prosemirror-adapter/svelte'
4
+ import { getAllContexts } from 'svelte'
5
+ import { readable } from 'svelte/store'
6
+ import { defineSvelteMarkViewFactory } from '../../extensions/svelte-mark-view.js'
7
+ import { defineSvelteNodeViewFactory } from '../../extensions/svelte-node-view.js'
8
+ import { useEditorExtension } from '../../hooks/use-editor-extension.js'
9
+
10
+ export let editor: Editor
11
+
12
+ const { renderSvelteRenderer, removeSvelteRenderer } = useSvelteRenderer()
13
+ const context = getAllContexts()
14
+
15
+ const extension = union([
16
+ defineSvelteMarkViewFactory(renderSvelteRenderer, removeSvelteRenderer, context),
17
+ defineSvelteNodeViewFactory(renderSvelteRenderer, removeSvelteRenderer, context),
18
+ ])
19
+
20
+ useEditorExtension(editor, readable(extension))
21
+ </script>
22
+
23
+ <slot />
@@ -1,8 +1,7 @@
1
1
  import { type Extension } from '@prosekit/core';
2
- import type { MarkViewConstructor } from '@prosekit/pm/view';
3
2
  import type { CoreMarkViewUserOptions } from '@prosemirror-adapter/core';
4
- import type { MarkViewContext, SvelteMarkViewUserOptions } from '@prosemirror-adapter/svelte';
5
- import type { Component } from 'svelte';
3
+ import { type MarkViewContext, type SvelteRendererResult } from '@prosemirror-adapter/svelte';
4
+ import { type Component } from 'svelte';
6
5
  /**
7
6
  * @public
8
7
  */
@@ -23,11 +22,14 @@ export interface SvelteMarkViewOptions extends CoreMarkViewUserOptions<SvelteMar
23
22
  */
24
23
  name: string;
25
24
  }
25
+ /**
26
+ * @internal
27
+ */
28
+ export declare function defineSvelteMarkViewFactory(renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'], removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'], context: Map<any, any>): Extension;
26
29
  /**
27
30
  * Defines a mark view using a Svelte component.
28
31
  *
29
32
  * @public
30
33
  */
31
34
  export declare function defineSvelteMarkView(options: SvelteMarkViewOptions): Extension;
32
- export declare function defineSvelteMarkViewFactory(factory: (options: SvelteMarkViewUserOptions) => MarkViewConstructor): Extension;
33
35
  //# sourceMappingURL=svelte-mark-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"svelte-mark-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/svelte-mark-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIvC;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,eAAe;CAAG;AAE/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB,CAAC,uBAAuB,CAAC;IAC7F;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,SAAS,CAkBX;AAiBD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,mBAAmB,GACnE,SAAS,CAKX"}
1
+ {"version":3,"file":"svelte-mark-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/svelte-mark-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,eAAe;CAAG;AAE/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB,CAAC,uBAAuB,CAAC;IAC7F;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAkBD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,oBAAoB,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,EAClE,oBAAoB,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,EAClE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GACrB,SAAS,CAMX;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,SAAS,CAWX"}
@@ -1,6 +1,33 @@
1
1
  import { defineMarkViewComponent, defineMarkViewFactory, definePlugin } from '@prosekit/core';
2
- import { MarkViewWrapper } from "../components/mark-view-wrapper/index.js";
2
+ import { AbstractSvelteMarkView, buildSvelteMarkViewCreator, } from '@prosemirror-adapter/svelte';
3
+ import { flushSync, mount, unmount } from 'svelte';
3
4
  const isServer = typeof window === 'undefined';
5
+ class ProseKitSvelteMarkView extends AbstractSvelteMarkView {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.render = (options) => {
9
+ const UserComponent = this.component;
10
+ const props = this.context;
11
+ const component = mount(UserComponent, {
12
+ target: this.dom,
13
+ context: options.context,
14
+ props,
15
+ });
16
+ flushSync();
17
+ return () => unmount(component);
18
+ };
19
+ }
20
+ }
21
+ /**
22
+ * @internal
23
+ */
24
+ export function defineSvelteMarkViewFactory(renderSvelteRenderer, removeSvelteRenderer, context) {
25
+ const factory = buildSvelteMarkViewCreator(renderSvelteRenderer, removeSvelteRenderer, ProseKitSvelteMarkView, context);
26
+ return defineMarkViewFactory({
27
+ group: 'svelte',
28
+ factory,
29
+ });
30
+ }
4
31
  /**
5
32
  * Defines a mark view using a Svelte component.
6
33
  *
@@ -11,30 +38,9 @@ export function defineSvelteMarkView(options) {
11
38
  if (isServer) {
12
39
  return definePlugin([]);
13
40
  }
14
- const { name, component, ...userOptions } = options;
15
- const args = {
16
- ...userOptions,
17
- component: wrapComponent(component),
18
- };
19
41
  return defineMarkViewComponent({
20
42
  group: 'svelte',
21
- name,
22
- args,
23
- });
24
- }
25
- function wrapComponent(component) {
26
- // `MarkViewWrapper` is an object during SSR
27
- if (!MarkViewWrapper || typeof MarkViewWrapper !== 'function') {
28
- return component;
29
- }
30
- const MarkViewPropsWrapper = (internals, props) => {
31
- return MarkViewWrapper(internals, { ...props, component });
32
- };
33
- return MarkViewPropsWrapper;
34
- }
35
- export function defineSvelteMarkViewFactory(factory) {
36
- return defineMarkViewFactory({
37
- group: 'svelte',
38
- factory,
43
+ name: options.name,
44
+ args: options,
39
45
  });
40
46
  }
@@ -1,8 +1,7 @@
1
1
  import { type Extension } from '@prosekit/core';
2
- import type { NodeViewConstructor } from '@prosekit/pm/view';
3
2
  import type { CoreNodeViewUserOptions } from '@prosemirror-adapter/core';
4
- import type { NodeViewContext, SvelteNodeViewUserOptions } from '@prosemirror-adapter/svelte';
5
- import type { Component } from 'svelte';
3
+ import { type NodeViewContext, type SvelteRendererResult } from '@prosemirror-adapter/svelte';
4
+ import { type Component } from 'svelte';
6
5
  /**
7
6
  * @public
8
7
  */
@@ -23,11 +22,14 @@ export interface SvelteNodeViewOptions extends CoreNodeViewUserOptions<SvelteNod
23
22
  */
24
23
  name: string;
25
24
  }
25
+ /**
26
+ * @internal
27
+ */
28
+ export declare function defineSvelteNodeViewFactory(renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'], removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'], context: Map<any, any>): Extension;
26
29
  /**
27
30
  * Defines a node view using a Svelte component.
28
31
  *
29
32
  * @public
30
33
  */
31
34
  export declare function defineSvelteNodeView(options: SvelteNodeViewOptions): Extension;
32
- export declare function defineSvelteNodeViewFactory(factory: (options: SvelteNodeViewUserOptions) => NodeViewConstructor): Extension;
33
35
  //# sourceMappingURL=svelte-node-view.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIvC;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,eAAe;CAAG;AAE/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB,CAAC,uBAAuB,CAAC;IAC7F;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,SAAS,CAkBX;AAiBD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,mBAAmB,GACnE,SAAS,CAKX"}
1
+ {"version":3,"file":"svelte-node-view.d.ts","sourceRoot":"","sources":["../../../src/extensions/svelte-node-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,eAAe;CAAG;AAE/D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB,CAAC,uBAAuB,CAAC;IAC7F;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;CACb;AAkBD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,oBAAoB,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,EAClE,oBAAoB,EAAE,oBAAoB,CAAC,sBAAsB,CAAC,EAClE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GACrB,SAAS,CAMX;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,SAAS,CAWX"}
@@ -1,6 +1,33 @@
1
1
  import { defineNodeViewComponent, defineNodeViewFactory, definePlugin } from '@prosekit/core';
2
- import { NodeViewWrapper } from "../components/node-view-wrapper/index.js";
2
+ import { AbstractSvelteNodeView, buildSvelteNodeViewCreator, } from '@prosemirror-adapter/svelte';
3
+ import { flushSync, mount, unmount } from 'svelte';
3
4
  const isServer = typeof window === 'undefined';
5
+ class ProseKitSvelteNodeView extends AbstractSvelteNodeView {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.render = (options) => {
9
+ const UserComponent = this.component;
10
+ const props = this.context;
11
+ const component = mount(UserComponent, {
12
+ target: this.dom,
13
+ context: options.context,
14
+ props,
15
+ });
16
+ flushSync();
17
+ return () => unmount(component);
18
+ };
19
+ }
20
+ }
21
+ /**
22
+ * @internal
23
+ */
24
+ export function defineSvelteNodeViewFactory(renderSvelteRenderer, removeSvelteRenderer, context) {
25
+ const factory = buildSvelteNodeViewCreator(renderSvelteRenderer, removeSvelteRenderer, ProseKitSvelteNodeView, context);
26
+ return defineNodeViewFactory({
27
+ group: 'svelte',
28
+ factory,
29
+ });
30
+ }
4
31
  /**
5
32
  * Defines a node view using a Svelte component.
6
33
  *
@@ -11,30 +38,9 @@ export function defineSvelteNodeView(options) {
11
38
  if (isServer) {
12
39
  return definePlugin([]);
13
40
  }
14
- const { name, component, ...userOptions } = options;
15
- const args = {
16
- ...userOptions,
17
- component: wrapComponent(component),
18
- };
19
41
  return defineNodeViewComponent({
20
42
  group: 'svelte',
21
- name,
22
- args,
23
- });
24
- }
25
- function wrapComponent(component) {
26
- // `NodeViewWrapper` is an object during SSR
27
- if (!NodeViewWrapper || typeof NodeViewWrapper !== 'function') {
28
- return component;
29
- }
30
- const NodeViewPropsWrapper = (internals, props) => {
31
- return NodeViewWrapper(internals, { ...props, component });
32
- };
33
- return NodeViewPropsWrapper;
34
- }
35
- export function defineSvelteNodeViewFactory(factory) {
36
- return defineNodeViewFactory({
37
- group: 'svelte',
38
- factory,
43
+ name: options.name,
44
+ args: options,
39
45
  });
40
46
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@prosekit/svelte",
3
3
  "type": "module",
4
- "version": "0.8.9",
4
+ "version": "0.8.10",
5
5
  "private": false,
6
6
  "description": "Svelte components and utilities for ProseKit",
7
7
  "author": {
@@ -76,11 +76,11 @@
76
76
  "src"
77
77
  ],
78
78
  "dependencies": {
79
- "@prosemirror-adapter/core": "^0.4.6",
80
- "@prosemirror-adapter/svelte": "^0.5.0",
81
- "@prosekit/core": "^0.10.0",
82
- "@prosekit/web": "^0.7.12",
83
- "@prosekit/pm": "^0.1.15"
79
+ "@prosemirror-adapter/core": "^0.5.2",
80
+ "@prosemirror-adapter/svelte": "^0.5.2",
81
+ "@prosekit/core": "^0.11.0",
82
+ "@prosekit/pm": "^0.1.15",
83
+ "@prosekit/web": "^0.7.13"
84
84
  },
85
85
  "peerDependencies": {
86
86
  "svelte": ">= 5.0.0"
@@ -93,8 +93,8 @@
93
93
  "devDependencies": {
94
94
  "@sveltejs/package": "^2.5.7",
95
95
  "@types/node": "^24.10.13",
96
- "svelte": "^5.53.3",
97
- "svelte-check": "^4.4.3",
96
+ "svelte": "^5.55.0",
97
+ "svelte-check": "^4.4.5",
98
98
  "tsx": "^4.21.0",
99
99
  "typescript": "~5.9.3",
100
100
  "@prosekit/config-ts": "0.0.0"
@@ -1,16 +1,13 @@
1
1
  <script lang="ts">
2
2
  import type { Editor } from '@prosekit/core'
3
- import { useProsemirrorAdapterProvider } from '@prosemirror-adapter/svelte'
4
3
  import { setEditorContext } from '../../contexts/editor-context.ts'
5
- import { MarkViewConsumer } from '../mark-view-consumer/index.ts'
6
- import { NodeViewConsumer } from '../node-view-consumer/index.ts'
4
+ import { ViewRenderer } from '../view-renderer/index.ts'
7
5
 
8
6
  export let editor: Editor
9
7
 
10
8
  setEditorContext(editor)
11
- useProsemirrorAdapterProvider()
12
9
  </script>
13
10
 
14
- <slot />
15
- <NodeViewConsumer />
16
- <MarkViewConsumer />
11
+ <ViewRenderer {editor}>
12
+ <slot />
13
+ </ViewRenderer>
@@ -0,0 +1 @@
1
+ export { default as ViewRenderer } from './view-renderer.svelte'
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import { union, type Editor } from '@prosekit/core'
3
+ import { useSvelteRenderer } from '@prosemirror-adapter/svelte'
4
+ import { getAllContexts } from 'svelte'
5
+ import { readable } from 'svelte/store'
6
+ import { defineSvelteMarkViewFactory } from '../../extensions/svelte-mark-view.ts'
7
+ import { defineSvelteNodeViewFactory } from '../../extensions/svelte-node-view.ts'
8
+ import { useEditorExtension } from '../../hooks/use-editor-extension.ts'
9
+
10
+ export let editor: Editor
11
+
12
+ const { renderSvelteRenderer, removeSvelteRenderer } = useSvelteRenderer()
13
+ const context = getAllContexts()
14
+
15
+ const extension = union([
16
+ defineSvelteMarkViewFactory(renderSvelteRenderer, removeSvelteRenderer, context),
17
+ defineSvelteNodeViewFactory(renderSvelteRenderer, removeSvelteRenderer, context),
18
+ ])
19
+
20
+ useEditorExtension(editor, readable(extension))
21
+ </script>
22
+
23
+ <slot />
@@ -1,10 +1,12 @@
1
1
  import { defineMarkViewComponent, defineMarkViewFactory, definePlugin, type Extension } from '@prosekit/core'
2
- import type { MarkViewConstructor } from '@prosekit/pm/view'
3
2
  import type { CoreMarkViewUserOptions } from '@prosemirror-adapter/core'
4
- import type { MarkViewContext, SvelteMarkViewUserOptions } from '@prosemirror-adapter/svelte'
5
- import type { Component } from 'svelte'
6
-
7
- import { MarkViewWrapper } from '../components/mark-view-wrapper/index.ts'
3
+ import {
4
+ AbstractSvelteMarkView,
5
+ buildSvelteMarkViewCreator,
6
+ type MarkViewContext,
7
+ type SvelteRendererResult,
8
+ } from '@prosemirror-adapter/svelte'
9
+ import { flushSync, mount, unmount, type Component } from 'svelte'
8
10
 
9
11
  /**
10
12
  * @public
@@ -30,6 +32,35 @@ export interface SvelteMarkViewOptions extends CoreMarkViewUserOptions<SvelteMar
30
32
 
31
33
  const isServer = typeof window === 'undefined'
32
34
 
35
+ class ProseKitSvelteMarkView extends AbstractSvelteMarkView<SvelteMarkViewComponent> {
36
+ render = (options: { context: Map<unknown, unknown> }) => {
37
+ const UserComponent = this.component
38
+ const props: SvelteMarkViewProps = this.context
39
+ const component = mount(UserComponent, {
40
+ target: this.dom,
41
+ context: options.context,
42
+ props,
43
+ })
44
+ flushSync()
45
+ return () => unmount(component)
46
+ }
47
+ }
48
+
49
+ /**
50
+ * @internal
51
+ */
52
+ export function defineSvelteMarkViewFactory(
53
+ renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'],
54
+ removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'],
55
+ context: Map<any, any>,
56
+ ): Extension {
57
+ const factory = buildSvelteMarkViewCreator(renderSvelteRenderer, removeSvelteRenderer, ProseKitSvelteMarkView, context)
58
+ return defineMarkViewFactory<SvelteMarkViewOptions>({
59
+ group: 'svelte',
60
+ factory,
61
+ })
62
+ }
63
+
33
64
  /**
34
65
  * Defines a mark view using a Svelte component.
35
66
  *
@@ -43,40 +74,9 @@ export function defineSvelteMarkView(
43
74
  return definePlugin([])
44
75
  }
45
76
 
46
- const { name, component, ...userOptions } = options
47
-
48
- const args: SvelteMarkViewUserOptions = {
49
- ...userOptions,
50
- component: wrapComponent(component),
51
- }
52
-
53
- return defineMarkViewComponent<SvelteMarkViewUserOptions>({
54
- group: 'svelte',
55
- name,
56
- args,
57
- })
58
- }
59
-
60
- function wrapComponent(
61
- component: SvelteMarkViewComponent,
62
- ): Component<any, any> {
63
- // `MarkViewWrapper` is an object during SSR
64
- if (!MarkViewWrapper || typeof MarkViewWrapper !== 'function') {
65
- return component
66
- }
67
-
68
- const MarkViewPropsWrapper: Component = (internals, props) => {
69
- return MarkViewWrapper(internals, { ...props, component })
70
- }
71
-
72
- return MarkViewPropsWrapper
73
- }
74
-
75
- export function defineSvelteMarkViewFactory(
76
- factory: (options: SvelteMarkViewUserOptions) => MarkViewConstructor,
77
- ): Extension {
78
- return defineMarkViewFactory<SvelteMarkViewUserOptions>({
77
+ return defineMarkViewComponent<SvelteMarkViewOptions>({
79
78
  group: 'svelte',
80
- factory,
79
+ name: options.name,
80
+ args: options,
81
81
  })
82
82
  }
@@ -1,10 +1,12 @@
1
1
  import { defineNodeViewComponent, defineNodeViewFactory, definePlugin, type Extension } from '@prosekit/core'
2
- import type { NodeViewConstructor } from '@prosekit/pm/view'
3
2
  import type { CoreNodeViewUserOptions } from '@prosemirror-adapter/core'
4
- import type { NodeViewContext, SvelteNodeViewUserOptions } from '@prosemirror-adapter/svelte'
5
- import type { Component } from 'svelte'
6
-
7
- import { NodeViewWrapper } from '../components/node-view-wrapper/index.ts'
3
+ import {
4
+ AbstractSvelteNodeView,
5
+ buildSvelteNodeViewCreator,
6
+ type NodeViewContext,
7
+ type SvelteRendererResult,
8
+ } from '@prosemirror-adapter/svelte'
9
+ import { flushSync, mount, unmount, type Component } from 'svelte'
8
10
 
9
11
  /**
10
12
  * @public
@@ -30,6 +32,35 @@ export interface SvelteNodeViewOptions extends CoreNodeViewUserOptions<SvelteNod
30
32
 
31
33
  const isServer = typeof window === 'undefined'
32
34
 
35
+ class ProseKitSvelteNodeView extends AbstractSvelteNodeView<SvelteNodeViewComponent> {
36
+ render = (options: { context: Map<unknown, unknown> }) => {
37
+ const UserComponent = this.component
38
+ const props: SvelteNodeViewProps = this.context
39
+ const component = mount(UserComponent, {
40
+ target: this.dom,
41
+ context: options.context,
42
+ props,
43
+ })
44
+ flushSync()
45
+ return () => unmount(component)
46
+ }
47
+ }
48
+
49
+ /**
50
+ * @internal
51
+ */
52
+ export function defineSvelteNodeViewFactory(
53
+ renderSvelteRenderer: SvelteRendererResult['renderSvelteRenderer'],
54
+ removeSvelteRenderer: SvelteRendererResult['removeSvelteRenderer'],
55
+ context: Map<any, any>,
56
+ ): Extension {
57
+ const factory = buildSvelteNodeViewCreator(renderSvelteRenderer, removeSvelteRenderer, ProseKitSvelteNodeView, context)
58
+ return defineNodeViewFactory<SvelteNodeViewOptions>({
59
+ group: 'svelte',
60
+ factory,
61
+ })
62
+ }
63
+
33
64
  /**
34
65
  * Defines a node view using a Svelte component.
35
66
  *
@@ -43,40 +74,9 @@ export function defineSvelteNodeView(
43
74
  return definePlugin([])
44
75
  }
45
76
 
46
- const { name, component, ...userOptions } = options
47
-
48
- const args: SvelteNodeViewUserOptions = {
49
- ...userOptions,
50
- component: wrapComponent(component),
51
- }
52
-
53
- return defineNodeViewComponent<SvelteNodeViewUserOptions>({
54
- group: 'svelte',
55
- name,
56
- args,
57
- })
58
- }
59
-
60
- function wrapComponent(
61
- component: SvelteNodeViewComponent,
62
- ): Component<any, any> {
63
- // `NodeViewWrapper` is an object during SSR
64
- if (!NodeViewWrapper || typeof NodeViewWrapper !== 'function') {
65
- return component
66
- }
67
-
68
- const NodeViewPropsWrapper: Component = (internals, props) => {
69
- return NodeViewWrapper(internals, { ...props, component })
70
- }
71
-
72
- return NodeViewPropsWrapper
73
- }
74
-
75
- export function defineSvelteNodeViewFactory(
76
- factory: (options: SvelteNodeViewUserOptions) => NodeViewConstructor,
77
- ): Extension {
78
- return defineNodeViewFactory<SvelteNodeViewUserOptions>({
77
+ return defineNodeViewComponent<SvelteNodeViewOptions>({
79
78
  group: 'svelte',
80
- factory,
79
+ name: options.name,
80
+ args: options,
81
81
  })
82
82
  }
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte';
2
- /**
3
- * @internal
4
- */
5
- export declare const MarkViewConsumer: Component<Record<string, never>>;
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/mark-view-consumer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIvC;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAW,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA"}
@@ -1,5 +0,0 @@
1
- import Comp from './mark-view-consumer.svelte';
2
- /**
3
- * @internal
4
- */
5
- export const MarkViewConsumer = Comp;
@@ -1,12 +0,0 @@
1
- <script lang="ts">
2
- import { useMarkViewFactory, type MarkViewFactory } from '@prosemirror-adapter/svelte'
3
- import { readable } from 'svelte/store'
4
- import { defineSvelteMarkViewFactory } from '../../extensions/svelte-mark-view.js'
5
- import { useExtension } from '../../hooks/use-extension.js'
6
-
7
- const markViewFactory: MarkViewFactory = useMarkViewFactory()
8
- const extension = defineSvelteMarkViewFactory(markViewFactory)
9
- useExtension(readable(extension))
10
- </script>
11
-
12
- <slot />
@@ -1,4 +0,0 @@
1
- import type { Component } from 'svelte';
2
- import type { MarkViewWrapperProps } from './props.ts';
3
- export declare const MarkViewWrapper: Component<MarkViewWrapperProps>;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/mark-view-wrapper/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAW,SAAS,CAAC,oBAAoB,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- import Comp from './mark-view-wrapper.svelte';
2
- export const MarkViewWrapper = Comp;
@@ -1,17 +0,0 @@
1
- <script lang="ts">
2
- import { useMarkViewContext } from '@prosemirror-adapter/svelte'
3
- import type { SvelteMarkViewProps } from '../../extensions/svelte-mark-view.js'
4
- import type { MarkViewWrapperProps } from './props.js'
5
-
6
- const { component: MarkViewComponent }: MarkViewWrapperProps = $props()
7
-
8
- const markViewProps: SvelteMarkViewProps = {
9
- contentRef: useMarkViewContext('contentRef'),
10
- view: useMarkViewContext('view'),
11
- mark: useMarkViewContext('mark'),
12
- }
13
- </script>
14
-
15
- {#if MarkViewComponent}
16
- <MarkViewComponent {...markViewProps} />
17
- {/if}
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte';
2
- import type { SvelteMarkViewProps } from '../../extensions/svelte-mark-view.ts';
3
- export interface MarkViewWrapperProps {
4
- component?: Component<SvelteMarkViewProps>;
5
- }
6
- //# sourceMappingURL=props.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../src/components/mark-view-wrapper/props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAE/E,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAA;CAC3C"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte';
2
- /**
3
- * @internal
4
- */
5
- export declare const NodeViewConsumer: Component<Record<string, never>>;
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/node-view-consumer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAIvC;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAW,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA"}
@@ -1,5 +0,0 @@
1
- import Comp from './node-view-consumer.svelte';
2
- /**
3
- * @internal
4
- */
5
- export const NodeViewConsumer = Comp;
@@ -1,12 +0,0 @@
1
- <script lang="ts">
2
- import { useNodeViewFactory, type NodeViewFactory } from '@prosemirror-adapter/svelte'
3
- import { readable } from 'svelte/store'
4
- import { defineSvelteNodeViewFactory } from '../../extensions/svelte-node-view.js'
5
- import { useExtension } from '../../hooks/use-extension.js'
6
-
7
- const nodeViewFactory: NodeViewFactory = useNodeViewFactory()
8
- const extension = defineSvelteNodeViewFactory(nodeViewFactory)
9
- useExtension(readable(extension))
10
- </script>
11
-
12
- <slot />
@@ -1,4 +0,0 @@
1
- import type { Component } from 'svelte';
2
- import type { NodeViewWrapperProps } from './props.ts';
3
- export declare const NodeViewWrapper: Component<NodeViewWrapperProps>;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/node-view-wrapper/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAW,SAAS,CAAC,oBAAoB,CAAC,CAAA"}
@@ -1,2 +0,0 @@
1
- import Comp from './node-view-wrapper.svelte';
2
- export const NodeViewWrapper = Comp;
@@ -1,22 +0,0 @@
1
- <script lang="ts">
2
- import { useNodeViewContext } from '@prosemirror-adapter/svelte'
3
- import type { SvelteNodeViewProps } from '../../extensions/svelte-node-view.js'
4
- import type { NodeViewWrapperProps } from './props.js'
5
-
6
- const { component: NodeViewComponent }: NodeViewWrapperProps = $props()
7
-
8
- const nodeViewProps: SvelteNodeViewProps = {
9
- contentRef: useNodeViewContext('contentRef'),
10
- view: useNodeViewContext('view'),
11
- getPos: useNodeViewContext('getPos'),
12
- setAttrs: useNodeViewContext('setAttrs'),
13
- node: useNodeViewContext('node'),
14
- selected: useNodeViewContext('selected'),
15
- decorations: useNodeViewContext('decorations'),
16
- innerDecorations: useNodeViewContext('innerDecorations'),
17
- }
18
- </script>
19
-
20
- {#if NodeViewComponent}
21
- <NodeViewComponent {...nodeViewProps} />
22
- {/if}
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte';
2
- import type { SvelteNodeViewProps } from '../../extensions/svelte-node-view.ts';
3
- export interface NodeViewWrapperProps {
4
- component?: Component<SvelteNodeViewProps>;
5
- }
6
- //# sourceMappingURL=props.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../src/components/node-view-wrapper/props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAE/E,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,SAAS,CAAC,mBAAmB,CAAC,CAAA;CAC3C"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,8 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import Comp from './mark-view-consumer.svelte'
4
-
5
- /**
6
- * @internal
7
- */
8
- export const MarkViewConsumer = Comp as Component<Record<string, never>>
@@ -1,12 +0,0 @@
1
- <script lang="ts">
2
- import { useMarkViewFactory, type MarkViewFactory } from '@prosemirror-adapter/svelte'
3
- import { readable } from 'svelte/store'
4
- import { defineSvelteMarkViewFactory } from '../../extensions/svelte-mark-view.ts'
5
- import { useExtension } from '../../hooks/use-extension.ts'
6
-
7
- const markViewFactory: MarkViewFactory = useMarkViewFactory()
8
- const extension = defineSvelteMarkViewFactory(markViewFactory)
9
- useExtension(readable(extension))
10
- </script>
11
-
12
- <slot />
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import Comp from './mark-view-wrapper.svelte'
4
- import type { MarkViewWrapperProps } from './props.ts'
5
-
6
- export const MarkViewWrapper = Comp as Component<MarkViewWrapperProps>
@@ -1,17 +0,0 @@
1
- <script lang="ts">
2
- import { useMarkViewContext } from '@prosemirror-adapter/svelte'
3
- import type { SvelteMarkViewProps } from '../../extensions/svelte-mark-view.ts'
4
- import type { MarkViewWrapperProps } from './props.ts'
5
-
6
- const { component: MarkViewComponent }: MarkViewWrapperProps = $props()
7
-
8
- const markViewProps: SvelteMarkViewProps = {
9
- contentRef: useMarkViewContext('contentRef'),
10
- view: useMarkViewContext('view'),
11
- mark: useMarkViewContext('mark'),
12
- }
13
- </script>
14
-
15
- {#if MarkViewComponent}
16
- <MarkViewComponent {...markViewProps} />
17
- {/if}
@@ -1,7 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import type { SvelteMarkViewProps } from '../../extensions/svelte-mark-view.ts'
4
-
5
- export interface MarkViewWrapperProps {
6
- component?: Component<SvelteMarkViewProps>
7
- }
@@ -1,8 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import Comp from './node-view-consumer.svelte'
4
-
5
- /**
6
- * @internal
7
- */
8
- export const NodeViewConsumer = Comp as Component<Record<string, never>>
@@ -1,12 +0,0 @@
1
- <script lang="ts">
2
- import { useNodeViewFactory, type NodeViewFactory } from '@prosemirror-adapter/svelte'
3
- import { readable } from 'svelte/store'
4
- import { defineSvelteNodeViewFactory } from '../../extensions/svelte-node-view.ts'
5
- import { useExtension } from '../../hooks/use-extension.ts'
6
-
7
- const nodeViewFactory: NodeViewFactory = useNodeViewFactory()
8
- const extension = defineSvelteNodeViewFactory(nodeViewFactory)
9
- useExtension(readable(extension))
10
- </script>
11
-
12
- <slot />
@@ -1,6 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import Comp from './node-view-wrapper.svelte'
4
- import type { NodeViewWrapperProps } from './props.ts'
5
-
6
- export const NodeViewWrapper = Comp as Component<NodeViewWrapperProps>
@@ -1,22 +0,0 @@
1
- <script lang="ts">
2
- import { useNodeViewContext } from '@prosemirror-adapter/svelte'
3
- import type { SvelteNodeViewProps } from '../../extensions/svelte-node-view.ts'
4
- import type { NodeViewWrapperProps } from './props.ts'
5
-
6
- const { component: NodeViewComponent }: NodeViewWrapperProps = $props()
7
-
8
- const nodeViewProps: SvelteNodeViewProps = {
9
- contentRef: useNodeViewContext('contentRef'),
10
- view: useNodeViewContext('view'),
11
- getPos: useNodeViewContext('getPos'),
12
- setAttrs: useNodeViewContext('setAttrs'),
13
- node: useNodeViewContext('node'),
14
- selected: useNodeViewContext('selected'),
15
- decorations: useNodeViewContext('decorations'),
16
- innerDecorations: useNodeViewContext('innerDecorations'),
17
- }
18
- </script>
19
-
20
- {#if NodeViewComponent}
21
- <NodeViewComponent {...nodeViewProps} />
22
- {/if}
@@ -1,7 +0,0 @@
1
- import type { Component } from 'svelte'
2
-
3
- import type { SvelteNodeViewProps } from '../../extensions/svelte-node-view.ts'
4
-
5
- export interface NodeViewWrapperProps {
6
- component?: Component<SvelteNodeViewProps>
7
- }