@prosekit/vue 0.6.6 → 0.6.8

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 (86) hide show
  1. package/dist/{create-component-BREKWlWW.js → create-component.js} +3 -4
  2. package/dist/create-component.js.map +1 -0
  3. package/dist/{create-emits-B8725q2G.d.ts → create-emits.d.ts} +1 -1
  4. package/dist/create-emits.d.ts.map +1 -0
  5. package/dist/{editor-context-BfHHplRP.js → editor-context.js} +2 -3
  6. package/dist/editor-context.js.map +1 -0
  7. package/dist/prosekit-vue-autocomplete.d.ts +1 -1
  8. package/dist/prosekit-vue-autocomplete.js +2 -6
  9. package/dist/prosekit-vue-autocomplete.js.map +1 -1
  10. package/dist/prosekit-vue-block-handle.d.ts +1 -1
  11. package/dist/prosekit-vue-block-handle.js +2 -5
  12. package/dist/prosekit-vue-block-handle.js.map +1 -1
  13. package/dist/prosekit-vue-drop-indicator.d.ts +1 -1
  14. package/dist/prosekit-vue-drop-indicator.js +2 -3
  15. package/dist/prosekit-vue-drop-indicator.js.map +1 -1
  16. package/dist/prosekit-vue-inline-popover.d.ts +1 -1
  17. package/dist/prosekit-vue-inline-popover.js +2 -3
  18. package/dist/prosekit-vue-inline-popover.js.map +1 -1
  19. package/dist/prosekit-vue-popover.d.ts +1 -1
  20. package/dist/prosekit-vue-popover.js +2 -5
  21. package/dist/prosekit-vue-popover.js.map +1 -1
  22. package/dist/prosekit-vue-resizable.d.ts +1 -1
  23. package/dist/prosekit-vue-resizable.js +2 -4
  24. package/dist/prosekit-vue-resizable.js.map +1 -1
  25. package/dist/prosekit-vue-table-handle.d.ts +1 -1
  26. package/dist/prosekit-vue-table-handle.js +2 -11
  27. package/dist/prosekit-vue-table-handle.js.map +1 -1
  28. package/dist/prosekit-vue-tooltip.d.ts +1 -1
  29. package/dist/prosekit-vue-tooltip.js +2 -5
  30. package/dist/prosekit-vue-tooltip.js.map +1 -1
  31. package/dist/prosekit-vue.d.ts +17 -17
  32. package/dist/prosekit-vue.d.ts.map +1 -1
  33. package/dist/prosekit-vue.js +118 -120
  34. package/dist/prosekit-vue.js.map +1 -1
  35. package/package.json +10 -9
  36. package/src/components/autocomplete/autocomplete-empty.gen.ts +2 -2
  37. package/src/components/autocomplete/autocomplete-item.gen.ts +2 -2
  38. package/src/components/autocomplete/autocomplete-list.gen.ts +2 -2
  39. package/src/components/autocomplete/autocomplete-popover.gen.ts +2 -2
  40. package/src/components/autocomplete/index.gen.ts +4 -4
  41. package/src/components/block-handle/block-handle-add.gen.ts +2 -2
  42. package/src/components/block-handle/block-handle-draggable.gen.ts +2 -2
  43. package/src/components/block-handle/block-handle-popover.gen.ts +2 -2
  44. package/src/components/block-handle/index.gen.ts +3 -3
  45. package/src/components/create-component.ts +1 -1
  46. package/src/components/drop-indicator/drop-indicator.gen.ts +2 -2
  47. package/src/components/drop-indicator/index.gen.ts +1 -1
  48. package/src/components/inline-popover/index.gen.ts +1 -1
  49. package/src/components/inline-popover/inline-popover.gen.ts +2 -2
  50. package/src/components/popover/index.gen.ts +3 -3
  51. package/src/components/popover/popover-content.gen.ts +2 -2
  52. package/src/components/popover/popover-root.gen.ts +2 -2
  53. package/src/components/popover/popover-trigger.gen.ts +2 -2
  54. package/src/components/prosekit.ts +9 -11
  55. package/src/components/resizable/index.gen.ts +2 -2
  56. package/src/components/resizable/resizable-handle.gen.ts +2 -2
  57. package/src/components/resizable/resizable-root.gen.ts +2 -2
  58. package/src/components/table-handle/index.gen.ts +9 -9
  59. package/src/components/table-handle/table-handle-column-root.gen.ts +2 -2
  60. package/src/components/table-handle/table-handle-column-trigger.gen.ts +2 -2
  61. package/src/components/table-handle/table-handle-drag-preview.gen.ts +2 -2
  62. package/src/components/table-handle/table-handle-drop-indicator.gen.ts +2 -2
  63. package/src/components/table-handle/table-handle-popover-content.gen.ts +2 -2
  64. package/src/components/table-handle/table-handle-popover-item.gen.ts +2 -2
  65. package/src/components/table-handle/table-handle-root.gen.ts +2 -2
  66. package/src/components/table-handle/table-handle-row-root.gen.ts +2 -2
  67. package/src/components/table-handle/table-handle-row-trigger.gen.ts +2 -2
  68. package/src/components/tooltip/index.gen.ts +3 -3
  69. package/src/components/tooltip/tooltip-content.gen.ts +2 -2
  70. package/src/components/tooltip/tooltip-root.gen.ts +2 -2
  71. package/src/components/tooltip/tooltip-trigger.gen.ts +2 -2
  72. package/src/components/view-renderer.ts +34 -0
  73. package/src/extensions/vue-mark-view.ts +33 -46
  74. package/src/extensions/vue-node-view.ts +33 -46
  75. package/src/hooks/use-doc-change.ts +1 -1
  76. package/src/hooks/use-editor-derived-value.ts +1 -1
  77. package/src/hooks/use-editor-extension.ts +1 -1
  78. package/src/hooks/use-editor.ts +2 -2
  79. package/src/hooks/use-extension.spec.ts +1 -1
  80. package/src/hooks/use-extension.ts +2 -2
  81. package/src/hooks/use-keymap.ts +1 -1
  82. package/src/hooks/use-state-update.ts +1 -1
  83. package/src/index.ts +9 -9
  84. package/dist/create-component-BREKWlWW.js.map +0 -1
  85. package/dist/create-emits-B8725q2G.d.ts.map +0 -1
  86. package/dist/editor-context-BfHHplRP.js.map +0 -1
