@prosekit/vue 0.6.7 → 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 (43) 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 +1 -1
  32. package/dist/prosekit-vue.d.ts.map +1 -1
  33. package/dist/prosekit-vue.js +112 -122
  34. package/dist/prosekit-vue.js.map +1 -1
  35. package/package.json +11 -11
  36. package/src/components/prosekit.ts +8 -10
  37. package/src/components/view-renderer.ts +34 -0
  38. package/src/extensions/vue-mark-view.ts +33 -48
  39. package/src/extensions/vue-node-view.ts +33 -48
  40. package/dist/create-component-BREKWlWW.js.map +0 -1
  41. package/dist/create-emits-B8725q2G.d.ts.map +0 -1
  42. package/dist/editor-context-BfHHplRP.js.map +0 -1
  43. package/src/extensions/helpers.ts +0 -3
@@ -1,18 +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.ts'
14
-
15
- import { renderNothing } from './helpers.ts'
10
+ import { defineComponent, h, markRaw, Teleport, type DefineComponent } from 'vue'
16
11
 
17
12
  /**
18
13
  * @public
@@ -36,30 +31,36 @@ export interface VueNodeViewOptions extends CoreNodeViewUserOptions<VueNodeViewC
36
31
  name: string
37
32
  }
38
33
 
39
- function withNodeViewProps(component: VueNodeViewComponent) {
40
- return defineComponent({
41
- name: 'NodeViewPropsWrapper',
42
- setup: () => {
43
- const props: Readonly<VueNodeViewProps> = useNodeViewContext()
44
- return () => h(component, props)
45
- },
46
- })
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
+ }
47
49
  }
48
50
 
49
51
  /**
50
52
  * @internal
51
53
  */
52
- export const VueNodeViewsConsumer: DefineComponent = /* @__PURE__ */ defineComponent({
53
- name: 'VueNodeViewsConsumer',
54
- setup: () => {
55
- const nodeViewFactory: NodeViewFactory = useNodeViewFactory()
56
- const extension = computed(() => {
57
- return defineVueNodeViewFactory(nodeViewFactory)
58
- })
59
- useExtension(extension)
60
- return renderNothing
61
- },
62
- })
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
+ }
63
64
 
64
65
  /**
65
66
  * Defines a node view using a Vue component.
@@ -67,25 +68,9 @@ export const VueNodeViewsConsumer: DefineComponent = /* @__PURE__ */ defineCompo
67
68
  * @public
68
69
  */
69
70
  export function defineVueNodeView(options: VueNodeViewOptions): Extension {
70
- const { name, component, ...userOptions } = options
71
-
72
- const args: VueNodeViewUserOptions = {
73
- ...userOptions,
74
- component: withNodeViewProps(component),
75
- }
76
-
77
- return defineNodeViewComponent<VueNodeViewUserOptions>({
71
+ return defineNodeViewComponent<VueNodeViewOptions>({
78
72
  group: 'vue',
79
- name,
80
- args,
81
- })
82
- }
83
-
84
- function defineVueNodeViewFactory(
85
- factory: (options: VueNodeViewUserOptions) => NodeViewConstructor,
86
- ) {
87
- return defineNodeViewFactory<VueNodeViewUserOptions>({
88
- group: 'vue',
89
- factory,
73
+ name: options.name,
74
+ args: options,
90
75
  })
91
76
  }
@@ -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.ts'\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"}
@@ -1,3 +0,0 @@
1
- export function renderNothing(): null {
2
- return null
3
- }