@domternal/vue 0.6.0
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.
- package/README.md +42 -0
- package/dist/index.d.ts +786 -0
- package/dist/index.js +2046 -0
- package/dist/index.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useEditor.ts","../src/utils.ts","../src/useEditorState.ts","../src/EditorContext.ts","../src/Domternal.ts","../src/DomternalEditor.ts","../src/EditorContent.ts","../src/toolbar/useToolbarController.ts","../src/toolbar/useToolbarIcons.ts","../src/toolbar/useTooltip.ts","../src/toolbar/useKeyboardNav.ts","../src/toolbar/useComputedStyle.ts","../src/toolbar/ToolbarButton.ts","../src/toolbar/ToolbarDropdownPanel.ts","../src/toolbar/ToolbarDropdown.ts","../src/toolbar/DomternalToolbar.ts","../src/bubble-menu/useBubbleMenu.ts","../src/bubble-menu/DomternalBubbleMenu.ts","../src/DomternalFloatingMenu.ts","../src/emoji-picker/useEmojiPicker.ts","../src/emoji-picker/DomternalEmojiPicker.ts","../src/node-views/VueNodeViewContext.ts","../src/node-views/VueNodeViewRenderer.ts","../src/node-views/NodeViewWrapper.ts","../src/node-views/NodeViewContent.ts","../src/index.ts"],"names":["ref","watch","shallowRef","watchEffect","defineComponent","h","onScopeDispose","computed","ToolbarController","onMounted","defaultIcons","PluginKey","positionFloatingOnce","inject","markRaw","provide"],"mappings":"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","file":"index.js","sourcesContent":["import { markRaw, onMounted, onScopeDispose, ref, shallowRef, watch } from 'vue';\nimport type { Ref, ShallowRef } from 'vue';\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\nexport interface UseEditorOptions {\n /** Custom extensions to add to the editor. */\n extensions?: AnyExtension[];\n /** Initial editor content (HTML string or JSON). */\n content?: Content;\n /** Whether the editor is editable. @default true */\n editable?: boolean;\n /** Where to autofocus on mount. @default false */\n autofocus?: FocusPosition;\n /** Output format for content comparison. @default 'html' */\n outputFormat?: 'html' | 'json';\n /**\n * Set to true to create the editor synchronously during setup instead of\n * waiting for onMounted. Only useful when SSR is not a concern.\n * @default false\n */\n immediatelyRender?: boolean;\n /** Called when the editor instance is created. */\n onCreate?: (editor: Editor) => void;\n /** Called when the document content changes. */\n onUpdate?: (props: { editor: Editor }) => void;\n /** Called when the selection changes without content change. */\n onSelectionChange?: (props: { editor: Editor }) => void;\n /** Called when the editor gains focus. */\n onFocus?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called when the editor loses focus. */\n onBlur?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called before the editor is destroyed. */\n onDestroy?: () => void;\n}\n\n/**\n * Core composable for creating and managing a Domternal editor instance.\n *\n * @example\n * ```ts\n * const { editor, editorRef } = useEditor({ extensions, content });\n * ```\n *\n * @example SSR-safe (default in Vue - onMounted never runs on server)\n * ```ts\n * const { editor, editorRef } = useEditor({ extensions, content });\n * // editor.value is null until onMounted\n * ```\n */\nexport function useEditor(options: UseEditorOptions = {}): {\n editor: ShallowRef<Editor | null>;\n editorRef: Ref<HTMLDivElement | undefined>;\n} {\n const editor = shallowRef<Editor | null>(null);\n const editorRef = ref<HTMLDivElement>();\n let pendingContent: Content | null = null;\n\n function wireEvents(ed: Editor) {\n ed.on('transaction', ({ transaction }: TransactionEventProps) => {\n if (transaction.docChanged) {\n options.onUpdate?.({ editor: ed });\n }\n if (!transaction.docChanged && transaction.selectionSet) {\n options.onSelectionChange?.({ editor: ed });\n }\n });\n\n ed.on('focus', ({ event }: FocusEventProps) => {\n options.onFocus?.({ editor: ed, event });\n });\n\n ed.on('blur', ({ event }: FocusEventProps) => {\n options.onBlur?.({ editor: ed, event });\n });\n }\n\n function createEditorInstance(element: HTMLElement, initialContent: Content, focus: FocusPosition) {\n const extensions = options.extensions ?? [];\n const editable = options.editable ?? true;\n\n const ed = new Editor({\n element,\n extensions: [...DEFAULT_EXTENSIONS, ...extensions],\n content: initialContent,\n editable,\n autofocus: focus,\n });\n\n markRaw(ed);\n wireEvents(ed);\n editor.value = ed;\n options.onCreate?.(ed);\n return ed;\n }\n\n function destroyCurrentEditor() {\n const current = editor.value;\n if (current && !current.isDestroyed) {\n pendingContent = current.getJSON();\n options.onDestroy?.();\n\n // Clone editor DOM before destroy to prevent content flash during\n // unmount transitions. Insert clone before original, then destroy.\n const dom = current.view.dom;\n const parent = dom?.parentNode;\n if (parent) {\n const clone = dom.cloneNode(true) as HTMLElement;\n clone.style.pointerEvents = 'none';\n parent.insertBefore(clone, dom);\n }\n\n current.destroy();\n }\n editor.value = null;\n }\n\n if (options.immediatelyRender) {\n const element = document.createElement('div');\n createEditorInstance(element, options.content ?? '', options.autofocus ?? false);\n }\n\n onMounted(() => {\n if (editor.value) return; // Already created via immediatelyRender\n\n const element = editorRef.value ?? document.createElement('div');\n const initialContent = pendingContent ?? options.content ?? '';\n pendingContent = null;\n createEditorInstance(element, initialContent, options.autofocus ?? false);\n });\n\n onScopeDispose(() => {\n destroyCurrentEditor();\n });\n\n // Sync editable - watch options object property, not destructured primitive\n watch(\n () => options.editable ?? true,\n (newEditable) => {\n const ed = editor.value;\n if (ed && !ed.isDestroyed) {\n ed.setEditable(newEditable);\n }\n },\n );\n\n // Recreate editor when extensions array reference changes\n watch(\n () => options.extensions,\n (newExtensions, oldExtensions) => {\n if (!editor.value || editor.value.isDestroyed) return;\n if (newExtensions === oldExtensions) return;\n\n const element = editor.value.view.dom.parentElement ?? document.createElement('div');\n destroyCurrentEditor();\n const initialContent = pendingContent ?? '';\n pendingContent = null;\n createEditorInstance(element, initialContent, false);\n },\n );\n\n // Sync content from outside\n watch(\n () => options.content,\n (newContent) => {\n const ed = editor.value;\n if (!ed || ed.isDestroyed || newContent === undefined) return;\n\n const outputFormat = options.outputFormat ?? 'html';\n if (outputFormat === 'html') {\n if (newContent !== ed.getHTML()) {\n ed.setContent(newContent, false);\n }\n } else {\n if (JSON.stringify(newContent) !== JSON.stringify(ed.getJSON())) {\n ed.setContent(newContent, false);\n }\n }\n },\n { flush: 'post' },\n );\n\n return { editor, editorRef };\n}\n","import { customRef } from 'vue';\nimport type { AppContext } from 'vue';\nimport type { Editor } from '@domternal/core';\n\n/**\n * Creates a debounced ref that batches rapid updates into a single Vue re-render.\n *\n * The value is updated synchronously (get() always returns the latest value),\n * but the reactive trigger is deferred via double requestAnimationFrame.\n * This prevents multiple re-renders during a single frame when rapid\n * ProseMirror transactions fire (e.g. during typing).\n *\n * Improved over Tiptap's implementation: cancels previous rAFs on rapid\n * updates, ensuring only one trigger per double-frame window.\n */\nexport function useDebouncedRef<T>(initialValue: T) {\n let value = initialValue;\n let rafId1: number | undefined;\n let rafId2: number | undefined;\n\n return customRef<T>((track, trigger) => ({\n get() {\n track();\n return value;\n },\n set(newValue: T) {\n value = newValue;\n if (rafId1 !== undefined) cancelAnimationFrame(rafId1);\n if (rafId2 !== undefined) cancelAnimationFrame(rafId2);\n rafId1 = requestAnimationFrame(() => {\n rafId2 = requestAnimationFrame(() => {\n rafId1 = rafId2 = undefined;\n trigger();\n });\n });\n },\n }));\n}\n\n/**\n * Module-level store for Vue appContext per editor instance.\n *\n * Since we cannot modify the core Editor class (unlike Tiptap which\n * subclasses it), we use a WeakMap to associate each Editor with its\n * Vue appContext. This allows VueNodeViewRenderer to forward the\n * provide/inject chain from the parent component tree.\n *\n * The `provides` property MUST be a direct reference (not spread/copied)\n * to preserve Vue's prototype chain for inject resolution.\n *\n * WeakMap ensures no memory leaks when editors are garbage collected.\n */\nexport const appContextStore = new WeakMap<Editor, AppContext>();\n\n/**\n * Pending appContext for editors currently being constructed.\n *\n * Node view constructors fire DURING `new Editor(...)` - before the editor\n * instance can be stored in appContextStore. To support `useCurrentEditor()`\n * and provide/inject inside node views, `provideEditor()` stashes the\n * appContext here. `useEditor()` reads it when creating the editor, then\n * clears it. VueNodeViewRenderer falls back to this when the per-editor\n * entry is not yet populated.\n */\nexport const pendingAppContextStore = { value: null as AppContext | null };\n","import { computed, ref, watch } from 'vue';\nimport type { ComputedRef, Ref, ShallowRef } from 'vue';\nimport type { Editor, JSONContent } from '@domternal/core';\nimport { useDebouncedRef } from './utils.js';\n\n/**\n * Full editor state returned when no selector is provided.\n */\nexport interface EditorState {\n htmlContent: Ref<string>;\n jsonContent: Ref<JSONContent | null>;\n isEmpty: Ref<boolean>;\n isFocused: Ref<boolean>;\n isEditable: Ref<boolean>;\n}\n\n/**\n * Subscribe to editor state changes.\n *\n * **Overload 1 - Full state:**\n * ```ts\n * const { htmlContent, isEmpty } = useEditorState(editor);\n * ```\n *\n * **Overload 2 - Selector (granular, avoids unnecessary re-renders):**\n * ```ts\n * const isBold = useEditorState(editor, (ed) => ed.isActive('bold'));\n * ```\n */\nexport function useEditorState(editor: ShallowRef<Editor | null>): EditorState;\nexport function useEditorState<T>(editor: ShallowRef<Editor | null>, selector: (editor: Editor) => T): ComputedRef<T | undefined>;\nexport function useEditorState<T>(\n editor: ShallowRef<Editor | null>,\n selector?: (editor: Editor) => T,\n): EditorState | ComputedRef<T | undefined> {\n if (selector) {\n return useEditorStateSelector(editor, selector);\n }\n return useEditorStateFull(editor);\n}\n\n// --- Full state mode ---\n\nfunction getFullState(ed: Editor | null) {\n if (!ed || ed.isDestroyed) {\n return { html: '', json: null as JSONContent | null, empty: true, focused: false, editable: true };\n }\n return {\n html: ed.getHTML(),\n json: ed.getJSON(),\n empty: ed.isEmpty,\n focused: ed.isFocused,\n editable: ed.isEditable,\n };\n}\n\nfunction useEditorStateFull(editor: ShallowRef<Editor | null>): EditorState {\n const initial = getFullState(editor.value);\n const htmlContent = ref(initial.html);\n const jsonContent = ref<JSONContent | null>(initial.json);\n const isEmpty = ref(initial.empty);\n const isFocused = ref(initial.focused);\n const isEditable = ref(initial.editable);\n\n watch(\n editor,\n (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) {\n htmlContent.value = '';\n jsonContent.value = null;\n isEmpty.value = true;\n isFocused.value = false;\n isEditable.value = true;\n return;\n }\n\n // Set initial state\n const state = getFullState(ed);\n htmlContent.value = state.html;\n jsonContent.value = state.json;\n isEmpty.value = state.empty;\n isFocused.value = state.focused;\n isEditable.value = state.editable;\n\n const onTransaction = () => {\n const html = ed.getHTML();\n const json = ed.getJSON();\n const empty = ed.isEmpty;\n const editable = ed.isEditable;\n if (htmlContent.value !== html) htmlContent.value = html;\n if (isEmpty.value !== empty) isEmpty.value = empty;\n if (isEditable.value !== editable) isEditable.value = editable;\n jsonContent.value = json;\n };\n\n const onFocus = () => {\n if (!isFocused.value) isFocused.value = true;\n };\n\n const onBlur = () => {\n if (isFocused.value) isFocused.value = false;\n };\n\n ed.on('transaction', onTransaction);\n ed.on('focus', onFocus);\n ed.on('blur', onBlur);\n\n onCleanup(() => {\n ed.off('transaction', onTransaction);\n ed.off('focus', onFocus);\n ed.off('blur', onBlur);\n });\n },\n { immediate: true },\n );\n\n return { htmlContent, jsonContent, isEmpty, isFocused, isEditable };\n}\n\n// --- Selector mode ---\n\nfunction useEditorStateSelector<T>(\n editor: ShallowRef<Editor | null>,\n selector: (editor: Editor) => T,\n): ComputedRef<T | undefined> {\n const version = useDebouncedRef(0);\n\n watch(\n editor,\n (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) return;\n\n const bump = () => { version.value++; };\n\n ed.on('transaction', bump);\n ed.on('focus', bump);\n ed.on('blur', bump);\n\n onCleanup(() => {\n ed.off('transaction', bump);\n ed.off('focus', bump);\n ed.off('blur', bump);\n });\n },\n { immediate: true },\n );\n\n return computed(() => {\n // Read version to create reactive dependency\n void version.value;\n const ed = editor.value;\n if (!ed || ed.isDestroyed) return undefined;\n return selector(ed);\n });\n}\n","import { getCurrentInstance, inject, provide, shallowRef, watchEffect } from 'vue';\nimport type { InjectionKey, ShallowRef } from 'vue';\nimport type { Editor } from '@domternal/core';\nimport { appContextStore, pendingAppContextStore } from './utils.js';\n\n/**\n * Typed injection key for the editor instance.\n * Components use this via provide/inject to share the editor\n * without prop drilling.\n */\nexport const EDITOR_KEY: InjectionKey<ShallowRef<Editor | null>> = Symbol('domternal-editor');\n\n/**\n * Provides an editor instance to all descendant components via Vue's\n * provide/inject system. Also stores the appContext in the WeakMap\n * for VueNodeViewRenderer to forward the provide/inject chain.\n *\n * @example\n * ```ts\n * const { editor } = useEditor({ extensions, content });\n * provideEditor(editor);\n * ```\n */\nexport function provideEditor(editor: ShallowRef<Editor | null>): void {\n provide(EDITOR_KEY, editor);\n\n // Store appContext for VueNodeViewRenderer.\n // We must preserve the original appContext object (not spread it) so that\n // config, mixins, and the prototype chain remain intact. The provides\n // property is overridden with the component instance's provides to ensure\n // Vue's prototype-chain-based inject resolution works in node views.\n const instance = getCurrentInstance();\n if (instance) {\n const buildCtx = () => {\n const ctx = Object.create(instance.appContext) as typeof instance.appContext;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ctx as any).provides = (instance as any).provides;\n return ctx;\n };\n\n // Set pending context immediately so node view constructors firing during\n // new Editor() (before editor.value is assigned) can find it.\n pendingAppContextStore.value = buildCtx();\n\n watchEffect(() => {\n const ed = editor.value;\n if (ed) {\n appContextStore.set(ed, buildCtx());\n // Clear pending once the per-editor entry is populated.\n pendingAppContextStore.value = null;\n }\n });\n }\n}\n\n/**\n * Access the editor instance from the nearest provider.\n *\n * @returns `{ editor }` where editor is a ShallowRef that may be null\n * if the provider has no editor yet or if used outside a provider.\n *\n * @example\n * ```ts\n * const { editor } = useCurrentEditor();\n * if (editor.value) {\n * editor.value.commands.toggleBold();\n * }\n * ```\n */\nexport function useCurrentEditor(): { editor: ShallowRef<Editor | null> } {\n const editor = inject(EDITOR_KEY, shallowRef(null));\n return { editor };\n}\n","import { defineComponent, h, ref, watchEffect } from 'vue';\nimport type { PropType } from 'vue';\nimport type { AnyExtension, Content, FocusPosition } from '@domternal/core';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { provideEditor, useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalProps extends UseEditorOptions {\n // All UseEditorOptions props are inherited\n}\n\n/**\n * Composable root component that creates an editor and provides it to all\n * subcomponents via inject. No need to pass `editor` prop to children.\n *\n * Supports namespaced subcomponents in `<script setup>` templates:\n *\n * @example\n * ```vue\n * <script setup>\n * import { Domternal } from '@domternal/vue';\n * </script>\n * <template>\n * <Domternal :extensions=\"extensions\" :content=\"content\">\n * <Domternal.Toolbar />\n * <Domternal.Content />\n * <Domternal.BubbleMenu :contexts=\"{ text: ['bold', 'italic'] }\" />\n * <Domternal.EmojiPicker :emojis=\"emojis\" />\n * </Domternal>\n * </template>\n * ```\n */\nexport const Domternal = defineComponent({\n name: 'Domternal',\n props: {\n extensions: { type: Array as PropType<AnyExtension[]>, default: undefined },\n content: { type: [String, Object] as PropType<Content>, default: '' },\n editable: { type: Boolean, default: true },\n autofocus: { type: [Boolean, String, Number] as PropType<FocusPosition>, default: false },\n outputFormat: { type: String as PropType<'html' | 'json'>, default: 'html' },\n immediatelyRender: { type: Boolean, default: false },\n onCreate: { type: Function as PropType<UseEditorOptions['onCreate']>, default: undefined },\n onUpdate: { type: Function as PropType<UseEditorOptions['onUpdate']>, default: undefined },\n onSelectionChange: { type: Function as PropType<UseEditorOptions['onSelectionChange']>, default: undefined },\n onFocus: { type: Function as PropType<UseEditorOptions['onFocus']>, default: undefined },\n onBlur: { type: Function as PropType<UseEditorOptions['onBlur']>, default: undefined },\n onDestroy: { type: Function as PropType<UseEditorOptions['onDestroy']>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor } = useEditor({\n ...(props.extensions && { extensions: props.extensions }),\n content: props.content,\n editable: props.editable,\n autofocus: props.autofocus,\n outputFormat: props.outputFormat,\n immediatelyRender: props.immediatelyRender,\n ...(props.onCreate && { onCreate: props.onCreate }),\n ...(props.onUpdate && { onUpdate: props.onUpdate }),\n ...(props.onSelectionChange && { onSelectionChange: props.onSelectionChange }),\n ...(props.onFocus && { onFocus: props.onFocus }),\n ...(props.onBlur && { onBlur: props.onBlur }),\n ...(props.onDestroy && { onDestroy: props.onDestroy }),\n });\n\n provideEditor(editor);\n\n return () => slots['default']?.();\n },\n}) as ReturnType<typeof defineComponent> & {\n Content: ReturnType<typeof defineComponent>;\n Loading: ReturnType<typeof defineComponent>;\n Toolbar: ReturnType<typeof defineComponent>;\n BubbleMenu: ReturnType<typeof defineComponent>;\n FloatingMenu: ReturnType<typeof defineComponent>;\n EmojiPicker: ReturnType<typeof defineComponent>;\n};\n\n// --- Subcomponents ---\n\n/** Renders the editor content area. Mounts the editor view DOM from context. */\nconst DomternalContent = defineComponent({\n name: 'DomternalContent',\n props: {\n class: { type: String, default: undefined },\n },\n setup(props) {\n const { editor } = useCurrentEditor();\n const containerRef = ref<HTMLElement>();\n\n watchEffect(() => {\n const container = containerRef.value;\n const ed = editor.value;\n if (!container || !ed || ed.isDestroyed) return;\n\n const editorDom = ed.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n });\n\n return () => {\n const classes = props.class ? `dm-editor ${props.class}` : 'dm-editor';\n return h('div', { class: classes, 'data-dm-editor-ui': '' }, [h('div', { ref: containerRef })]);\n };\n },\n});\n\n/** Renders slot content only while editor is not yet ready (SSR loading state). */\nconst DomternalLoading = defineComponent({\n name: 'DomternalLoading',\n setup(_props, { slots }) {\n const { editor } = useCurrentEditor();\n return () => (editor.value ? null : slots['default']?.());\n },\n});\n\nDomternal.Content = DomternalContent;\nDomternal.Loading = DomternalLoading;\n// Toolbar, BubbleMenu, FloatingMenu, EmojiPicker are assigned in index.ts\n","import { defineComponent, h, ref, watch } from 'vue';\nimport type { PropType } from 'vue';\nimport type { Content, AnyExtension, FocusPosition, JSONContent } from '@domternal/core';\nimport { useEditor } from './useEditor.js';\nimport { useEditorState } from './useEditorState.js';\nimport { provideEditor } from './EditorContext.js';\n\nexport interface DomternalEditorProps {\n extensions?: AnyExtension[];\n content?: Content;\n editable?: boolean;\n autofocus?: FocusPosition;\n immediatelyRender?: boolean;\n outputFormat?: 'html' | 'json';\n modelValue?: Content;\n class?: string;\n onCreate?: (editor: import('@domternal/core').Editor) => void;\n onUpdate?: (props: { editor: import('@domternal/core').Editor }) => void;\n onSelectionChange?: (props: { editor: import('@domternal/core').Editor }) => void;\n onFocus?: (props: { editor: import('@domternal/core').Editor; event: FocusEvent }) => void;\n onBlur?: (props: { editor: import('@domternal/core').Editor; event: FocusEvent }) => void;\n onDestroy?: () => void;\n}\n\n/**\n * All-in-one editor component with v-model support and integrated context.\n *\n * Wraps children with provideEditor automatically, so toolbar, bubble menu,\n * and emoji picker components can access the editor via inject.\n *\n * @example Basic usage\n * ```vue\n * <DomternalEditor\n * :extensions=\"[Bold, Italic, Heading]\"\n * content=\"<p>Hello</p>\"\n * />\n * ```\n *\n * @example v-model (two-way binding)\n * ```vue\n * <DomternalEditor v-model=\"content\" :extensions=\"extensions\" />\n * ```\n *\n * @example With children (toolbar, bubble menu)\n * ```vue\n * <DomternalEditor :extensions=\"extensions\" v-model=\"content\">\n * <DomternalToolbar />\n * <DomternalBubbleMenu :contexts=\"{ text: ['bold', 'italic'] }\" />\n * </DomternalEditor>\n * ```\n */\nexport const DomternalEditor = defineComponent({\n name: 'DomternalEditor',\n props: {\n extensions: { type: Array as PropType<AnyExtension[]>, default: undefined },\n content: { type: [String, Object] as PropType<Content>, default: undefined },\n editable: { type: Boolean, default: true },\n autofocus: { type: [Boolean, String, Number] as PropType<FocusPosition>, default: false },\n immediatelyRender: { type: Boolean, default: false },\n outputFormat: { type: String as PropType<'html' | 'json'>, default: 'html' },\n modelValue: { type: [String, Object] as PropType<Content>, default: undefined },\n class: { type: String, default: undefined },\n onCreate: { type: Function as PropType<(editor: import('@domternal/core').Editor) => void>, default: undefined },\n onUpdate: { type: Function as PropType<(props: { editor: import('@domternal/core').Editor }) => void>, default: undefined },\n onSelectionChange: { type: Function as PropType<(props: { editor: import('@domternal/core').Editor }) => void>, default: undefined },\n onFocus: { type: Function as PropType<(props: { editor: import('@domternal/core').Editor; event: FocusEvent }) => void>, default: undefined },\n onBlur: { type: Function as PropType<(props: { editor: import('@domternal/core').Editor; event: FocusEvent }) => void>, default: undefined },\n onDestroy: { type: Function as PropType<() => void>, default: undefined },\n },\n emits: {\n 'update:modelValue': (_value: Content | JSONContent) => true,\n },\n setup(props, { slots, emit, expose }) {\n const { editor, editorRef } = useEditor({\n ...(props.extensions && { extensions: props.extensions }),\n content: props.modelValue ?? props.content ?? '',\n editable: props.editable,\n autofocus: props.autofocus,\n immediatelyRender: props.immediatelyRender,\n outputFormat: props.outputFormat,\n ...(props.onCreate && { onCreate: props.onCreate }),\n ...(props.onUpdate && { onUpdate: props.onUpdate }),\n ...(props.onSelectionChange && { onSelectionChange: props.onSelectionChange }),\n ...(props.onFocus && { onFocus: props.onFocus }),\n ...(props.onBlur && { onBlur: props.onBlur }),\n ...(props.onDestroy && { onDestroy: props.onDestroy }),\n });\n\n const state = useEditorState(editor);\n\n // Expose editor + state via template ref\n expose({\n editor,\n htmlContent: state.htmlContent,\n jsonContent: state.jsonContent,\n isEmpty: state.isEmpty,\n isFocused: state.isFocused,\n });\n\n // Provide editor to descendant components\n provideEditor(editor);\n\n // v-model: sync modelValue prop to editor\n const prevModelValue = ref(props.modelValue);\n watch(\n () => props.modelValue,\n (newValue) => {\n if (newValue === undefined) return;\n const ed = editor.value;\n if (!ed || ed.isDestroyed) return;\n if (newValue === prevModelValue.value) return;\n prevModelValue.value = newValue;\n\n if (props.outputFormat === 'html') {\n if (newValue !== ed.getHTML()) {\n ed.setContent(newValue, false);\n }\n } else {\n if (JSON.stringify(newValue) !== JSON.stringify(ed.getJSON())) {\n ed.setContent(newValue, false);\n }\n }\n },\n { flush: 'post' },\n );\n\n // v-model: emit update:modelValue on content changes\n watch(editor, (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) return;\n\n const handler = () => {\n const val: string | JSONContent = props.outputFormat === 'html'\n ? ed.getHTML()\n : ed.getJSON();\n prevModelValue.value = val;\n emit('update:modelValue', val);\n };\n\n ed.on('update', handler);\n onCleanup(() => { ed.off('update', handler); });\n }, { immediate: true });\n\n return () => {\n const classes = props.class ? `dm-editor ${props.class}` : 'dm-editor';\n return [\n h('div', { class: classes, 'data-dm-editor-ui': '' }, [h('div', { ref: editorRef })]),\n slots['default']?.(),\n ];\n };\n },\n});\n","import { defineComponent, h, ref, watchEffect } from 'vue';\nimport type { PropType } from 'vue';\nimport type { Editor } from '@domternal/core';\n\n/**\n * Renders the ProseMirror editor view into a div element.\n *\n * Use this with `useEditor` for a flexible, decoupled pattern where the\n * editor composable and rendering are separated.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useEditor, EditorContent } from '@domternal/vue';\n * const { editor } = useEditor({ extensions, content });\n * </script>\n * <template>\n * <EditorContent :editor=\"editor\" class=\"my-editor\" />\n * </template>\n * ```\n */\nexport const EditorContent = defineComponent({\n name: 'EditorContent',\n props: {\n editor: {\n type: Object as PropType<Editor | null>,\n default: null,\n },\n class: {\n type: String,\n default: undefined,\n },\n },\n setup(props) {\n const containerRef = ref<HTMLElement>();\n\n watchEffect(() => {\n const container = containerRef.value;\n const editor = props.editor;\n if (!container || !editor || editor.isDestroyed) return;\n\n const editorDom = editor.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n });\n\n return () =>\n h('div', {\n ref: containerRef,\n class: props.class,\n });\n },\n});\n","import { onScopeDispose, ref, shallowRef, watch } from 'vue';\nimport type { ShallowRef } from 'vue';\nimport {\n ToolbarController,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n Editor,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { useDebouncedRef } from '../utils.js';\n\nexport function useToolbarController(\n editor: ShallowRef<Editor | null>,\n layout?: ToolbarLayoutEntry[],\n) {\n const groups = shallowRef<ToolbarGroup[]>([]);\n const focusedIndex = ref(0);\n const openDropdown = ref<string | null>(null);\n const activeVersion = useDebouncedRef(0);\n\n let controller: ToolbarController | null = null;\n const toolbarRef = ref<HTMLDivElement>();\n let cleanupFloating: (() => void) | null = null;\n let clickOutsideHandler: ((e: Event) => void) | null = null;\n let dismissOverlayHandler: (() => void) | null = null;\n let editorEl: HTMLElement | null = null;\n let syncStateRaf = 0;\n\n function syncState() {\n cancelAnimationFrame(syncStateRaf);\n syncStateRaf = requestAnimationFrame(() => {\n if (!controller) return;\n\n const controllerGroups = controller.groups;\n if (groups.value.length !== controllerGroups.length) {\n groups.value = controllerGroups;\n }\n focusedIndex.value = controller.focusedIndex;\n openDropdown.value = controller.openDropdown;\n activeVersion.value++;\n });\n }\n\n // Initialize controller when editor becomes available. Using watch with\n // immediate:true handles both cases: editor already set (manual mode via\n // v-if) and editor set later (compound mode where the toolbar mounts\n // before the parent useEditor finishes).\n watch(\n editor,\n (ed) => {\n if (controller || !ed || ed.isDestroyed) return;\n\n controller = new ToolbarController(\n ed as unknown as ToolbarControllerEditor,\n syncState,\n layout,\n );\n controller.subscribe();\n syncState();\n\n clickOutsideHandler = (e: Event) => {\n if (controller?.openDropdown && toolbarRef.value && !toolbarRef.value.contains(e.target as Node)) {\n cleanupFloating?.();\n cleanupFloating = null;\n controller.closeDropdown();\n syncState();\n }\n };\n document.addEventListener('mousedown', clickOutsideHandler);\n\n editorEl = ed.view.dom.closest('.dm-editor') as HTMLElement | null;\n if (editorEl) {\n dismissOverlayHandler = () => {\n if (controller?.openDropdown) {\n cleanupFloating?.();\n cleanupFloating = null;\n controller.closeDropdown();\n syncState();\n }\n };\n editorEl.addEventListener('dm:dismiss-overlays', dismissOverlayHandler);\n }\n },\n { immediate: true },\n );\n\n onScopeDispose(() => {\n cancelAnimationFrame(syncStateRaf);\n cleanupFloating?.();\n cleanupFloating = null;\n\n if (clickOutsideHandler) {\n document.removeEventListener('mousedown', clickOutsideHandler);\n clickOutsideHandler = null;\n }\n if (dismissOverlayHandler && editorEl) {\n editorEl.removeEventListener('dm:dismiss-overlays', dismissOverlayHandler);\n dismissOverlayHandler = null;\n editorEl = null;\n }\n\n controller?.destroy();\n controller = null;\n });\n\n function isActive(name: string): boolean {\n return controller?.activeMap.get(name) ?? false;\n }\n\n function isDisabled(name: string): boolean {\n return controller?.disabledMap.get(name) ?? false;\n }\n\n function isDropdownActive(dropdown: ToolbarDropdown): boolean {\n if (dropdown.layout === 'grid') return false;\n if (dropdown.dynamicLabel) return false;\n if (!controller) return false;\n return dropdown.items.some((item: ToolbarButton) => controller!.activeMap.get(item.name) ?? false);\n }\n\n function getAriaExpanded(item: ToolbarButton): string | null {\n if (!item.emitEvent) return null;\n return controller?.expandedMap.get(item.name) ? 'true' : null;\n }\n\n function getFlatIndex(name: string): number {\n return controller?.getFlatIndex(name) ?? -1;\n }\n\n function handleDropdownToggle(dropdown: ToolbarDropdown) {\n if (!controller) return;\n\n cleanupFloating?.();\n cleanupFloating = null;\n controller.toggleDropdown(dropdown.name);\n syncState();\n\n if (controller.openDropdown) {\n requestAnimationFrame(() => {\n const trigger = toolbarRef.value?.querySelector('[aria-expanded=\"true\"]') as HTMLElement | null;\n const panel = trigger?.parentElement?.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (trigger && panel) {\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }\n\n function closeDropdown() {\n cleanupFloating?.();\n cleanupFloating = null;\n controller?.closeDropdown();\n syncState();\n }\n\n function executeCommand(item: ToolbarButton) {\n controller?.executeCommand(item);\n }\n\n return {\n controller: { get current() { return controller; } },\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n executeCommand,\n syncState,\n };\n}\n","import { defaultIcons } from '@domternal/core';\nimport type { IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const DROPDOWN_CARET = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\nexport function useToolbarIcons(icons?: IconSet | null) {\n const cache = new Map<string, string>();\n let prevIcons = icons;\n\n function checkCacheInvalidation(currentIcons: IconSet | null | undefined) {\n if (currentIcons !== prevIcons) {\n cache.clear();\n prevIcons = currentIcons;\n }\n }\n\n function resolveIconSvg(name: string): string {\n if (icons) {\n return icons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n function getCachedIcon(name: string): string {\n checkCacheInvalidation(icons);\n const key = `i:${name}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(name);\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getCachedTriggerLabel(label: string, isIcon?: boolean): string {\n checkCacheInvalidation(icons);\n const key = `tl:${label}:${isIcon ? '1' : '0'}`;\n let cached = cache.get(key);\n if (!cached) {\n const content = isIcon ? resolveIconSvg(label) : label;\n cached = `<span class=\"dm-toolbar-trigger-label\">${content}</span>${DROPDOWN_CARET}`;\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getCachedTriggerIcon(iconName: string): string {\n checkCacheInvalidation(icons);\n const key = `t:${iconName}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(iconName) + DROPDOWN_CARET;\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getCachedItemContent(\n iconName: string,\n label: string,\n displayMode?: 'icon-text' | 'text' | 'icon',\n ): string {\n const mode = displayMode ?? 'icon-text';\n checkCacheInvalidation(icons);\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = cache.get(key);\n if (!cached) {\n if (mode === 'text') {\n cached = label;\n } else if (mode === 'icon') {\n cached = resolveIconSvg(iconName);\n } else {\n cached = resolveIconSvg(iconName) + ' ' + label;\n }\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getDropdownTriggerHtml(\n dropdown: ToolbarDropdown,\n activeItem: ToolbarButton | undefined,\n ): string {\n checkCacheInvalidation(icons);\n\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(dropdown.icon) + DROPDOWN_CARET;\n if (color) {\n cached += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cache.set(key, cached);\n }\n return cached;\n }\n\n if (dropdown.dynamicLabel) {\n if (activeItem) return getCachedTriggerLabel(activeItem.label);\n if (dropdown.dynamicLabelFallback) return getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n return getCachedTriggerLabel(dropdown.icon, true);\n }\n\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return getCachedTriggerIcon(icon);\n }\n\n return {\n resolveIconSvg,\n getCachedIcon,\n getCachedTriggerLabel,\n getCachedTriggerIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n };\n}\n","import type { ToolbarButton } from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\nconst MODIFIER_MAP: Record<string, string> = isMac\n ? { Mod: '\\u2318', Shift: '\\u21E7', Alt: '\\u2325' }\n : { Mod: 'Ctrl', Shift: 'Shift', Alt: 'Alt' };\n\nexport function useTooltip() {\n function getTooltip(item: ToolbarButton): string {\n if (!item.shortcut) return item.label;\n\n const parts = item.shortcut.split('-').map((part) => MODIFIER_MAP[part] ?? part);\n const shortcut = isMac ? parts.join('') : parts.join('+');\n return `${item.label} (${shortcut})`;\n }\n\n return { getTooltip };\n}\n","import type { Ref } from 'vue';\nimport type { ToolbarController } from '@domternal/core';\n\nexport function useKeyboardNav(\n controllerRef: { readonly current: ToolbarController | null },\n toolbarRef: Ref<HTMLDivElement | undefined>,\n closeDropdown: () => void,\n) {\n function focusCurrentButton() {\n const buttons = toolbarRef.value?.querySelectorAll('.dm-toolbar-button');\n const controller = controllerRef.current;\n if (buttons && controller) {\n const btn = buttons[controller.focusedIndex] as HTMLElement | undefined;\n btn?.focus();\n }\n }\n\n function focusDropdownItem(direction: number, first?: boolean) {\n const panel = toolbarRef.value?.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n const controller = controllerRef.current;\n if (!controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n controller.navigateNext();\n focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n controller.navigatePrev();\n focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(1);\n } else {\n const btn = document.activeElement as HTMLElement | null;\n if (btn?.getAttribute('aria-haspopup') && btn.closest('.dm-toolbar')) {\n btn.click();\n requestAnimationFrame(() => focusDropdownItem(0, true));\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(-1);\n }\n break;\n }\n case 'Home':\n event.preventDefault();\n controller.navigateFirst();\n focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n controller.navigateLast();\n focusCurrentButton();\n break;\n case 'Escape':\n if (controller.openDropdown) {\n event.preventDefault();\n closeDropdown();\n focusCurrentButton();\n }\n break;\n }\n }\n\n return { onKeyDown, focusCurrentButton };\n}\n","import type { Editor } from '@domternal/core';\n\n/**\n * Reads a CSS property at the current cursor position.\n * Prefers inline style, falls back to computed style.\n */\nexport function getComputedStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const domAtPos = editor.view.domAtPos(from);\n let node = domAtPos.node;\n if (!(node instanceof HTMLElement)) {\n node = (node as Node).parentElement as HTMLElement;\n }\n if (!node) return null;\n\n const el = node as HTMLElement;\n const inline = el.style.getPropertyValue(prop);\n if (inline) return inline;\n\n return window.getComputedStyle(el).getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Reads only the inline style at the current cursor position.\n * Used for font-family to avoid browser default inheritance.\n */\nexport function getInlineStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const domAtPos = editor.view.domAtPos(from);\n let node = domAtPos.node;\n if (!(node instanceof HTMLElement)) {\n node = (node as Node).parentElement as HTMLElement;\n }\n if (!node) return null;\n\n return (node as HTMLElement).style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n}\n","import { defineComponent, h } from 'vue';\nimport type { PropType } from 'vue';\nimport type { ToolbarButton as ToolbarButtonType } from '@domternal/core';\n\nexport const ToolbarButton = defineComponent({\n name: 'ToolbarButton',\n props: {\n item: { type: Object as PropType<ToolbarButtonType>, required: true },\n isActive: { type: Boolean, required: true },\n isDisabled: { type: Boolean, required: true },\n tabIndex: { type: Number, required: true },\n tooltip: { type: String, required: true },\n iconHtml: { type: String, required: true },\n ariaExpanded: { type: String as PropType<string | null>, default: null },\n },\n emits: {\n click: (_item: ToolbarButtonType, _event: MouseEvent) => true,\n focus: (_name: string) => true,\n },\n setup(props, { emit }) {\n return () =>\n h('button', {\n type: 'button',\n class: ['dm-toolbar-button', props.isActive && 'dm-toolbar-button--active'],\n disabled: props.isDisabled,\n tabindex: props.tabIndex,\n innerHTML: props.iconHtml,\n 'aria-pressed': props.isActive,\n 'aria-expanded': props.ariaExpanded === 'true' ? true : undefined,\n 'aria-label': props.item.label,\n title: props.tooltip,\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: (e: MouseEvent) => emit('click', props.item, e),\n onFocus: () => emit('focus', props.item.name),\n });\n },\n});\n","import { defineComponent, h } from 'vue';\nimport type { PropType, VNode } from 'vue';\nimport type { ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const ToolbarDropdownPanel = defineComponent({\n name: 'ToolbarDropdownPanel',\n props: {\n dropdown: { type: Object as PropType<ToolbarDropdown>, required: true },\n isActive: { type: Function as PropType<(name: string) => boolean>, required: true },\n getCachedItemContent: {\n type: Function as PropType<(icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string>,\n required: true,\n },\n },\n emits: ['itemClick'],\n setup(props, { emit }) {\n return () => {\n const { dropdown, isActive, getCachedItemContent } = props;\n\n if (dropdown.layout === 'grid') {\n return h(\n 'div',\n {\n class: 'dm-toolbar-dropdown-panel dm-color-palette',\n role: 'menu',\n style: { '--dm-palette-columns': String(dropdown.gridColumns ?? 10) },\n },\n dropdown.items.map((sub: ToolbarButton) =>\n sub.color\n ? h('button', {\n key: sub.name,\n type: 'button',\n class: ['dm-color-swatch', isActive(sub.name) && 'dm-color-swatch--active'],\n role: 'menuitem',\n tabindex: -1,\n 'aria-label': sub.label,\n title: sub.label,\n style: { backgroundColor: sub.color },\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: (e: MouseEvent) => emit('itemClick', sub, e),\n })\n : h('button', {\n key: sub.name,\n type: 'button',\n class: 'dm-color-palette-reset',\n role: 'menuitem',\n tabindex: -1,\n 'aria-label': sub.label,\n innerHTML: getCachedItemContent(sub.icon, sub.label),\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: (e: MouseEvent) => emit('itemClick', sub, e),\n }),\n ),\n );\n }\n\n return h(\n 'div',\n {\n class: 'dm-toolbar-dropdown-panel',\n role: 'menu',\n 'data-display-mode': dropdown.displayMode ?? null,\n },\n dropdown.items.map((sub: ToolbarButton) =>\n h('button', {\n key: sub.name,\n type: 'button',\n class: ['dm-toolbar-dropdown-item', isActive(sub.name) && 'dm-toolbar-dropdown-item--active'],\n role: 'menuitem',\n tabindex: -1,\n 'aria-label': sub.label,\n title: sub.label,\n innerHTML: getCachedItemContent(sub.icon, sub.label, dropdown.displayMode),\n onVnodeMounted: (vnode: VNode) => {\n if (sub.style && vnode.el) (vnode.el as HTMLElement).setAttribute('style', sub.style);\n },\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: (e: MouseEvent) => emit('itemClick', sub, e),\n }),\n ),\n );\n };\n },\n});\n","import { defineComponent, h } from 'vue';\nimport type { PropType } from 'vue';\nimport type { ToolbarButton, ToolbarDropdown as ToolbarDropdownType } from '@domternal/core';\nimport { ToolbarDropdownPanel } from './ToolbarDropdownPanel.js';\n\nexport const ToolbarDropdown = defineComponent({\n name: 'ToolbarDropdown',\n props: {\n dropdown: { type: Object as PropType<ToolbarDropdownType>, required: true },\n isOpen: { type: Boolean, required: true },\n isActive: { type: Function as PropType<(name: string) => boolean>, required: true },\n isDropdownActive: { type: Boolean, required: true },\n isDisabled: { type: Boolean, required: true },\n tabIndex: { type: Number, required: true },\n triggerHtml: { type: String, required: true },\n getCachedItemContent: {\n type: Function as PropType<(icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string>,\n required: true,\n },\n },\n emits: ['toggle', 'itemClick', 'focus'],\n setup(props, { emit }) {\n return () => {\n const children = [\n h('button', {\n type: 'button',\n class: ['dm-toolbar-button', 'dm-toolbar-dropdown-trigger', props.isDropdownActive && 'dm-toolbar-button--active'],\n 'aria-expanded': props.isOpen,\n 'aria-haspopup': 'true',\n 'aria-label': props.dropdown.label,\n title: props.dropdown.label,\n tabindex: props.tabIndex,\n disabled: props.isDisabled,\n 'data-dropdown': props.dropdown.name,\n innerHTML: props.triggerHtml,\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: () => emit('toggle', props.dropdown),\n onFocus: () => emit('focus', props.dropdown.name),\n }),\n ];\n\n if (props.isOpen) {\n children.push(\n h(ToolbarDropdownPanel, {\n dropdown: props.dropdown,\n isActive: props.isActive,\n getCachedItemContent: props.getCachedItemContent,\n onItemClick: (item: ToolbarButton, event: MouseEvent) => emit('itemClick', item, event),\n }),\n );\n }\n\n return h('div', { class: 'dm-toolbar-dropdown-wrapper' }, children);\n };\n },\n});\n","import { computed, defineComponent, h, Fragment } from 'vue';\nimport type { PropType, ShallowRef } from 'vue';\nimport type {\n Editor,\n IconSet,\n ToolbarButton as ToolbarButtonType,\n ToolbarDropdown as ToolbarDropdownType,\n ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useToolbarController } from './useToolbarController.js';\nimport { useToolbarIcons, DROPDOWN_CARET } from './useToolbarIcons.js';\nimport { useTooltip } from './useTooltip.js';\nimport { useKeyboardNav } from './useKeyboardNav.js';\nimport { getComputedStyleAtCursor, getInlineStyleAtCursor } from './useComputedStyle.js';\nimport { ToolbarButton } from './ToolbarButton.js';\nimport { ToolbarDropdown } from './ToolbarDropdown.js';\n\nexport interface DomternalToolbarProps {\n editor?: Editor;\n icons?: IconSet;\n layout?: ToolbarLayoutEntry[];\n}\n\nexport const DomternalToolbar = defineComponent({\n name: 'DomternalToolbar',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n icons: { type: Object as PropType<IconSet>, default: undefined },\n layout: { type: Array as PropType<ToolbarLayoutEntry[]>, default: undefined },\n },\n setup(props) {\n const { editor: contextEditor } = useCurrentEditor();\n\n const {\n controller: controllerRef,\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n executeCommand,\n } = useToolbarController(\n computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>,\n props.layout,\n );\n\n const {\n getCachedIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n } = useToolbarIcons(props.icons);\n\n const { getTooltip } = useTooltip();\n const { onKeyDown } = useKeyboardNav(controllerRef, toolbarRef, closeDropdown);\n\n function onButtonClick(item: ToolbarButtonType, event?: Event) {\n const editor = props.editor ?? contextEditor.value;\n if (!editor) return;\n\n if (controllerRef.current?.openDropdown) {\n closeDropdown();\n }\n\n if (item.emitEvent) {\n const anchor = (event?.target as HTMLElement)?.closest?.('.dm-toolbar-button') as HTMLElement ?? event?.target as HTMLElement;\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n executeCommand(item);\n\n // Always refocus editor after executing a command via toolbar button.\n // Mouse clicks already keep focus via mousedown.preventDefault();\n // keyboard activations (Enter/Space) need explicit refocus.\n requestAnimationFrame(() => editor.view.focus());\n }\n\n function onDropdownItemClick(item: ToolbarButtonType, event: MouseEvent) {\n const editor = props.editor ?? contextEditor.value;\n if (!editor) return;\n\n let anchor: HTMLElement | undefined;\n if (item.emitEvent) {\n const wrapper = (event.target as HTMLElement)?.closest?.('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n\n closeDropdown();\n\n if (item.emitEvent) {\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n executeCommand(item);\n }\n\n // Refocus editor so ::selection highlight stays visible\n requestAnimationFrame(() => editor.view.focus());\n }\n\n function onButtonFocus(name: string) {\n const index = controllerRef.current?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n controllerRef.current?.setFocusedIndex(index);\n }\n }\n\n return () => {\n const editor = props.editor ?? contextEditor.value;\n if (!editor) return null;\n\n // Read activeVersion to establish reactive dependency\n void activeVersion.value;\n\n return h(\n 'div',\n {\n ref: toolbarRef,\n class: 'dm-toolbar',\n role: 'toolbar',\n 'aria-label': 'Editor formatting',\n 'data-dm-editor-ui': '',\n onKeydown: onKeyDown,\n },\n groups.value.map((group, gi) =>\n h(Fragment, { key: group.name }, [\n gi > 0 ? h('div', { class: 'dm-toolbar-separator', role: 'separator' }) : null,\n h(\n 'div',\n { class: 'dm-toolbar-group', role: 'group', 'aria-label': group.name || 'Tools' },\n group.items.map((item: ToolbarItem) => {\n if (item.type === 'button') {\n const btn = item as ToolbarButtonType;\n return h(ToolbarButton, {\n key: btn.name,\n item: btn,\n isActive: isActive(btn.name),\n isDisabled: isDisabled(btn.name),\n tabIndex: getFlatIndex(btn.name) === focusedIndex.value ? 0 : -1,\n tooltip: getTooltip(btn),\n iconHtml: getCachedIcon(btn.icon),\n ariaExpanded: getAriaExpanded(btn),\n onClick: (clickedItem: ToolbarButtonType, event: MouseEvent) => onButtonClick(clickedItem, event),\n onFocus: onButtonFocus,\n });\n }\n if (item.type === 'dropdown') {\n const dd = item as ToolbarDropdownType;\n const activeItem = dd.items.find((sub: ToolbarButtonType) => controllerRef.current?.activeMap.get(sub.name));\n\n let triggerHtml = getDropdownTriggerHtml(dd, activeItem);\n if (dd.dynamicLabel && !activeItem && dd.computedStyleProperty) {\n let computed: string | null;\n if (dd.computedStyleProperty === 'font-family') {\n computed = getInlineStyleAtCursor(editor, dd.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first || null;\n }\n } else {\n computed = getComputedStyleAtCursor(editor, dd.computedStyleProperty);\n }\n if (computed) {\n triggerHtml = `<span class=\"dm-toolbar-trigger-label\">${computed}</span>${DROPDOWN_CARET}`;\n }\n }\n\n return h(ToolbarDropdown, {\n key: dd.name,\n dropdown: dd,\n isOpen: openDropdown.value === dd.name,\n isActive,\n isDropdownActive: isDropdownActive(dd),\n isDisabled: isDisabled(dd.name),\n tabIndex: getFlatIndex(dd.name) === focusedIndex.value ? 0 : -1,\n triggerHtml,\n getCachedItemContent,\n onToggle: handleDropdownToggle,\n onItemClick: onDropdownItemClick,\n onFocus: onButtonFocus,\n });\n }\n return null;\n }),\n ),\n ]),\n ),\n );\n };\n },\n});\n","import { onMounted, onScopeDispose, ref, shallowRef, watch } from 'vue';\nimport type { ShallowRef } from 'vue';\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type { Editor, ToolbarButton, BubbleMenuOptions } from '@domternal/core';\nimport { useDebouncedRef } from '../utils.js';\n\n// --- Duck-typed ProseMirror shapes (avoids instanceof across bundles) ---\n\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\nexport type BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;\n\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\nfunction findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') return node;\n }\n return null;\n}\n\n// --- Composable ---\n\nexport interface UseBubbleMenuOptions {\n editor: ShallowRef<Editor | null>;\n shouldShow?: BubbleMenuOptions['shouldShow'] | undefined;\n placement?: 'top' | 'bottom' | undefined;\n offset?: number | undefined;\n updateDelay?: number | undefined;\n items?: string[] | undefined;\n contexts?: Record<string, string[] | true | null> | undefined;\n}\n\nexport function useBubbleMenu(options: UseBubbleMenuOptions) {\n const { editor, shouldShow, placement = 'top', offset = 8, updateDelay = 0, items, contexts } = options;\n\n const menuRef = ref<HTMLDivElement>();\n const pluginKey = new PluginKey('vueBubbleMenu-' + Math.random().toString(36).slice(2, 8));\n const resolvedItems = shallowRef<BubbleMenuItem[]>([]);\n const activeVersion = useDebouncedRef(0);\n\n // Persistent state maps accessed by exposed helpers (isItemActive,\n // isItemDisabled) before doInit runs; must start as empty Maps.\n const activeMapRef = new Map<string, boolean>();\n const disabledMapRef = new Map<string, boolean>();\n // itemMap and bubbleDefaults are only used inside doInit; declared here so\n // closures inside doInit can rebind on each run.\n let itemMap: Map<string, ToolbarButton>;\n let bubbleDefaults: Map<string, BubbleMenuItem[]>;\n let currentResolvedItems: BubbleMenuItem[] = [];\n\n let initialized = false;\n let stopEditorWatch: (() => void) | null = null;\n // Init when both editor is ready AND the component has mounted (menuRef\n // populated). onMounted guarantees DOM; then wait for editor if needed.\n const doInit = (ed: Editor) => {\n if (initialized || !ed || ed.isDestroyed || !menuRef.value) return;\n initialized = true;\n\n // Build item map\n itemMap = new Map();\n for (const item of ed.toolbarItems) {\n if (item.type === 'button') {\n itemMap.set(item.name, item);\n } else if (item.type === 'dropdown') {\n for (const sub of item.items) {\n itemMap.set(sub.name, sub);\n }\n }\n }\n\n // Build bubble defaults\n bubbleDefaults = new Map();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton) => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of ed.toolbarItems) {\n if (item.type === 'button') addItem(item);\n else if (item.type === 'dropdown') {\n for (const sub of item.items) addItem(sub);\n }\n }\n for (const [ctx, ctxItems] of byCtx) {\n ctxItems.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of ctxItems) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${sepIdx++}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n bubbleDefaults.set(ctx, result);\n }\n\n // Resolve names helper\n const resolveNames = (names: string[]): BubbleMenuItem[] => {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${sepIdx++}` });\n } else {\n const item = itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n };\n\n const getFormatItems = (): ToolbarButton[] => {\n return Array.from(itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n };\n\n const detectContext = (selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null => {\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n const fromCell = findCellNode(selection.$from);\n if (fromCell) {\n const toCell = findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n };\n\n const filterBySchema = (contextName: string, schemaItems: ToolbarButton[]): ToolbarButton[] => {\n if (contextName === 'text' || contextName === 'table') return schemaItems;\n const schema = (ed.state as unknown as { schema?: SchemaShape }).schema;\n if (!schema) return schemaItems;\n const nodeType = schema.nodes[contextName];\n if (!nodeType) return schemaItems;\n return schemaItems.filter(item => {\n const markName = typeof item.isActive === 'string' ? item.isActive : null;\n if (!markName) return true;\n const markType = schema.marks?.[markName];\n if (!markType) return true;\n return nodeType.allowsMarkType(markType);\n });\n };\n\n // Generate shouldShow function\n let shouldShowFn = shouldShow;\n if (!shouldShowFn) {\n if (contexts) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = detectContext(state.selection, contexts);\n if (!context) return false;\n if (context in contexts) {\n const val = contexts[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return bubbleDefaults.has(context);\n };\n } else {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty || state.selection.node) return false;\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n // Register plugin\n const plugin = createBubbleMenuPlugin({\n pluginKey,\n editor: ed,\n element: menuRef.value,\n shouldShow: shouldShowFn,\n placement,\n offset,\n updateDelay,\n });\n ed.registerPlugin(plugin);\n\n const setItems = (newItems: BubbleMenuItem[]) => {\n currentResolvedItems = newItems;\n resolvedItems.value = newItems;\n };\n\n // Set initial items\n if (contexts) {\n updateContextItems(ed, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else if (items) {\n setItems(resolveNames(items));\n } else {\n setItems(resolveNames(['bold', 'italic', 'underline']));\n }\n\n const updateStates = (currentEd: Editor) => {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = currentEd.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch { /* empty */ }\n\n for (const item of currentResolvedItems) {\n if (item.type === 'separator') continue;\n activeMapRef.set(item.name, ToolbarController.resolveActive(currentEd as never, item));\n try {\n const canCmd = canProxy?.[item.command];\n disabledMapRef.set(item.name, canCmd\n ? !(item.commandArgs?.length ? canCmd(...item.commandArgs) : canCmd())\n : false);\n } catch { disabledMapRef.set(item.name, false); }\n }\n };\n\n // Transaction handler\n const transactionHandler = () => {\n if (contexts) {\n updateContextItems(ed, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n }\n updateStates(ed);\n activeVersion.value++;\n };\n ed.on('transaction', transactionHandler);\n updateStates(ed);\n\n initializedEditor = ed;\n initializedHandler = transactionHandler;\n };\n\n let initializedEditor: Editor | null = null;\n let initializedHandler: (() => void) | null = null;\n\n onMounted(() => {\n if (editor.value) {\n doInit(editor.value);\n } else {\n stopEditorWatch = watch(editor, (ed) => {\n if (ed) {\n doInit(ed);\n stopEditorWatch?.();\n stopEditorWatch = null;\n }\n });\n }\n });\n\n onScopeDispose(() => {\n stopEditorWatch?.();\n if (initializedEditor && initializedHandler) {\n initializedEditor.off('transaction', initializedHandler);\n if (!initializedEditor.isDestroyed) {\n initializedEditor.unregisterPlugin(pluginKey);\n }\n }\n });\n\n function updateContextItems(\n ed: Editor,\n ctxs: Record<string, string[] | true | null>,\n detectContext: (sel: SelectionShape, c: Record<string, string[] | true | null>) => string | null,\n resolveNames: (names: string[]) => BubbleMenuItem[],\n getFormatItems: () => ToolbarButton[],\n filterBySchema: (ctx: string, schemaItems: ToolbarButton[]) => ToolbarButton[],\n defaults: Map<string, BubbleMenuItem[]>,\n setItems: (items: BubbleMenuItem[]) => void,\n ) {\n const ctx = detectContext(ed.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) { setItems([]); return; }\n\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n setItems([]);\n return;\n }\n if (val === true) {\n setItems(filterBySchema(ctx, getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(filterBySchema(ctx, buttons).map(b => b.name));\n setItems(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n setItems(defaults.get(ctx) ?? []);\n }\n }\n\n const isItemActive = (item: ToolbarButton): boolean => {\n return activeMapRef.get(item.name) ?? false;\n };\n\n const isItemDisabled = (item: ToolbarButton): boolean => {\n return disabledMapRef.get(item.name) ?? false;\n };\n\n const executeCommand = (item: ToolbarButton) => {\n const ed = editor.value;\n if (!ed) return;\n if (item.emitEvent) {\n (ed.emit as (e: string, d: unknown) => void)(item.emitEvent, {});\n return;\n }\n ToolbarController.executeItem(ed as never, item);\n };\n\n const getCachedIcon = (name: string): string => {\n return defaultIcons[name] ?? '';\n };\n\n return {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n };\n}\n","import { computed, defineComponent, h } from 'vue';\nimport type { PropType, ShallowRef } from 'vue';\nimport type { Editor, ToolbarButton, BubbleMenuOptions } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useBubbleMenu, type BubbleMenuItem } from './useBubbleMenu.js';\n\nexport interface DomternalBubbleMenuProps {\n editor?: Editor;\n shouldShow?: BubbleMenuOptions['shouldShow'];\n placement?: 'top' | 'bottom';\n offset?: number;\n updateDelay?: number;\n items?: string[];\n contexts?: Record<string, string[] | true | null>;\n}\n\nexport const DomternalBubbleMenu = defineComponent({\n name: 'DomternalBubbleMenu',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n shouldShow: { type: Function as PropType<BubbleMenuOptions['shouldShow']>, default: undefined },\n placement: { type: String as PropType<'top' | 'bottom'>, default: 'top' },\n offset: { type: Number, default: 8 },\n updateDelay: { type: Number, default: 0 },\n items: { type: Array as PropType<string[]>, default: undefined },\n contexts: { type: Object as PropType<Record<string, string[] | true | null>>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n\n const {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n } = useBubbleMenu({\n editor: computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>,\n shouldShow: props.shouldShow,\n placement: props.placement,\n offset: props.offset,\n updateDelay: props.updateDelay,\n items: props.items,\n contexts: props.contexts,\n });\n\n return () => {\n // Read activeVersion to establish reactive dependency\n void activeVersion.value;\n\n return h('div', { ref: menuRef, class: 'dm-bubble-menu', role: 'toolbar', 'aria-label': 'Text formatting' }, [\n ...resolvedItems.value.map((item: BubbleMenuItem) => {\n if (item.type === 'separator') {\n return h('span', { key: item.name, class: 'dm-toolbar-separator', role: 'separator' });\n }\n\n const btn = item as ToolbarButton;\n const active = isItemActive(btn);\n return h('button', {\n key: btn.name,\n type: 'button',\n class: ['dm-toolbar-button', active && 'dm-toolbar-button--active'],\n disabled: isItemDisabled(btn),\n 'aria-label': btn.label,\n 'aria-pressed': active,\n title: btn.label,\n innerHTML: getCachedIcon(btn.icon),\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: () => executeCommand(btn),\n });\n }),\n slots['default']?.(),\n ]);\n };\n },\n});\n","import { defineComponent, h, onMounted, onScopeDispose, ref, watch } from 'vue';\nimport type { PropType } from 'vue';\nimport { PluginKey, createFloatingMenuPlugin } from '@domternal/core';\nimport type { Editor, FloatingMenuOptions } from '@domternal/core';\nimport { useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalFloatingMenuProps {\n editor?: Editor;\n shouldShow?: FloatingMenuOptions['shouldShow'];\n offset?: number;\n}\n\nexport const DomternalFloatingMenu = defineComponent({\n name: 'DomternalFloatingMenu',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n shouldShow: { type: Function as PropType<FloatingMenuOptions['shouldShow']>, default: undefined },\n offset: { type: Number, default: 0 },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n const menuRef = ref<HTMLDivElement>();\n const pluginKey = new PluginKey('vueFloatingMenu-' + Math.random().toString(36).slice(2, 8));\n\n let registered = false;\n let stopWatch: (() => void) | null = null;\n const doRegister = (editor: Editor) => {\n if (registered || editor.isDestroyed || !menuRef.value) return;\n registered = true;\n\n const plugin = createFloatingMenuPlugin({\n pluginKey,\n editor,\n element: menuRef.value,\n ...(props.shouldShow && { shouldShow: props.shouldShow }),\n offset: props.offset,\n });\n editor.registerPlugin(plugin);\n };\n\n onMounted(() => {\n const ed = props.editor ?? contextEditor.value;\n if (ed) {\n doRegister(ed);\n } else {\n stopWatch = watch(\n () => props.editor ?? contextEditor.value,\n (editor) => {\n if (editor) {\n doRegister(editor);\n stopWatch?.();\n stopWatch = null;\n }\n },\n );\n }\n });\n\n onScopeDispose(() => {\n stopWatch?.();\n const editor = props.editor ?? contextEditor.value;\n if (editor && !editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey);\n }\n });\n\n return () =>\n h('div', { ref: menuRef, class: 'dm-floating-menu' }, slots['default']?.());\n },\n});\n","import { computed, onScopeDispose, ref, watch } from 'vue';\nimport type { ShallowRef } from 'vue';\nimport { positionFloatingOnce } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\n/**\n * Delay before focusing a swatch after scrollTo - prevents onGridScroll from\n * overwriting activeCategory during the browser's native scroll settle.\n */\nconst SCROLL_SETTLE_MS = 50;\n\nexport function useEmojiPicker(editor: ShallowRef<Editor | null>, emojis: EmojiPickerItem[]) {\n const isOpen = ref(false);\n const searchQuery = ref('');\n const activeCategory = ref('');\n\n const pickerRef = ref<HTMLDivElement>();\n let anchorEl: HTMLElement | null = null;\n let cleanupFloating: (() => void) | null = null;\n let clickOutsideHandler: ((e: Event) => void) | null = null;\n let keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n\n const categories = computed(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of emojis) {\n let list = map.get(item.group);\n if (!list) { list = []; map.set(item.group, list); }\n list.push(item);\n }\n return map;\n });\n\n const categoryNames = computed(() => [...categories.value.keys()]);\n\n const filteredEmojis = computed(() => {\n const query = searchQuery.value.toLowerCase();\n if (!query) return [];\n const storage = getEmojiStorage(editor.value);\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) return searchFn(query);\n return emojis.filter(\n (item) => item.name.includes(query) || item.group.toLowerCase().includes(query),\n );\n });\n\n const frequentlyUsed = computed(() => {\n if (!isOpen.value) return [];\n const storage = getEmojiStorage(editor.value);\n const getFreq = storage?.['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage!['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n });\n\n function removeGlobalListeners() {\n if (clickOutsideHandler) {\n document.removeEventListener('mousedown', clickOutsideHandler);\n clickOutsideHandler = null;\n }\n if (keydownHandler) {\n document.removeEventListener('keydown', keydownHandler);\n keydownHandler = null;\n }\n }\n\n function close() {\n cleanupFloating?.();\n cleanupFloating = null;\n isOpen.value = false;\n setStorageOpen(editor.value, false);\n searchQuery.value = '';\n anchorEl = null;\n removeGlobalListeners();\n editor.value?.view.focus();\n }\n\n function addGlobalListeners() {\n clickOutsideHandler = (e: Event) => {\n const target = e.target as Node;\n if (\n pickerRef.value &&\n !pickerRef.value.contains(target) &&\n target !== anchorEl &&\n !anchorEl?.contains(target)\n ) {\n requestAnimationFrame(() => close());\n }\n };\n document.addEventListener('mousedown', clickOutsideHandler);\n\n keydownHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n };\n document.addEventListener('keydown', keydownHandler);\n }\n\n // Listen to insertEmoji event\n watch(\n editor,\n (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) return;\n\n const handler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n\n if (isOpen.value) {\n close();\n return;\n }\n\n anchorEl = data?.anchorElement ?? null;\n isOpen.value = true;\n setStorageOpen(ed, true);\n searchQuery.value = '';\n\n if (categoryNames.value.length > 0 && categoryNames.value[0]) {\n activeCategory.value = categoryNames.value[0];\n }\n\n addGlobalListeners();\n\n requestAnimationFrame(() => {\n const panel = pickerRef.value?.querySelector('.dm-emoji-picker') as HTMLElement | null;\n if (panel && anchorEl) {\n cleanupFloating?.();\n cleanupFloating = positionFloatingOnce(anchorEl, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = pickerRef.value?.querySelector('.dm-emoji-picker-search input') as HTMLInputElement | null;\n input?.focus({ preventScroll: true });\n });\n };\n\n (ed.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n\n onCleanup(() => {\n removeGlobalListeners();\n (ed.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n });\n },\n { immediate: true },\n );\n\n onScopeDispose(() => {\n removeGlobalListeners();\n cleanupFloating?.();\n cleanupFloating = null;\n });\n\n function selectEmoji(item: EmojiPickerItem) {\n const ed = editor.value;\n if (!ed) return;\n const cmd = ed.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n close();\n }\n\n function onSearch(event: Event) {\n searchQuery.value = (event.target as HTMLInputElement).value;\n }\n\n function scrollToCategory(cat: string) {\n searchQuery.value = '';\n activeCategory.value = cat;\n requestAnimationFrame(() => {\n const grid = pickerRef.value?.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const label = grid.querySelector(`[data-category=\"${cat}\"]`) as HTMLElement | null;\n if (label) {\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n // Defer focus until after scroll completes to avoid onGridScroll\n // resetting activeCategory while the scroll animation is in progress.\n setTimeout(() => {\n const firstSwatch = label.nextElementSibling;\n if (firstSwatch instanceof HTMLElement && firstSwatch.classList.contains('dm-emoji-swatch')) {\n firstSwatch.focus();\n }\n }, SCROLL_SETTLE_MS);\n }\n });\n }\n\n function onGridScroll() {\n if (searchQuery.value) return;\n const grid = pickerRef.value?.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n\n const labels = Array.from(grid.querySelectorAll('.dm-emoji-picker-category-label[data-category]')) as HTMLElement[];\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n if (currentCat && currentCat !== activeCategory.value) {\n activeCategory.value = currentCat;\n }\n }\n\n return {\n isOpen,\n searchQuery,\n activeCategory,\n categories,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n };\n}\n\nfunction getEmojiStorage(editor: Editor | null): Record<string, unknown> | null {\n if (!editor) return null;\n const storage = editor.storage as Record<string, unknown>;\n return (storage['emoji'] as Record<string, unknown>) ?? null;\n}\n\nfunction setStorageOpen(editor: Editor | null, open: boolean): void {\n if (!editor) return;\n const storage = getEmojiStorage(editor);\n if (storage) storage['isOpen'] = open;\n editor.view.dispatch(editor.view.state.tr);\n}\n","import { computed, defineComponent, h } from 'vue';\nimport type { PropType, ShallowRef } from 'vue';\nimport type { Editor } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useEmojiPicker, type EmojiPickerItem } from './useEmojiPicker.js';\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\nfunction categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n}\n\nfunction formatName(name: string): string {\n return name.replace(/_/g, ' ');\n}\n\nexport interface DomternalEmojiPickerProps {\n editor?: Editor;\n emojis: EmojiPickerItem[];\n}\n\nexport const DomternalEmojiPicker = defineComponent({\n name: 'DomternalEmojiPicker',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n emojis: { type: Array as PropType<EmojiPickerItem[]>, required: true },\n },\n setup(props) {\n const { editor: contextEditor } = useCurrentEditor();\n\n const {\n isOpen,\n searchQuery,\n activeCategory,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n categories,\n } = useEmojiPicker(\n computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>,\n props.emojis,\n );\n\n function onGridKeyDown(event: KeyboardEvent) {\n const grid = event.currentTarget as HTMLElement;\n const swatches = Array.from(grid.querySelectorAll('.dm-emoji-swatch')) as HTMLElement[];\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n let idx = swatches.indexOf(current);\n if (idx === -1) {\n // Focus is on grid container, not a swatch - enter the grid\n if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n swatches[0]?.focus();\n }\n return;\n }\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }\n\n function renderEmojiButton(item: EmojiPickerItem) {\n return h('button', {\n key: item.name,\n type: 'button',\n class: 'dm-emoji-swatch',\n tabindex: -1,\n title: formatName(item.name),\n 'aria-label': formatName(item.name),\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: () => selectEmoji(item),\n }, item.emoji);\n }\n\n return () => {\n if (!isOpen.value) {\n return h('div', { ref: pickerRef, class: 'dm-emoji-picker-host' });\n }\n\n return h('div', { ref: pickerRef, class: 'dm-emoji-picker-host' }, [\n h('div', { class: 'dm-emoji-picker' }, [\n // Search\n h('div', { class: 'dm-emoji-picker-search' }, [\n h('input', {\n type: 'text',\n placeholder: 'Search emoji...',\n 'aria-label': 'Search emoji',\n value: searchQuery.value,\n onInput: onSearch,\n onKeydown: (e: KeyboardEvent) => { if (e.key === 'Escape') close(); },\n }),\n ]),\n\n // Category tabs\n h('div', { class: 'dm-emoji-picker-tabs', role: 'tablist' },\n categoryNames.value.map((cat) =>\n h('button', {\n key: cat,\n type: 'button',\n class: ['dm-emoji-picker-tab', activeCategory.value === cat && 'dm-emoji-picker-tab--active'],\n role: 'tab',\n 'aria-selected': activeCategory.value === cat,\n title: cat,\n 'aria-label': cat,\n onMousedown: (e: MouseEvent) => e.preventDefault(),\n onClick: () => scrollToCategory(cat),\n }, categoryIcon(cat)),\n ),\n ),\n\n // Grid\n h('div', { class: 'dm-emoji-picker-grid', onScroll: onGridScroll, onKeydown: onGridKeyDown },\n searchQuery.value\n ? (filteredEmojis.value.length > 0\n ? filteredEmojis.value.map(renderEmojiButton)\n : [h('div', { class: 'dm-emoji-picker-empty' }, 'No emoji found')]\n )\n : [\n // Frequently used\n ...(frequentlyUsed.value.length > 0\n ? [\n h('div', { class: 'dm-emoji-picker-category-label' }, 'Frequently Used'),\n ...frequentlyUsed.value.map(renderEmojiButton),\n ]\n : []),\n // All categories\n ...categoryNames.value.flatMap((cat) => [\n h('div', {\n key: `label-${cat}`,\n class: 'dm-emoji-picker-category-label',\n 'data-category': cat,\n }, cat),\n ...(categories.value.get(cat) ?? []).map(renderEmojiButton),\n ]),\n ],\n ),\n ]),\n ]);\n };\n },\n});\n","import { inject } from 'vue';\nimport type { InjectionKey } from 'vue';\n\n/**\n * Injection key for the drag start handler in node views.\n * Provided by VueNodeViewRenderer's extended component,\n * consumed by NodeViewWrapper.\n */\nexport const NODE_VIEW_ON_DRAG_START: InjectionKey<(event: DragEvent) => void> =\n Symbol('domternal-node-view-drag');\n\n/**\n * Injection key for the content DOM ref callback in node views.\n * Provided by VueNodeViewRenderer's extended component,\n * consumed by NodeViewContent.\n */\nexport const NODE_VIEW_CONTENT_REF: InjectionKey<(el: HTMLElement | null) => void> =\n Symbol('domternal-node-view-content');\n\n/**\n * Convenience composable for accessing node view context.\n * Use inside custom node view components built with VueNodeViewRenderer.\n *\n * @example\n * ```ts\n * const { onDragStart, nodeViewContentRef } = useVueNodeView();\n * ```\n */\nexport function useVueNodeView() {\n const onDragStart = inject(NODE_VIEW_ON_DRAG_START, undefined);\n const nodeViewContentRef = inject(NODE_VIEW_CONTENT_REF, undefined);\n return { onDragStart, nodeViewContentRef };\n}\n","import { defineComponent, h, markRaw, provide, render, shallowReactive } from 'vue';\nimport type { AppContext, Component } from 'vue';\nimport type { Editor, NodeViewContext } from '@domternal/core';\nimport { appContextStore, pendingAppContextStore } from '../utils.js';\nimport { NODE_VIEW_ON_DRAG_START, NODE_VIEW_CONTENT_REF } from './VueNodeViewContext.js';\n\n/** ProseMirror node shape passed to node views. */\ninterface PMNode {\n type: { name: string; spec: { group?: string } };\n attrs: Record<string, unknown>;\n textContent: string;\n nodeSize: number;\n}\n\n/**\n * Props passed to custom Vue node view components.\n */\nexport interface VueNodeViewProps {\n editor: Editor;\n node: PMNode;\n selected: boolean;\n getPos: () => number | undefined;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n deleteNode: () => void;\n extension: { name: string; options: Record<string, unknown> };\n decorations: readonly unknown[];\n}\n\nexport interface VueNodeViewRendererOptions {\n /** Wrapper element tag. @default 'div' for block, 'span' for inline */\n as?: string;\n /** Additional CSS class on the wrapper element. */\n className?: string;\n /** Tag for the content DOM element. Set to null for no editable content. @default 'div' */\n contentDOMElement?: string | null;\n}\n\n/**\n * Converts a Vue component into a ProseMirror NodeView constructor.\n *\n * Uses Vue's low-level `render(h(), el)` API with appContext forwarding\n * so that provide/inject from the parent component tree works inside\n * node view components.\n *\n * @example\n * ```ts\n * const ImageExtension = Image.extend({\n * addNodeView() {\n * return VueNodeViewRenderer(ImageComponent);\n * }\n * });\n * ```\n */\nexport function VueNodeViewRenderer(\n component: Component,\n options: VueNodeViewRendererOptions = {},\n) {\n // Handle class-based Vue components with __vccOpts\n const normalizedComponent: Component = typeof component === 'function' && '__vccOpts' in component\n ? ((component as unknown as Record<string, Component>)['__vccOpts'] ?? component)\n : component;\n\n markRaw(normalizedComponent);\n\n const constructor = (node: PMNode, _view: unknown, getPos: () => number | undefined, decorations: readonly unknown[]): VueNodeView | { dom: HTMLElement; update: () => boolean; destroy: () => void } => {\n const ctx = (constructor as unknown as { __domternalContext?: NodeViewContext }).__domternalContext;\n const editor = ctx?.editor as Editor;\n const extension = ctx?.extension ?? { name: node.type.name, options: {} };\n\n // Look up appContext for this editor. Node view constructors fire DURING\n // new Editor() (before editor.value is set by useEditor), so the\n // per-editor store may be empty. Fall back to pendingAppContextStore\n // which provideEditor() populates synchronously on setup.\n // If neither is found, provideEditor() was never called - warn and bail.\n let appContext = editor ? appContextStore.get(editor) : undefined;\n if (!appContext) {\n appContext = pendingAppContextStore.value ?? undefined;\n if (appContext && editor) {\n // Associate with the editor so later updates use the per-editor entry\n appContextStore.set(editor, appContext);\n }\n }\n if (!appContext) {\n if (typeof globalThis !== 'undefined' && (globalThis as { __DEV__?: boolean }).__DEV__ !== false) {\n console.warn(\n '[VueNodeViewRenderer] appContext not found for editor. ' +\n 'Custom Vue node views require provideEditor(editor) to be called, ' +\n 'either manually after useEditor() or automatically via <Domternal> root.',\n );\n }\n const dom = document.createElement('div');\n return { dom, update: () => false, destroy: () => {} };\n }\n\n return new VueNodeView(normalizedComponent, {\n editor,\n node,\n getPos,\n decorations,\n extension,\n }, options, appContext);\n };\n\n return constructor;\n}\n\ninterface VueNodeViewInit {\n editor: Editor;\n node: PMNode;\n getPos: () => number | undefined;\n decorations: readonly unknown[];\n extension: { name: string; options: Record<string, unknown> };\n}\n\nclass VueNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement | null = null;\n private props: VueNodeViewProps;\n private editor: Editor;\n private appContext: AppContext;\n\n constructor(\n component: Component,\n init: VueNodeViewInit,\n options: VueNodeViewRendererOptions,\n appContext: AppContext,\n ) {\n this.editor = init.editor;\n this.appContext = appContext;\n\n const isInline = init.node.type.spec.group === 'inline';\n const tag = options.as ?? (isInline ? 'span' : 'div');\n\n this.dom = document.createElement(tag);\n this.dom.setAttribute('data-node-view-wrapper', '');\n if (options.className) {\n this.dom.className = options.className;\n }\n\n // Content DOM for editable nested content\n if (options.contentDOMElement !== null) {\n const contentTag = options.contentDOMElement ?? (isInline ? 'span' : 'div');\n this.contentDOM = document.createElement(contentTag);\n this.contentDOM.setAttribute('data-node-view-content', '');\n this.contentDOM.style.whiteSpace = 'pre-wrap';\n }\n\n const contentDOM = this.contentDOM;\n\n // Shallow-reactive props: only top-level mutations trigger re-renders.\n // Editor/node are markRaw'd (skipped by reactivity anyway); shallowReactive\n // avoids Vue walking into them on every access.\n this.props = shallowReactive({\n editor: markRaw(init.editor),\n node: markRaw(init.node),\n selected: false,\n getPos: init.getPos,\n extension: init.extension,\n decorations: init.decorations,\n updateAttributes: (attrs: Record<string, unknown>) => {\n const pos = init.getPos();\n if (pos === undefined) return;\n const { tr } = this.editor.view.state;\n tr.setNodeMarkup(pos, undefined, { ...this.props.node.attrs, ...attrs });\n this.editor.view.dispatch(tr);\n },\n deleteNode: () => {\n const pos = init.getPos();\n if (pos === undefined) return;\n const { tr } = this.editor.view.state;\n tr.delete(pos, pos + this.props.node.nodeSize);\n this.editor.view.dispatch(tr);\n },\n }) as VueNodeViewProps;\n\n // Create extended component that provides node view context\n const onDragStart = (event: DragEvent) => {\n if (this.editor.view.dragging) {\n event.dataTransfer?.setData('text/plain', this.props.node.textContent);\n }\n };\n\n const contentRefCallback = (el: HTMLElement | null) => {\n if (el && contentDOM && !el.contains(contentDOM)) {\n el.appendChild(contentDOM);\n }\n };\n\n // Wrapper component that provides node-view context to the user's\n // component and renders it as a child. Using a wrapper (instead of\n // h(component, reactiveProps) directly) ensures that mutations on\n // `reactiveProps` reliably propagate to the child: the wrapper's render\n // function re-runs on reactive changes, and the child component\n // receives a fresh props reference each time.\n const reactiveProps = this.props;\n const extended = defineComponent({\n setup() {\n provide(NODE_VIEW_ON_DRAG_START, onDragStart);\n provide(NODE_VIEW_CONTENT_REF, contentRefCallback);\n // Return render function that reads from reactiveProps - accessing\n // any reactive property creates a dependency, triggering re-render.\n return () =>\n h(component, {\n editor: reactiveProps.editor,\n node: reactiveProps.node,\n selected: reactiveProps.selected,\n getPos: reactiveProps.getPos,\n updateAttributes: reactiveProps.updateAttributes,\n deleteNode: reactiveProps.deleteNode,\n extension: reactiveProps.extension,\n decorations: reactiveProps.decorations,\n });\n },\n });\n\n // Render with appContext forwarding for provide/inject chain\n const vNode = h(extended);\n vNode.appContext = this.appContext;\n render(vNode, this.dom);\n }\n\n update(node: PMNode, decorations: readonly unknown[]): boolean {\n if (node.type.name !== this.props.node.type.name) return false;\n this.props.node = markRaw(node);\n this.props.decorations = decorations;\n return true;\n }\n\n selectNode() {\n this.props.selected = true;\n }\n\n deselectNode() {\n this.props.selected = false;\n }\n\n destroy() {\n render(null, this.dom);\n }\n\n ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Node }): boolean {\n if (!this.contentDOM) return true;\n return !this.contentDOM.contains(mutation.target);\n }\n\n stopEvent(): boolean {\n return false;\n }\n}\n","import { defineComponent, h, inject } from 'vue';\nimport { NODE_VIEW_ON_DRAG_START } from './VueNodeViewContext.js';\n\n/**\n * Container component for custom Vue node view UIs.\n * Must wrap the root element of every VueNodeViewRenderer component.\n *\n * @example\n * ```vue\n * <template>\n * <NodeViewWrapper as=\"div\">\n * <img :src=\"node.attrs.src\" />\n * </NodeViewWrapper>\n * </template>\n * ```\n */\nexport const NodeViewWrapper = defineComponent({\n name: 'NodeViewWrapper',\n props: {\n as: { type: String, default: 'div' },\n },\n setup(props, { slots, attrs }) {\n const onDragStart = inject(NODE_VIEW_ON_DRAG_START, undefined);\n\n return () =>\n h(\n props.as,\n {\n ...attrs,\n 'data-node-view-wrapper': '',\n style: { whiteSpace: 'normal', ...(attrs.style as Record<string, string> | undefined) },\n onDragstart: onDragStart,\n },\n slots['default']?.(),\n );\n },\n});\n","import { defineComponent, h, inject } from 'vue';\nimport { NODE_VIEW_CONTENT_REF } from './VueNodeViewContext.js';\n\n/**\n * Placeholder for editable nested content within a node view.\n * ProseMirror manages the content DOM - do not render children inside this component.\n *\n * @example\n * ```vue\n * <template>\n * <NodeViewWrapper>\n * <h3>Custom heading</h3>\n * <NodeViewContent />\n * </NodeViewWrapper>\n * </template>\n * ```\n */\nexport const NodeViewContent = defineComponent({\n name: 'NodeViewContent',\n props: {\n as: { type: String, default: 'div' },\n },\n setup(props, { attrs }) {\n const nodeViewContentRef = inject(NODE_VIEW_CONTENT_REF, undefined);\n\n return () => {\n const baseProps: Record<string, unknown> = {\n ...attrs,\n 'data-node-view-content': '',\n style: { whiteSpace: 'pre-wrap', ...(attrs.style as Record<string, string> | undefined) },\n };\n if (nodeViewContentRef) {\n baseProps['ref'] = nodeViewContentRef;\n }\n return h(props.as, baseProps);\n };\n },\n});\n","// Composables\nexport { useEditor, DEFAULT_EXTENSIONS } from './useEditor.js';\nexport type { UseEditorOptions } from './useEditor.js';\nexport { useEditorState } from './useEditorState.js';\nexport type { EditorState } from './useEditorState.js';\nexport { useCurrentEditor, provideEditor, EDITOR_KEY } from './EditorContext.js';\n\n// Composable component\nexport { Domternal } from './Domternal.js';\nexport type { DomternalProps } from './Domternal.js';\n\n// Components\nexport { DomternalEditor } from './DomternalEditor.js';\nexport type { DomternalEditorProps } from './DomternalEditor.js';\nexport { EditorContent } from './EditorContent.js';\nexport { DomternalToolbar } from './toolbar/DomternalToolbar.js';\nexport type { DomternalToolbarProps } from './toolbar/DomternalToolbar.js';\nexport { DomternalBubbleMenu } from './bubble-menu/DomternalBubbleMenu.js';\nexport type { DomternalBubbleMenuProps } from './bubble-menu/DomternalBubbleMenu.js';\nexport { DomternalFloatingMenu } from './DomternalFloatingMenu.js';\nexport type { DomternalFloatingMenuProps } from './DomternalFloatingMenu.js';\nexport { DomternalEmojiPicker } from './emoji-picker/DomternalEmojiPicker.js';\nexport type { DomternalEmojiPickerProps } from './emoji-picker/DomternalEmojiPicker.js';\nexport type { EmojiPickerItem } from './emoji-picker/useEmojiPicker.js';\n\n// Node Views\nexport { VueNodeViewRenderer } from './node-views/VueNodeViewRenderer.js';\nexport type { VueNodeViewProps, VueNodeViewRendererOptions } from './node-views/VueNodeViewRenderer.js';\nexport { NodeViewWrapper } from './node-views/NodeViewWrapper.js';\nexport { NodeViewContent } from './node-views/NodeViewContent.js';\nexport { useVueNodeView } from './node-views/VueNodeViewContext.js';\n\n// Re-export commonly used types and utilities from core for convenience\nexport { Editor } from '@domternal/core';\nexport type { Content, AnyExtension, FocusPosition, JSONContent } from '@domternal/core';\n\n// SSR helpers - work without an editor instance (server-safe)\nexport { generateHTML, generateJSON, generateText } from '@domternal/core';\nexport type { GenerateHTMLOptions, GenerateJSONOptions, GenerateTextOptions } from '@domternal/core';\n\n// Wire up Domternal namespaced subcomponents\nimport { Domternal } from './Domternal.js';\nimport { DomternalToolbar } from './toolbar/DomternalToolbar.js';\nimport { DomternalBubbleMenu } from './bubble-menu/DomternalBubbleMenu.js';\nimport { DomternalFloatingMenu } from './DomternalFloatingMenu.js';\nimport { DomternalEmojiPicker } from './emoji-picker/DomternalEmojiPicker.js';\n\nDomternal.Toolbar = DomternalToolbar;\nDomternal.BubbleMenu = DomternalBubbleMenu;\nDomternal.FloatingMenu = DomternalFloatingMenu;\nDomternal.EmojiPicker = DomternalEmojiPicker;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@domternal/vue",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "Vue 3 components for Domternal editor",
|
|
5
|
+
"author": "https://github.com/ThomasNowHere",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"@domternal/source": "./src/index.ts",
|
|
12
|
+
"import": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"vue": ">=3.3",
|
|
23
|
+
"@domternal/core": ">=0.6.0"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"prepublishOnly": "node -e \"const p=JSON.parse(require('fs').readFileSync('package.json','utf8'));delete p.devDependencies;if(p.dependencies){for(const[k,v]of Object.entries(p.dependencies)){if(v==='workspace:*')p.dependencies[k]='>=0.6.0'}}require('fs').writeFileSync('package.json',JSON.stringify(p,null,2)+'\\n')\"",
|
|
30
|
+
"postpublish": "git checkout package.json"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"vue",
|
|
34
|
+
"vue3",
|
|
35
|
+
"prosemirror",
|
|
36
|
+
"editor",
|
|
37
|
+
"rich-text",
|
|
38
|
+
"domternal"
|
|
39
|
+
],
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+https://github.com/domternal/domternal.git",
|
|
43
|
+
"directory": "packages/vue"
|
|
44
|
+
},
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/domternal/domternal/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://domternal.dev"
|
|
49
|
+
}
|