@@ -1,10 +1,9 @@
1
1
  import type { Editor } from '@prosekit/core'
2
- import { ProsemirrorAdapterProvider } from '@prosemirror-adapter/vue'
3
2
  import { defineComponent, h, type DefineSetupFnComponent, type PropType } from 'vue'
4
3
 
5
- import { VueMarkViewsConsumer } from '../extensions/vue-mark-view'
6
- import { VueNodeViewsConsumer } from '../extensions/vue-node-view'
7
- import { provideEditor } from '../injection/editor-context'
4
+ import { provideEditor } from '../injection/editor-context.ts'
5
+
6
+ import { ViewRenderer } from './view-renderer.ts'
8
7
 
9
8
  export interface ProseKitProps {
10
9
  editor: Editor
@@ -20,12 +19,11 @@ export const ProseKit: DefineSetupFnComponent<ProseKitProps> = defineComponent<P
20
19
  props: { editor: { type: Object as PropType<Editor>, required: true } },
21
20
  setup: (props, { slots }) => {
22
21
  provideEditor(props.editor)
23
- return () => {
24
- return h(ProsemirrorAdapterProvider, null, () => [
25
- h(VueNodeViewsConsumer),
26
- h(VueMarkViewsConsumer),
27
- slots.default?.(),
28
- ])
29
- }
22
+ return () =>
23
+ h(
24
+ ViewRenderer,
25
+ { editor: props.editor },
26
+ () => slots.default?.(),
27
+ )
30
28
  },
31
29
  })
@@ -1,3 +1,3 @@
1
- export { ResizableHandle, type ResizableHandleProps, type ResizableHandleEmits } from './resizable-handle.gen'
1
+ export { ResizableHandle, type ResizableHandleProps, type ResizableHandleEmits } from './resizable-handle.gen.ts'
2
2
 
3
- export { ResizableRoot, type ResizableRootProps, type ResizableRootEmits } from './resizable-root.gen'
3
+ export { ResizableRoot, type ResizableRootProps, type ResizableRootEmits } from './resizable-root.gen.ts'
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/resizable'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link ResizableHandle} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/resizable'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link ResizableRoot} component.
@@ -1,17 +1,17 @@
1
- export { TableHandleColumnRoot, type TableHandleColumnRootProps, type TableHandleColumnRootEmits } from './table-handle-column-root.gen'
1
+ export { TableHandleColumnRoot, type TableHandleColumnRootProps, type TableHandleColumnRootEmits } from './table-handle-column-root.gen.ts'
2
2
 
3
- export { TableHandleColumnTrigger, type TableHandleColumnTriggerProps, type TableHandleColumnTriggerEmits } from './table-handle-column-trigger.gen'
3
+ export { TableHandleColumnTrigger, type TableHandleColumnTriggerProps, type TableHandleColumnTriggerEmits } from './table-handle-column-trigger.gen.ts'
4
4
 
5
- export { TableHandleDragPreview, type TableHandleDragPreviewProps, type TableHandleDragPreviewEmits } from './table-handle-drag-preview.gen'
5
+ export { TableHandleDragPreview, type TableHandleDragPreviewProps, type TableHandleDragPreviewEmits } from './table-handle-drag-preview.gen.ts'
6
6
 
7
- export { TableHandleDropIndicator, type TableHandleDropIndicatorProps, type TableHandleDropIndicatorEmits } from './table-handle-drop-indicator.gen'
7
+ export { TableHandleDropIndicator, type TableHandleDropIndicatorProps, type TableHandleDropIndicatorEmits } from './table-handle-drop-indicator.gen.ts'
8
8
 
9
- export { TableHandlePopoverContent, type TableHandlePopoverContentProps, type TableHandlePopoverContentEmits } from './table-handle-popover-content.gen'
9
+ export { TableHandlePopoverContent, type TableHandlePopoverContentProps, type TableHandlePopoverContentEmits } from './table-handle-popover-content.gen.ts'
10
10
 
11
- export { TableHandlePopoverItem, type TableHandlePopoverItemProps, type TableHandlePopoverItemEmits } from './table-handle-popover-item.gen'
11
+ export { TableHandlePopoverItem, type TableHandlePopoverItemProps, type TableHandlePopoverItemEmits } from './table-handle-popover-item.gen.ts'
12
12
 
13
- export { TableHandleRoot, type TableHandleRootProps, type TableHandleRootEmits } from './table-handle-root.gen'
13
+ export { TableHandleRoot, type TableHandleRootProps, type TableHandleRootEmits } from './table-handle-root.gen.ts'
14
14
 
15
- export { TableHandleRowRoot, type TableHandleRowRootProps, type TableHandleRowRootEmits } from './table-handle-row-root.gen'
15
+ export { TableHandleRowRoot, type TableHandleRowRootProps, type TableHandleRowRootEmits } from './table-handle-row-root.gen.ts'
16
16
 
17
- export { TableHandleRowTrigger, type TableHandleRowTriggerProps, type TableHandleRowTriggerEmits } from './table-handle-row-trigger.gen'
17
+ export { TableHandleRowTrigger, type TableHandleRowTriggerProps, type TableHandleRowTriggerEmits } from './table-handle-row-trigger.gen.ts'
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleColumnRoot} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleColumnTrigger} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleDragPreview} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleDropIndicator} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandlePopoverContent} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandlePopoverItem} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleRoot} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleRowRoot} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/table-handle'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TableHandleRowTrigger} component.
@@ -1,5 +1,5 @@
1
- export { TooltipContent, type TooltipContentProps, type TooltipContentEmits } from './tooltip-content.gen'
1
+ export { TooltipContent, type TooltipContentProps, type TooltipContentEmits } from './tooltip-content.gen.ts'
2
2
 
3
- export { TooltipRoot, type TooltipRootProps, type TooltipRootEmits } from './tooltip-root.gen'
3
+ export { TooltipRoot, type TooltipRootProps, type TooltipRootEmits } from './tooltip-root.gen.ts'
4
4
 
5
- export { TooltipTrigger, type TooltipTriggerProps, type TooltipTriggerEmits } from './tooltip-trigger.gen'
5
+ export { TooltipTrigger, type TooltipTriggerProps, type TooltipTriggerEmits } from './tooltip-trigger.gen.ts'
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/tooltip'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TooltipContent} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/tooltip'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TooltipRoot} component.
@@ -6,8 +6,8 @@ import {
6
6
  } from '@prosekit/web/tooltip'
7
7
  import type { DefineSetupFnComponent, HTMLAttributes } from 'vue'
8
8
 
9
- import { createComponent } from '../create-component'
10
- import type { CreateEmits } from '../create-emits'
9
+ import { createComponent } from '../create-component.ts'
10
+ import type { CreateEmits } from '../create-emits.ts'
11
11
 
12
12
  /**
13
13
  * Props for the {@link TooltipTrigger} component.
@@ -0,0 +1,34 @@
1
+ import { union, type Editor } from '@prosekit/core'
2
+ import { useVueRenderer } from '@prosemirror-adapter/vue'
3
+ import { defineComponent, type DefineSetupFnComponent, type PropType } from 'vue'
4
+
5
+ import { defineVueMarkViewFactory } from '../extensions/vue-mark-view.ts'
6
+ import { defineVueNodeViewFactory } from '../extensions/vue-node-view.ts'
7
+ import { useEditorExtension } from '../hooks/use-editor-extension.ts'
8
+
9
+ /**
10
+ * @internal
11
+ */
12
+ interface ViewRendererProps {
13
+ editor: Editor
14
+ }
15
+
16
+ /**
17
+ * @internal
18
+ */
19
+ export const ViewRenderer: DefineSetupFnComponent<ViewRendererProps> = defineComponent<ViewRendererProps>({
20
+ name: 'ViewRenderer',
21
+ props: { editor: { type: Object as PropType<Editor>, required: true } },
22
+ setup: (props, { slots }) => {
23
+ const { renderVueRenderer, removeVueRenderer, render } = useVueRenderer()
24
+
25
+ const extension = union([
26
+ defineVueMarkViewFactory(renderVueRenderer, removeVueRenderer),
27
+ defineVueNodeViewFactory(renderVueRenderer, removeVueRenderer),
28
+ ])
29
+
30
+ useEditorExtension(() => props.editor, extension)
31
+
32
+ return () => [slots.default?.(), render()]
33
+ },
34
+ })
@@ -1,16 +1,13 @@
1
1
  import { defineMarkViewComponent, defineMarkViewFactory, type Extension } from '@prosekit/core'
2
- import type { MarkViewConstructor } from '@prosekit/pm/view'
3
2
  import type { CoreMarkViewUserOptions } from '@prosemirror-adapter/core'
4
3
  import {
5
- useMarkViewContext,
6
- useMarkViewFactory,
4
+ AbstractVueMarkView,
5
+ buildVueMarkViewCreator,
7
6
  type MarkViewContext,
8
- type MarkViewFactory,
9
- type VueMarkViewUserOptions,
7
+ type VueRendererComponent,
8
+ type VueRendererResult,
10
9
  } from '@prosemirror-adapter/vue'
11
- import { computed, defineComponent, h, type DefineComponent } from 'vue'
12
-
13
- import { useExtension } from '../hooks/use-extension'
10
+ import { defineComponent, h, markRaw, Teleport, type DefineComponent } from 'vue'
14
11
 
15
12
  /**
16
13
  * @public
@@ -34,30 +31,36 @@ export interface VueMarkViewOptions extends CoreMarkViewUserOptions<VueMarkViewC
34
31
  name: string
35
32
  }
36
33
 
37
- function withMarkViewProps(component: VueMarkViewComponent) {
38
- return defineComponent({
39
- name: 'MarkViewPropsWrapper',
40
- setup: () => {
41
- const props: Readonly<VueMarkViewProps> = useMarkViewContext()
42
- return () => h(component, props)
43
- },
44
- })
34
+ class ProseKitVueMarkView extends AbstractVueMarkView<VueMarkViewComponent> {
35
+ render = (): VueRendererComponent => {
36
+ const UserComponent = this.component
37
+ const render = () => {
38
+ const props = this.context
39
+ return h(Teleport, { key: this.key, to: this.dom }, [h(UserComponent, props)])
40
+ }
41
+ const RendererComponent: VueRendererComponent = defineComponent({
42
+ name: 'ProsemirrorMarkView',
43
+ setup: () => {
44
+ return render
45
+ },
46
+ })
47
+ return markRaw(RendererComponent)
48
+ }
45
49
  }
46
50
 
47
51
  /**
48
52
  * @internal
49
53
  */
50
- export const VueMarkViewsConsumer: DefineComponent = /* @__PURE__ */ defineComponent({
51
- name: 'VueMarkViewsConsumer',
52
- setup: () => {
53
- const markViewFactory: MarkViewFactory = useMarkViewFactory()
54
- const extension = computed(() => {
55
- return defineVueMarkViewFactory(markViewFactory)
56
- })
57
- useExtension(extension)
58
- return (): null => null
59
- },
60
- })
54
+ export function defineVueMarkViewFactory(
55
+ renderVueRenderer: VueRendererResult['renderVueRenderer'],
56
+ removeVueRenderer: VueRendererResult['removeVueRenderer'],
57
+ ): Extension {
58
+ const factory = buildVueMarkViewCreator(renderVueRenderer, removeVueRenderer, ProseKitVueMarkView)
59
+ return defineMarkViewFactory<VueMarkViewOptions>({
60
+ group: 'vue',
61
+ factory,
62
+ })
63
+ }
61
64
 
62
65
  /**
63
66
  * Defines a mark view using a Vue component.
@@ -65,25 +68,9 @@ export const VueMarkViewsConsumer: DefineComponent = /* @__PURE__ */ defineCompo
65
68
  * @public
66
69
  */
67
70
  export function defineVueMarkView(options: VueMarkViewOptions): Extension {
68
- const { name, component, ...userOptions } = options
69
-
70
- const args: VueMarkViewUserOptions = {
71
- ...userOptions,
72
- component: withMarkViewProps(component),
73
- }
74
-
75
- return defineMarkViewComponent<VueMarkViewUserOptions>({
76
- group: 'vue',
77
- name,
78
- args,
79
- })
80
- }
81
-
82
- function defineVueMarkViewFactory(
83
- factory: (options: VueMarkViewUserOptions) => MarkViewConstructor,
84
- ) {
85
- return defineMarkViewFactory<VueMarkViewUserOptions>({
71
+ return defineMarkViewComponent<VueMarkViewOptions>({
86
72
  group: 'vue',
87
- factory,
73
+ name: options.name,
74
+ args: options,
88
75
  })
89
76
  }
@@ -1,16 +1,13 @@
1
1
  import { defineNodeViewComponent, defineNodeViewFactory, type Extension } from '@prosekit/core'
2
- import type { NodeViewConstructor } from '@prosekit/pm/view'
3
2
  import type { CoreNodeViewUserOptions } from '@prosemirror-adapter/core'
4
3
  import {
5
- useNodeViewContext,
6
- useNodeViewFactory,
4
+ AbstractVueNodeView,
5
+ buildVueNodeViewCreator,
7
6
  type NodeViewContext,
8
- type NodeViewFactory,
9
- type VueNodeViewUserOptions,
7
+ type VueRendererComponent,
8
+ type VueRendererResult,
10
9
  } from '@prosemirror-adapter/vue'
11
- import { computed, defineComponent, h, type DefineComponent } from 'vue'
12
-
13
- import { useExtension } from '../hooks/use-extension'
10
+ import { defineComponent, h, markRaw, Teleport, type DefineComponent } from 'vue'
14
11
 
15
12
  /**
16
13
  * @public
@@ -34,30 +31,36 @@ export interface VueNodeViewOptions extends CoreNodeViewUserOptions<VueNodeViewC
34
31
  name: string
35
32
  }
36
33
 
37
- function withNodeViewProps(component: VueNodeViewComponent) {
38
- return defineComponent({
39
- name: 'NodeViewPropsWrapper',
40
- setup: () => {
41
- const props: Readonly<VueNodeViewProps> = useNodeViewContext()
42
- return () => h(component, props)
43
- },
44
- })
34
+ class ProseKitVueNodeView extends AbstractVueNodeView<VueNodeViewComponent> {
35
+ render = (): VueRendererComponent => {
36
+ const UserComponent = this.component
37
+ const render = () => {
38
+ const props = this.context
39
+ return h(Teleport, { key: this.key, to: this.dom }, [h(UserComponent, props)])
40
+ }
41
+ const RendererComponent: VueRendererComponent = defineComponent({
42
+ name: 'ProsemirrorNodeView',
43
+ setup: () => {
44
+ return render
45
+ },
46
+ })
47
+ return markRaw(RendererComponent)
48
+ }
45
49
  }
46
50
 
47
51
  /**
48
52
  * @internal
49
53
  */
50
- export const VueNodeViewsConsumer: DefineComponent = /* @__PURE__ */ defineComponent({
51
- name: 'VueNodeViewsConsumer',
52
- setup: () => {
53
- const nodeViewFactory: NodeViewFactory = useNodeViewFactory()
54
- const extension = computed(() => {
55
- return defineVueNodeViewFactory(nodeViewFactory)
56
- })
57
- useExtension(extension)
58
- return (): null => null
59
- },
60
- })
54
+ export function defineVueNodeViewFactory(
55
+ renderVueRenderer: VueRendererResult['renderVueRenderer'],
56
+ removeVueRenderer: VueRendererResult['removeVueRenderer'],
57
+ ): Extension {
58
+ const factory = buildVueNodeViewCreator(renderVueRenderer, removeVueRenderer, ProseKitVueNodeView)
59
+ return defineNodeViewFactory<VueNodeViewOptions>({
60
+ group: 'vue',
61
+ factory,
62
+ })
63
+ }
61
64
 
62
65
  /**
63
66
  * Defines a node view using a Vue component.
@@ -65,25 +68,9 @@ export const VueNodeViewsConsumer: DefineComponent = /* @__PURE__ */ defineCompo
65
68
  * @public
66
69
  */
67
70
  export function defineVueNodeView(options: VueNodeViewOptions): Extension {
68
- const { name, component, ...userOptions } = options
69
-
70
- const args: VueNodeViewUserOptions = {
71
- ...userOptions,
72
- component: withNodeViewProps(component),
73
- }
74
-
75
- return defineNodeViewComponent<VueNodeViewUserOptions>({
76
- group: 'vue',
77
- name,
78
- args,
79
- })
80
- }
81
-
82
- function defineVueNodeViewFactory(
83
- factory: (options: VueNodeViewUserOptions) => NodeViewConstructor,
84
- ) {
85
- return defineNodeViewFactory<VueNodeViewUserOptions>({
71
+ return defineNodeViewComponent<VueNodeViewOptions>({
86
72
  group: 'vue',
87
- factory,
73
+ name: options.name,
74
+ args: options,
88
75
  })
89
76
  }
@@ -1,7 +1,7 @@
1
1
  import { defineDocChangeHandler } from '@prosekit/core'
2
2
  import type { ProseMirrorNode } from '@prosekit/pm/model'
3
3
 
4
- import { useExtension, type UseExtensionOptions } from './use-extension'
4
+ import { useExtension, type UseExtensionOptions } from './use-extension.ts'
5
5
 
6
6
  /**
7
7
  * Calls the given handler whenever the editor document changes.
@@ -1,7 +1,7 @@
1
1
  import type { Editor, Extension } from '@prosekit/core'
2
2
  import { computed, toValue, type MaybeRefOrGetter, type Ref, type ShallowRef } from 'vue'
3
3
 
4
- import { useEditor } from './use-editor'
4
+ import { useEditor } from './use-editor.ts'
5
5
 
6
6
  export interface UseEditorDerivedOptions<E extends Extension = any> {
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { EditorNotFoundError, type Editor, type Extension } from '@prosekit/core'
2
2
  import { toValue, watchPostEffect, type MaybeRefOrGetter } from 'vue'
3
3
 
4
- import { useEditorContext } from '../injection/editor-context'
4
+ import { useEditorContext } from '../injection/editor-context.ts'
5
5
 
6
6
  /**
7
7
  * @internal
@@ -1,7 +1,7 @@
1
1
  import { defineMountHandler, defineUpdateHandler, ProseKitError, union, type Editor, type Extension } from '@prosekit/core'
2
2
  import { onMounted, onUnmounted, shallowRef, triggerRef, type ShallowRef } from 'vue'
3
3
 
4
- import { useEditorContext } from '../injection/editor-context'
4
+ import { useEditorContext } from '../injection/editor-context.ts'
5
5
 
6
6
  /**
7
7
  * Retrieves the editor instance from the nearest ProseKit component.
@@ -29,8 +29,8 @@ export function useEditor<E extends Extension = any>(options?: {
29
29
  const editorRef = shallowRef<Editor<E>>(editor)
30
30
 
31
31
  if (update) {
32
+ const forceUpdate = () => triggerRef(editorRef)
32
33
  onMounted(() => {
33
- const forceUpdate = () => triggerRef(editorRef)
34
34
  const extension = union(
35
35
  defineMountHandler(forceUpdate),
36
36
  defineUpdateHandler(forceUpdate),
@@ -4,7 +4,7 @@ import { mount } from '@vue/test-utils'
4
4
  import { describe, expect, it, vi } from 'vitest'
5
5
  import { defineComponent } from 'vue'
6
6
 
7
- import { useExtension } from './use-extension'
7
+ import { useExtension } from './use-extension.ts'
8
8
 
9
9
  function defineText() {
10
10
  return defineNodeSpec({ name: 'text', topNode: true })
@@ -1,8 +1,8 @@
1
1
  import type { Editor, Extension, Priority } from '@prosekit/core'
2
2
  import type { MaybeRefOrGetter } from 'vue'
3
3
 
4
- import { useEditorExtension } from './use-editor-extension'
5
- import { usePriorityExtension } from './use-priority-extension'
4
+ import { useEditorExtension } from './use-editor-extension.ts'
5
+ import { usePriorityExtension } from './use-priority-extension.ts'
6
6
 
7
7
  export interface UseExtensionOptions {
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  import { defineKeymap, type Keymap } from '@prosekit/core'
2
2
  import { computed, toValue, type MaybeRefOrGetter } from 'vue'
3
3
 
4
- import { useExtension, type UseExtensionOptions } from './use-extension'
4
+ import { useExtension, type UseExtensionOptions } from './use-extension.ts'
5
5
 
6
6
  export function useKeymap(
7
7
  keymap: MaybeRefOrGetter<Keymap>,
@@ -1,7 +1,7 @@
1
1
  import { defineUpdateHandler } from '@prosekit/core'
2
2
  import type { EditorState } from '@prosekit/pm/state'
3
3
 
4
- import { useExtension, type UseExtensionOptions } from './use-extension'
4
+ import { useExtension, type UseExtensionOptions } from './use-extension.ts'
5
5
 
6
6
  /**
7
7
  * Calls the given handler whenever the editor state changes.
package/src/index.ts CHANGED
@@ -1,9 +1,9 @@
1
- export { ProseKit, type ProseKitProps } from './components/prosekit'
2
- export { defineVueMarkView, type VueMarkViewComponent, type VueMarkViewOptions, type VueMarkViewProps } from './extensions/vue-mark-view'
3
- export { defineVueNodeView, type VueNodeViewComponent, type VueNodeViewOptions, type VueNodeViewProps } from './extensions/vue-node-view'
4
- export { useDocChange } from './hooks/use-doc-change'
5
- export { useEditor } from './hooks/use-editor'
6
- export { useEditorDerivedValue, type UseEditorDerivedOptions } from './hooks/use-editor-derived-value'
7
- export { useExtension, type UseExtensionOptions } from './hooks/use-extension'
8
- export { useKeymap } from './hooks/use-keymap'
9
- export { useStateUpdate } from './hooks/use-state-update'
1
+ export { ProseKit, type ProseKitProps } from './components/prosekit.ts'
2
+ export { defineVueMarkView, type VueMarkViewComponent, type VueMarkViewOptions, type VueMarkViewProps } from './extensions/vue-mark-view.ts'
3
+ export { defineVueNodeView, type VueNodeViewComponent, type VueNodeViewOptions, type VueNodeViewProps } from './extensions/vue-node-view.ts'
4
+ export { useDocChange } from './hooks/use-doc-change.ts'
5
+ export { useEditorDerivedValue, type UseEditorDerivedOptions } from './hooks/use-editor-derived-value.ts'
6
+ export { useEditor } from './hooks/use-editor.ts'
7
+ export { useExtension, type UseExtensionOptions } from './hooks/use-extension.ts'
8
+ export { useKeymap } from './hooks/use-keymap.ts'
9
+ export { useStateUpdate } from './hooks/use-state-update.ts'
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-component-BREKWlWW.js","names":[],"sources":["../src/components/create-component.ts"],"sourcesContent":["import { defineComponent, h, onMounted, ref, watchEffect, type DefineSetupFnComponent, type EmitsOptions, type HTMLAttributes } from 'vue'\n\nimport { useEditorContext } from '../injection/editor-context'\n\nexport function createComponent<\n Props extends { [PropName in keyof Props]: unknown },\n Emits extends EmitsOptions,\n>(\n tagName: string,\n displayName: string,\n propNames: string[],\n eventNames: string[],\n): DefineSetupFnComponent<Partial<Props> & HTMLAttributes, Emits> {\n const hasEditor = propNames.includes('editor')\n\n const Component = defineComponent<any, any>(\n (props: Record<string, unknown>, { slots, emit }) => {\n const editor = useEditorContext()\n\n const mounted = ref(false)\n\n onMounted(() => {\n mounted.value = true\n })\n\n const elementRef = ref<HTMLElement | null>(null)\n\n watchEffect((onCleanup) => {\n const element = elementRef.value\n if (!element) return\n\n const eventHandlers: Record<string, (event: Event) => void> = {}\n for (const eventName of eventNames) {\n const extractDetail = eventName.endsWith('Change')\n eventHandlers[eventName] = (event: Event) => {\n emit(\n eventName,\n extractDetail ? (event as CustomEvent).detail : event,\n )\n }\n }\n\n for (const [eventName, handler] of Object.entries(eventHandlers)) {\n element.addEventListener(eventName, handler)\n }\n\n onCleanup(() => {\n for (const [eventName, handler] of Object.entries(eventHandlers)) {\n element.removeEventListener(eventName, handler)\n }\n })\n })\n\n return () => {\n const properties: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined && !key.startsWith('.')) {\n properties[propNames.includes(key) ? '.' + key : key] = value\n }\n }\n\n // Try to add the editor prop if it's missing.\n if (hasEditor && editor && !properties['editor']) {\n properties.editor = editor\n }\n\n // Ensure web components work after SSR hydration.\n properties.key = mounted.value ? 1 : 0\n\n properties.ref = elementRef\n\n return h(tagName, properties, slots.default?.())\n }\n },\n {\n name: displayName,\n props: propNames,\n emits: eventNames,\n },\n )\n\n return Component\n}\n"],"mappings":";;;;AAIA,SAAgB,gBAId,SACA,aACA,WACA,YACgE;CAChE,MAAM,YAAY,UAAU,SAAS,SAAS;AAqE9C,QAnEkB,iBACf,OAAgC,EAAE,OAAO,WAAW;EACnD,MAAM,SAAS,kBAAkB;EAEjC,MAAM,UAAU,IAAI,MAAM;AAE1B,kBAAgB;AACd,WAAQ,QAAQ;IAChB;EAEF,MAAM,aAAa,IAAwB,KAAK;AAEhD,eAAa,cAAc;GACzB,MAAM,UAAU,WAAW;AAC3B,OAAI,CAAC,QAAS;GAEd,MAAM,gBAAwD,EAAE;AAChE,QAAK,MAAM,aAAa,YAAY;IAClC,MAAM,gBAAgB,UAAU,SAAS,SAAS;AAClD,kBAAc,cAAc,UAAiB;AAC3C,UACE,WACA,gBAAiB,MAAsB,SAAS,MACjD;;;AAIL,QAAK,MAAM,CAAC,WAAW,YAAY,OAAO,QAAQ,cAAc,CAC9D,SAAQ,iBAAiB,WAAW,QAAQ;AAG9C,mBAAgB;AACd,SAAK,MAAM,CAAC,WAAW,YAAY,OAAO,QAAQ,cAAc,CAC9D,SAAQ,oBAAoB,WAAW,QAAQ;KAEjD;IACF;AAEF,eAAa;GACX,MAAM,aAAsC,EAAE;AAE9C,QAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,UAAU,UAAa,CAAC,IAAI,WAAW,IAAI,CAC7C,YAAW,UAAU,SAAS,IAAI,GAAG,MAAM,MAAM,OAAO;AAK5D,OAAI,aAAa,UAAU,CAAC,WAAW,UACrC,YAAW,SAAS;AAItB,cAAW,MAAM,QAAQ,QAAQ,IAAI;AAErC,cAAW,MAAM;AAEjB,UAAO,EAAE,SAAS,YAAY,MAAM,WAAW,CAAC;;IAGpD;EACE,MAAM;EACN,OAAO;EACP,OAAO;EACR,CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-emits-B8725q2G.d.ts","names":[],"sources":["../src/components/create-emits.ts"],"mappings":";KAAY,WAAA,sCAC2B,MAAA,GAAS,WAAA,4BAE1B,MAAA,IAClB,KAAA,EAAO,SAAA,6BAAsC,MAAA,CAAO,SAAA,cAChD,MAAA,CAAO,SAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor-context-BfHHplRP.js","names":[],"sources":["../src/injection/editor-context.ts"],"sourcesContent":["import type { Editor, Extension } from '@prosekit/core'\nimport { inject, provide, type InjectionKey } from 'vue'\n\nconst symbol = Symbol('prosekit-vue-editor-context') as InjectionKey<Editor>\n\n/**\n * @internal\n */\nexport function provideEditor(editor: Editor): void {\n provide(symbol, editor)\n}\n\n/**\n * @internal\n */\nexport function useEditorContext<E extends Extension>(): Editor<E> | undefined {\n return inject(symbol, undefined)\n}\n"],"mappings":";;;AAGA,MAAM,SAAS,OAAO,8BAA8B;;;;AAKpD,SAAgB,cAAc,QAAsB;AAClD,SAAQ,QAAQ,OAAO;;;;;AAMzB,SAAgB,mBAA+D;AAC7E,QAAO,OAAO,QAAQ,OAAU"}