@domternal/vue 0.9.1 → 0.11.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 +3 -3
- package/dist/index.js +24 -23
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useEditor.ts","../src/utils.ts","../src/useEditorState.ts","../src/EditorContext.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/Domternal.ts","../src/DomternalEditor.ts","../src/EditorContent.ts","../src/notion-color-picker/useNotionColorPicker.ts","../src/notion-color-picker/DomternalNotionColorPicker.ts","../src/node-views/VueNodeViewContext.ts","../src/node-views/VueNodeViewRenderer.ts","../src/node-views/NodeViewWrapper.ts","../src/node-views/NodeViewContent.ts"],"names":["ref","watch","shallowRef","onScopeDispose","defineComponent","h","computed","ToolbarController","onMounted","defaultIcons","DROPDOWN_CARET","positionFloatingOnce","PluginKey","watchEffect","setStorageOpen","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): void {\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): Editor {\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(): void {\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, Ref } 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 * Previous rAFs are cancelled on each update so only one trigger fires per\n * double-frame window, preventing re-render storms during rapid\n * ProseMirror transactions (e.g. while typing).\n */\nexport function useDebouncedRef<T>(initialValue: T): Ref<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 * The core Editor is framework-agnostic, so a WeakMap associates each Editor\n * with its 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 html: string;\n json: JSONContent | null;\n empty: boolean;\n focused: boolean;\n editable: boolean;\n} {\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 = (): void => {\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 = (): void => {\n if (!isFocused.value) isFocused.value = true;\n };\n\n const onBlur = (): void => {\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 = (): void => { 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 = (): typeof instance.appContext => {\n const ctx = Object.create(instance.appContext) as typeof instance.appContext;\n const instanceWithProvides = instance as unknown as { provides: Record<string | symbol, unknown> };\n (ctx as unknown as { provides: Record<string | symbol, unknown> }).provides = instanceWithProvides.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 { onScopeDispose, ref, shallowRef, watch } from 'vue';\nimport type { Ref, 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 interface UseToolbarControllerResult {\n controller: { readonly current: ToolbarController | null };\n groups: ShallowRef<ToolbarGroup[]>;\n focusedIndex: Ref<number>;\n openDropdown: Ref<string | null>;\n activeVersion: Ref<number>;\n toolbarRef: Ref<HTMLDivElement | undefined>;\n isActive: (name: string) => boolean;\n isDisabled: (name: string) => boolean;\n isDropdownActive: (dropdown: ToolbarDropdown) => boolean;\n getAriaExpanded: (item: ToolbarButton) => string | null;\n getFlatIndex: (name: string) => number;\n handleDropdownToggle: (dropdown: ToolbarDropdown) => void;\n closeDropdown: () => void;\n executeCommand: (item: ToolbarButton) => void;\n syncState: () => void;\n}\n\nexport function useToolbarController(\n editor: ShallowRef<Editor | null>,\n layout?: ToolbarLayoutEntry[],\n): UseToolbarControllerResult {\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(): void {\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');\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 const ctl = controller;\n if (!ctl) return false;\n return dropdown.items.some((item: ToolbarButton) => ctl.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): void {\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<HTMLElement>('[aria-expanded=\"true\"]');\n const panel = trigger?.parentElement?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\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(): void {\n cleanupFloating?.();\n cleanupFloating = null;\n controller?.closeDropdown();\n syncState();\n }\n\n function executeCommand(item: ToolbarButton): void {\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 interface UseToolbarIconsResult {\n resolveIconSvg: (name: string) => string;\n getCachedIcon: (name: string) => string;\n getCachedTriggerLabel: (label: string, isIcon?: boolean) => string;\n getCachedTriggerIcon: (iconName: string) => string;\n getCachedItemContent: (iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon') => string;\n getDropdownTriggerHtml: (dropdown: ToolbarDropdown, activeItem: ToolbarButton | undefined) => string;\n}\n\nexport function useToolbarIcons(icons?: IconSet | null): UseToolbarIconsResult {\n const cache = new Map<string, string>();\n let prevIcons = icons;\n\n function checkCacheInvalidation(currentIcons: IconSet | null | undefined): void {\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(): { getTooltip: (item: ToolbarButton) => string } {\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 onKeyDown: (event: KeyboardEvent) => void;\n focusCurrentButton: () => void;\n} {\n function focusCurrentButton(): void {\n const buttons = toolbarRef.value?.querySelectorAll<HTMLElement>('.dm-toolbar-button');\n const controller = controllerRef.current;\n if (buttons && controller) {\n const btn = buttons[controller.focusedIndex];\n btn?.focus();\n }\n }\n\n function focusDropdownItem(direction: number, first?: boolean): void {\n const panel = toolbarRef.value?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\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): void {\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\nfunction resolveElementAtCursor(editor: Editor): HTMLElement | null {\n const { from } = editor.state.selection;\n const { node } = editor.view.domAtPos(from);\n return node instanceof HTMLElement ? node : node.parentElement;\n}\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 node = resolveElementAtCursor(editor);\n if (!node) return null;\n\n const inline = node.style.getPropertyValue(prop);\n if (inline) return inline;\n\n return window.getComputedStyle(node).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 node = resolveElementAtCursor(editor);\n if (!node) return null;\n\n return node.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 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): void {\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 target = event?.target as HTMLElement | undefined;\n const anchor = target?.closest<HTMLElement>('.dm-toolbar-button') ?? target;\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): void {\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<HTMLElement>('.dm-toolbar-dropdown-trigger') ?? 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): void {\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;\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;\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 { Ref, ShallowRef } from 'vue';\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n defaultIcons,\n} from '@domternal/core';\nimport type { Editor, IconSet, ToolbarButton, ToolbarDropdown, 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 | ToolbarDropdown | BubbleMenuSeparator;\n\n/**\n * Live state for the bubble-menu trailing buttons. Mirrors Angular's\n * `syncTrailingButtonsState` output. Computed per editor transaction and\n * coalesced into a single object so each transaction triggers at most one\n * re-render.\n */\nexport interface BubbleMenuTrailingState {\n /** True when current selection is a NodeSelection (image, HR, ...). Trailing buttons hide in that case. */\n isNodeSelection: boolean;\n /** True when the `notionColorPicker` extension is loaded on this editor (cached once per editor). */\n showColorPickerButton: boolean;\n /** True when the `blockContextMenu` extension is loaded on this editor (cached once per editor). */\n showBlockMenuButton: boolean;\n /** True when the selection spans more than one top-level block (multi-block \"...\" disable). */\n blockMenuButtonDisabled: boolean;\n /** CSS color value for the \"A\" trigger glyph (e.g. `var(--dm-block-text-yellow)`), or null. */\n currentTextColorVar: string | null;\n /** CSS color value for the \"A\" trigger underline, or null. */\n currentBgColorVar: string | null;\n /** True when any token-based text or background color is applied at the cursor. */\n hasAnyColor: boolean;\n}\n\nconst INITIAL_TRAILING_STATE: BubbleMenuTrailingState = {\n isNodeSelection: false,\n showColorPickerButton: false,\n showBlockMenuButton: false,\n blockMenuButtonDisabled: false,\n currentTextColorVar: null,\n currentBgColorVar: null,\n hasAnyColor: false,\n};\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 icons?: ShallowRef<IconSet | undefined> | undefined;\n}\n\nexport interface UseBubbleMenuResult {\n menuRef: Ref<HTMLDivElement | undefined>;\n resolvedItems: ShallowRef<BubbleMenuItem[]>;\n isItemActive: (item: ToolbarButton) => boolean;\n isItemDisabled: (item: ToolbarButton) => boolean;\n executeCommand: (item: ToolbarButton, event?: Event) => void;\n activeVersion: Ref<number>;\n getCachedIcon: (name: string) => string;\n /** Live trailing-button state (color preview, node-selection gate, multi-block disable). */\n trailing: ShallowRef<BubbleMenuTrailingState>;\n /** Open the Notion color picker by emitting `notionColorOpen` with the trigger as anchor. */\n openColorPicker: (anchor: HTMLElement) => void;\n /** Open the block context menu by dispatching `dm:block-context-menu-open` on `.dm-editor`. */\n openBlockContextMenu: (anchor: HTMLElement) => void;\n}\n\nexport function useBubbleMenu(options: UseBubbleMenuOptions): UseBubbleMenuResult {\n const { editor, shouldShow, placement = 'top', offset = 8, updateDelay = 0, items, contexts: explicitContexts, icons: iconsRef } = options;\n\n const menuRef = ref<HTMLDivElement>();\n // Prefer crypto.randomUUID for collision-free uniqueness when two\n // bubble-menu instances mount in the same editor (Math.random across\n // simultaneous mounts has a small but real collision probability, and\n // SSR may share the random seed). Matches Angular/React wrappers.\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const pluginKey = new PluginKey(\n 'vueBubbleMenu-' +\n (cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8)),\n );\n const resolvedItems = shallowRef<BubbleMenuItem[]>([]);\n // `useDebouncedRef` batches transaction-rate updates via double-rAF, so\n // each keystroke triggers at most one re-render even though the plugin\n // fires `transaction` on every keystroke. See utils.ts.\n const activeVersion = useDebouncedRef(0);\n // Coalesced trailing-button state, updated once per transaction.\n const trailing = shallowRef<BubbleMenuTrailingState>(INITIAL_TRAILING_STATE);\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 / dropdownMap / bubbleDefaults are only used inside doInit;\n // declared here so closures inside doInit can rebind on each run.\n let itemMap: Map<string, ToolbarButton>;\n let dropdownMap: Map<string, ToolbarDropdown>;\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): void => {\n if (initialized || ed.isDestroyed || !menuRef.value) return;\n initialized = true;\n\n // Resolve effective contexts: explicit user prop takes priority,\n // then items-only mode disables contexts entirely, otherwise fall\n // back to the standard default (Notion-richer when the editor sits\n // inside `.dm-notion-mode`).\n const contexts = explicitContexts ?? (items ? undefined : defaultBubbleContexts(ed));\n\n // Extension presence is immutable after editor construction: cache once\n // instead of walking the extension list on every transaction.\n const exts = ed.extensionManager.extensions;\n const hasNotionColorPicker = exts.some((e) => e.name === 'notionColorPicker');\n const hasBlockContextMenu = exts.some((e) => e.name === 'blockContextMenu');\n\n // Build item map. Dropdowns are kept separately so we can resolve them\n // by name (text-align dropdown in the bubble menu).\n itemMap = new Map();\n dropdownMap = 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 dropdownMap.set(item.name, item);\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): void => {\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-${String(sepIdx++)}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n bubbleDefaults.set(ctx, result);\n }\n\n // Resolve names helper. Dropdowns take priority over buttons sharing the\n // same name (mirrors the Angular wrapper). Pipe `|` is a separator marker.\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-${String(sepIdx++)}` });\n } else {\n const dropdown = dropdownMap.get(name);\n if (dropdown) { result.push(dropdown); continue; }\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) return false;\n if (state.selection.node) return bubbleDefaults.has(state.selection.node.type.name);\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[]): void => {\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): void => {\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 const trackButton = (btn: ToolbarButton): void => {\n activeMapRef.set(btn.name, ToolbarController.resolveActive(currentEd as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n disabledMapRef.set(btn.name, canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false);\n } catch { disabledMapRef.set(btn.name, false); }\n };\n\n for (const item of currentResolvedItems) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n // Track each child so dynamicIcon + isActive lookups work.\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n };\n\n const defaultItems = items ? resolveNames(items) : resolveNames(['bold', 'italic', 'underline']);\n\n /**\n * Coalesce all trailing-button derivations into a single shallowRef\n * update per transaction. New object identity ensures Vue's reactivity\n * triggers exactly one render per tick.\n */\n const syncTrailingState = (currentEd: Editor): void => {\n const sel = currentEd.state.selection as unknown as SelectionShape;\n const isNode = !!sel.node;\n\n // Multi-block disable for the \"...\" trigger: when $from and $to live\n // under different top-level blocks the context menu has no unambiguous\n // target. Cheap O(1) check via $.before(1).\n let blockMenuDisabled = false;\n if (hasBlockContextMenu) {\n const { $from, $to } = currentEd.state.selection;\n if ($from.depth < 1 || $to.depth < 1) {\n blockMenuDisabled = true;\n } else {\n blockMenuDisabled = $from.before(1) !== $to.before(1);\n }\n }\n\n // Color preview for the \"A\" trigger glyph + underline. Read the\n // textStyle mark at $from; null tokens render as transparent.\n let textVar: string | null = null;\n let bgVar: string | null = null;\n let hasAny = false;\n if (hasNotionColorPicker) {\n const mark = currentEd.state.selection.$from\n .marks()\n .find((m) => m.type.name === 'textStyle');\n const attrs = (mark?.attrs ?? {}) as {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\n const tToken = attrs.colorToken ?? null;\n const bToken = attrs.backgroundColorToken ?? null;\n textVar = tToken ? `var(--dm-block-text-${tToken})` : null;\n bgVar = bToken ? `var(--dm-block-bg-${bToken})` : null;\n hasAny = tToken !== null || bToken !== null;\n }\n\n trailing.value = {\n isNodeSelection: isNode,\n showColorPickerButton: hasNotionColorPicker,\n showBlockMenuButton: hasBlockContextMenu,\n blockMenuButtonDisabled: blockMenuDisabled,\n currentTextColorVar: textVar,\n currentBgColorVar: bgVar,\n hasAnyColor: hasAny,\n };\n };\n\n // Transaction handler\n const transactionHandler = (): void => {\n if (contexts) {\n updateContextItems(ed, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else {\n const sel = ed.state.selection as unknown as SelectionShape;\n if (sel.node && bubbleDefaults.has(sel.node.type.name)) {\n setItems(bubbleDefaults.get(sel.node.type.name) ?? []);\n } else {\n setItems(defaultItems);\n }\n }\n updateStates(ed);\n syncTrailingState(ed);\n activeVersion.value++;\n };\n ed.on('transaction', transactionHandler);\n updateStates(ed);\n syncTrailingState(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 ): void {\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, event?: Event): void => {\n const ed = editor.value;\n if (!ed) return;\n if (item.emitEvent) {\n // Forward the clicked button as the anchor so listeners (LinkPopover,\n // image popover, emoji picker, NotionColorPicker) can position their\n // panels against it. Matches Angular wrapper behaviour.\n const anchor =\n (event?.currentTarget as HTMLElement | undefined) ??\n (event?.target as HTMLElement | undefined) ?? null;\n (ed.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n ToolbarController.executeItem(ed as never, item);\n };\n\n const getCachedIcon = (name: string): string => {\n return iconsRef?.value?.[name] ?? defaultIcons[name] ?? '';\n };\n\n /**\n * Emit `notionColorOpen` with the trigger as anchor. The wrapper\n * `DomternalNotionColorPicker` listens and positions itself against the\n * anchor element.\n */\n const openColorPicker = (anchor: HTMLElement): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n };\n\n /**\n * Open the BlockContextMenu against the cursor's containing block. Walk one\n * level up when the cursor's textblock is not a direct doc child (e.g.\n * cursor in `listItem > paragraph` targets the listItem) so Delete /\n * Turn into operate on the visual block the user is editing.\n */\n const openBlockContextMenu = (anchor: HTMLElement): void => {\n const ed = editor.value;\n if (!ed) return;\n const $from = ed.state.selection.$from;\n if ($from.depth < 1) return;\n const depth = $from.depth > 1 && $from.node($from.depth - 1).type.name !== 'doc'\n ? $from.depth - 1\n : $from.depth;\n const blockPos = $from.before(depth);\n const editorEl = ed.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }));\n };\n\n return {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n trailing,\n openColorPicker,\n openBlockContextMenu,\n };\n}\n","import { computed, defineComponent, h, ref, watch } from 'vue';\nimport type { PropType, ShallowRef, VNode } from 'vue';\nimport {\n ToolbarController,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type { Editor, IconSet, ToolbarButton, ToolbarDropdown, BubbleMenuOptions } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useBubbleMenu } from './useBubbleMenu.js';\n\nconst DROPDOWN_CARET =\n '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">' +\n '<path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\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 /** Custom icon overrides. Falls back to default Phosphor icons for unmapped keys. */\n icons?: IconSet;\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 icons: { type: Object as PropType<IconSet>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n // `computed` returns ComputedRef but useBubbleMenu expects ShallowRef. Cast\n // is safe (both share the same .value interface and watch subscribes to either)\n // and matches the wrapper convention (see useEmojiPicker).\n const editorRef = computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>;\n const iconsRef = computed(() => props.icons) as ShallowRef<IconSet | undefined>;\n\n const {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n trailing,\n openColorPicker,\n openBlockContextMenu,\n } = useBubbleMenu({\n editor: editorRef,\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 icons: iconsRef,\n });\n\n // Only one dropdown is open at a time across the entire bubble menu - the\n // Angular component enforces the same constraint via `openDropdown` signal.\n const openDropdown = ref<string | null>(null);\n const closeDropdown = (): void => { openDropdown.value = null; };\n\n const executeSubItem = (sub: ToolbarButton): void => {\n closeDropdown();\n const ed = editorRef.value;\n if (!ed) return;\n ToolbarController.executeItem(ed as never, sub);\n requestAnimationFrame(() => { ed.view.focus(); });\n };\n\n // Refs to the trailing trigger buttons so we can pass the element as anchor\n // to the color picker and block context menu (positioning targets).\n const colorBtnRef = ref<HTMLButtonElement>();\n const blockMenuBtnRef = ref<HTMLButtonElement>();\n\n return () => {\n // Read activeVersion to establish reactive dependency\n void activeVersion.value;\n const t = trailing.value;\n\n const children: VNode[] = [];\n\n for (const item of resolvedItems.value) {\n if (item.type === 'separator') {\n children.push(h('span', { key: item.name, class: 'dm-toolbar-separator', role: 'separator' }));\n continue;\n }\n if (item.type === 'dropdown') {\n children.push(\n h(BubbleDropdown, {\n key: item.name,\n dropdown: item,\n isOpen: openDropdown.value === item.name,\n isItemActive,\n getCachedIcon,\n activeVersion: activeVersion.value,\n executeSubItem,\n onToggle: (): void => {\n openDropdown.value = openDropdown.value === item.name ? null : item.name;\n },\n onClose: closeDropdown,\n }),\n );\n continue;\n }\n const btn = item;\n const active = isItemActive(btn);\n children.push(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: (e: MouseEvent) => { executeCommand(btn, e); },\n }));\n }\n\n if (t.showColorPickerButton && !t.isNodeSelection) {\n children.push(\n h('span', { class: 'dm-toolbar-separator', role: 'separator' }),\n h('button', {\n ref: colorBtnRef,\n type: 'button',\n class: ['dm-toolbar-button', 'dm-ncp-trigger', t.hasAnyColor && 'dm-toolbar-button--active'],\n title: 'Text and background color',\n 'aria-label': 'Text and background color',\n 'aria-haspopup': 'dialog',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { if (colorBtnRef.value) openColorPicker(colorBtnRef.value); },\n }, [\n h('span', {\n class: 'dm-ncp-trigger-glyph',\n style: t.currentTextColorVar ? { color: t.currentTextColorVar } : undefined,\n }, 'A'),\n h('span', {\n class: 'dm-ncp-trigger-underline',\n style: t.currentBgColorVar ? { backgroundColor: t.currentBgColorVar } : undefined,\n }),\n ]),\n );\n }\n\n if (t.showBlockMenuButton && !t.isNodeSelection) {\n children.push(\n h('span', { class: 'dm-toolbar-separator', role: 'separator' }),\n h('button', {\n ref: blockMenuBtnRef,\n type: 'button',\n class: 'dm-toolbar-button',\n disabled: t.blockMenuButtonDisabled,\n title: t.blockMenuButtonDisabled\n ? 'Block actions (select within a single block)'\n : 'More options',\n 'aria-label': 'More options',\n 'aria-haspopup': 'menu',\n innerHTML: getCachedIcon('dotsThree'),\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { if (blockMenuBtnRef.value) openBlockContextMenu(blockMenuBtnRef.value); },\n }),\n );\n }\n\n const slotContent = slots['default']?.();\n if (slotContent) children.push(...slotContent);\n\n return h('div', {\n ref: menuRef,\n class: 'dm-bubble-menu',\n role: 'toolbar',\n 'aria-label': 'Text formatting',\n }, children);\n };\n },\n});\n\n// ===== Bubble-menu-embedded dropdown =====\n\n/**\n * Bubble-menu-embedded dropdown (e.g. text-align). Manages its own outside-\n * click / Escape / `dm:dismiss-overlays` lifecycle. Panel stays INSIDE\n * `.dm-bubble-menu` so it inherits bubble-scoped active-state tokens.\n */\nconst BubbleDropdown = defineComponent({\n name: 'BubbleDropdown',\n props: {\n dropdown: { type: Object as PropType<ToolbarDropdown>, required: true },\n isOpen: { type: Boolean, required: true },\n isItemActive: { type: Function as PropType<(item: ToolbarButton) => boolean>, required: true },\n getCachedIcon: { type: Function as PropType<(name: string) => string>, required: true },\n activeVersion: { type: Number, required: true },\n executeSubItem: { type: Function as PropType<(sub: ToolbarButton) => void>, required: true },\n },\n emits: ['toggle', 'close'],\n setup(props, { emit }) {\n const triggerRef = ref<HTMLButtonElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Position dropdown + outside-close / Escape / cooperative dismissal via\n // a single AbortController. `flush: 'post'` waits for the panel to mount\n // before measuring + positioning.\n watch(\n () => props.isOpen,\n (open, _old, onCleanup) => {\n if (!open) return;\n const trigger = triggerRef.value;\n const panel = panelRef.value;\n if (!trigger || !panel) return;\n\n const cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (panel.contains(target)) return;\n if (trigger.contains(target)) return;\n emit('close');\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n emit('close');\n }\n }, { signal });\n\n // Cooperative dismissal: other overlays (color picker, link popover)\n // broadcast this event when opening; our dropdown closes in response.\n // We deliberately do NOT broadcast it ourselves - the bubble menu\n // plugin listens for it and would hide, taking our trigger with it.\n const editorEl = trigger.closest<HTMLElement>('.dm-editor');\n editorEl?.addEventListener('dm:dismiss-overlays', () => { emit('close'); }, { signal });\n\n onCleanup(() => {\n controller.abort();\n cleanupFloating();\n });\n },\n { flush: 'post' },\n );\n\n return () => {\n // Read activeVersion to subscribe to active-state changes.\n void props.activeVersion;\n const dropdown = props.dropdown;\n const dropdownActive = dropdown.items.some((sub) => props.isItemActive(sub));\n const activeChild = dropdown.dynamicIcon\n ? dropdown.items.find((sub) => props.isItemActive(sub))\n : undefined;\n const triggerIcon = activeChild?.icon ?? dropdown.icon;\n const triggerHtml = props.getCachedIcon(triggerIcon) + DROPDOWN_CARET;\n\n return h('div', {\n class: 'dm-toolbar-dropdown-wrapper',\n 'data-dropdown-wrapper': dropdown.name,\n }, [\n h('button', {\n ref: triggerRef,\n type: 'button',\n class: ['dm-toolbar-button', 'dm-toolbar-dropdown-trigger', dropdownActive && 'dm-toolbar-button--active'],\n 'aria-expanded': props.isOpen,\n 'aria-haspopup': 'true',\n 'aria-label': dropdown.label,\n title: dropdown.label,\n 'data-dropdown': dropdown.name,\n innerHTML: triggerHtml,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { emit('toggle'); },\n }),\n props.isOpen\n ? h('div', {\n ref: panelRef,\n class: 'dm-toolbar-dropdown-panel',\n role: 'menu',\n 'data-dm-editor-ui': '',\n 'data-dropdown-panel': dropdown.name,\n }, dropdown.items.map((sub) => {\n const subActive = props.isItemActive(sub);\n const subHtml = `${props.getCachedIcon(sub.icon)} ${sub.label}`;\n return h('button', {\n key: sub.name,\n type: 'button',\n class: ['dm-toolbar-dropdown-item', subActive && 'dm-toolbar-dropdown-item--active'],\n role: 'menuitem',\n 'aria-label': sub.label,\n innerHTML: subHtml,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { props.executeSubItem(sub); },\n });\n }))\n : null,\n ]);\n };\n },\n});\n","import {\n defineComponent,\n h,\n nextTick,\n onMounted,\n onScopeDispose,\n ref,\n shallowRef,\n watch,\n} from 'vue';\nimport type { PropType } from 'vue';\nimport {\n PluginKey,\n FloatingMenuController,\n createFloatingMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n} from '@domternal/core';\nimport { useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalFloatingMenuProps {\n editor?: Editor;\n shouldShow?: FloatingMenuOptions['shouldShow'];\n offset?: number;\n items?: FloatingMenuItemsOverride;\n keymap?: FloatingMenuKeymap;\n icons?: IconSet;\n /**\n * When true, the menu does NOT auto-show on every empty paragraph;\n * it only opens when the BlockHandle `+` button (or any caller of\n * `showFloatingMenu`) explicitly triggers it. Notion-style behaviour\n * - empty rows show a placeholder, the slash menu is the keyboard\n * trigger, the `+` button is the gutter trigger.\n * @default false\n */\n requireExplicitTrigger?: boolean;\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 items: {\n type: [Array, Function] as PropType<FloatingMenuItemsOverride>,\n default: undefined,\n },\n keymap: { type: Object as PropType<FloatingMenuKeymap>, default: undefined },\n icons: { type: Object as PropType<IconSet>, default: undefined },\n requireExplicitTrigger: { type: Boolean, default: false },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n const menuRef = ref<HTMLDivElement>();\n // Prefer crypto.randomUUID for collision-free uniqueness (Math.random\n // across simultaneous mounts may collide; SSR can share the seed).\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const pluginKey = new PluginKey(\n 'vueFloatingMenu-' +\n (cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8)),\n );\n\n // Reactive controller state exposed to the render function.\n const controller = shallowRef<FloatingMenuController | null>(null);\n // Bump tracker forces re-renders when controller state changes without\n // swapping the controller instance.\n const version = ref(0);\n\n let registered = false;\n let stopWatch: (() => void) | null = null;\n let currentEditor: Editor | null = null;\n\n const resolveIcon = (name?: string): string => {\n if (!name) return '';\n return props.icons?.[name] ?? defaultIcons[name] ?? '';\n };\n\n const doRegister = (editor: Editor): void => {\n if (registered || editor.isDestroyed || !menuRef.value) return;\n registered = true;\n currentEditor = editor;\n\n const plugin = createFloatingMenuPlugin({\n pluginKey,\n editor,\n element: menuRef.value,\n ...(props.shouldShow && { shouldShow: props.shouldShow }),\n offset: props.offset,\n ...(props.keymap && { keymap: props.keymap }),\n requireExplicitTrigger: props.requireExplicitTrigger,\n });\n editor.registerPlugin(plugin);\n\n // Only create a controller when consumer did not supply custom\n // content via the default slot; in that case they own the rendering\n // and we stay out of their way.\n const hasCustomSlot = Boolean(slots['default']);\n if (!hasCustomSlot) {\n const ctl = new FloatingMenuController(editor, () => { version.value++; }, props.items);\n ctl.subscribe();\n controller.value = ctl;\n }\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 // Imperatively focus the active menuitem when focusedIndex changes.\n watch(\n () => [controller.value?.focusedIndex ?? -1, version.value] as const,\n ([focusedIndex]) => {\n if (focusedIndex < 0 || !menuRef.value) return;\n void nextTick(() => {\n const target = menuRef.value?.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(focusedIndex)}\"]`,\n );\n target?.focus();\n });\n },\n );\n\n onScopeDispose(() => {\n stopWatch?.();\n controller.value?.destroy();\n controller.value = null;\n const editor = currentEditor ?? props.editor ?? contextEditor.value;\n if (editor && !editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey);\n }\n });\n\n const onItemClick = (item: FloatingMenuItem): void => {\n const ctl = controller.value;\n const ed = currentEditor;\n if (!ctl || !ed) return;\n ctl.execute(item);\n requestAnimationFrame(() => { ed.view.focus(); });\n };\n\n const onMenuKeyDown = (e: KeyboardEvent): void => {\n const ctl = controller.value;\n if (!ctl) return;\n const focused = ctl.focusedItem();\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n ctl.next();\n return;\n case 'ArrowUp':\n e.preventDefault();\n ctl.prev();\n return;\n case 'Home':\n e.preventDefault();\n ctl.first();\n return;\n case 'End':\n e.preventDefault();\n ctl.last();\n return;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n ctl.leaveMenu();\n currentEditor?.view.focus();\n return;\n case 'Enter':\n case ' ':\n if (focused) {\n e.preventDefault();\n onItemClick(focused);\n }\n return;\n default:\n return;\n }\n };\n\n return () => {\n // Custom slot: consumer owns rendering.\n if (slots['default']) {\n return h(\n 'div',\n { ref: menuRef, class: 'dm-floating-menu', 'data-dm-editor-ui': '' },\n slots['default'](),\n );\n }\n\n // Default render: groups of menu items from the controller.\n const ctl = controller.value;\n // Read version to ensure reactivity on state changes.\n void version.value;\n const groups = ctl?.groups ?? [];\n const focusedIndex = ctl?.focusedIndex ?? -1;\n\n // Flat index map for roving tabindex.\n const flatNames = groups.flatMap((g) => g.items.map((i) => i.name));\n\n return h(\n 'div',\n {\n ref: menuRef,\n class: 'dm-floating-menu',\n role: 'menu',\n 'aria-label': 'Insert block',\n 'data-dm-editor-ui': '',\n onKeydown: onMenuKeyDown,\n },\n groups.map((group, gi) => {\n const groupId = `dm-fm-g${String(gi)}`;\n return h('div', { key: group.name || `__group-${String(gi)}`, class: 'dm-floating-menu-group-wrapper' }, [\n group.name\n ? h('div', { class: 'dm-floating-menu-group-label', id: groupId }, group.name)\n : null,\n h(\n 'div',\n {\n class: 'dm-floating-menu-group',\n role: 'group',\n ...(group.name ? { 'aria-labelledby': groupId } : {}),\n },\n group.items.map((item) => {\n const flatIndex = flatNames.indexOf(item.name);\n const isFocused = flatIndex === focusedIndex;\n const disabled = ctl?.isDisabled(item) ?? false;\n const iconHtml = resolveIcon(item.icon);\n return h(\n 'button',\n {\n key: item.name,\n type: 'button',\n role: 'menuitem',\n class: 'dm-floating-menu-item',\n 'data-floating-menu-item': item.name,\n 'data-floating-menu-index': String(flatIndex),\n tabindex: isFocused || (focusedIndex < 0 && flatIndex === 0) ? 0 : -1,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'aria-keyshortcuts': item.shortcut,\n disabled,\n onMousedown: (e: Event) => { e.preventDefault(); },\n onClick: () => { onItemClick(item); },\n },\n [\n iconHtml\n ? h('span', {\n class: 'dm-floating-menu-item-icon',\n 'aria-hidden': 'true',\n innerHTML: iconHtml,\n })\n : null,\n h('span', { class: 'dm-floating-menu-item-label' }, item.label),\n item.shortcut\n ? h('span', { class: 'dm-floating-menu-item-shortcut', 'aria-hidden': 'true' }, item.shortcut)\n : null,\n ],\n );\n }),\n ),\n ]);\n }),\n );\n };\n },\n});\n","import { computed, onScopeDispose, ref, watch } from 'vue';\nimport type { ComputedRef, Ref, 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 interface UseEmojiPickerResult {\n isOpen: Ref<boolean>;\n searchQuery: Ref<string>;\n activeCategory: Ref<string>;\n categories: ComputedRef<Map<string, EmojiPickerItem[]>>;\n categoryNames: ComputedRef<string[]>;\n filteredEmojis: ComputedRef<EmojiPickerItem[]>;\n frequentlyUsed: ComputedRef<EmojiPickerItem[]>;\n pickerRef: Ref<HTMLDivElement | undefined>;\n selectEmoji: (item: EmojiPickerItem) => void;\n onSearch: (event: Event) => void;\n scrollToCategory: (cat: string) => void;\n onGridScroll: () => void;\n close: () => void;\n}\n\nexport function useEmojiPicker(editor: ShallowRef<Editor | null>, emojis: EmojiPickerItem[]): UseEmojiPickerResult {\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 if (!storage) return [];\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(): void {\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(): void {\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(): void {\n clickOutsideHandler = (e: Event): void => {\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): void => {\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[]): void => {\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<HTMLElement>('.dm-emoji-picker');\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<HTMLInputElement>('.dm-emoji-picker-search input');\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): void {\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): void {\n searchQuery.value = (event.target as HTMLInputElement).value;\n }\n\n function scrollToCategory(cat: string): void {\n searchQuery.value = '';\n activeCategory.value = cat;\n requestAnimationFrame(() => {\n const grid = pickerRef.value?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\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(): void {\n if (searchQuery.value) return;\n const grid = pickerRef.value?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n\n const labels = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'));\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;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? 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): void {\n const grid = event.currentTarget as HTMLElement;\n const swatches = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'));\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n const 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): ReturnType<typeof h> {\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 { defineComponent, h, ref, watch, watchEffect } from 'vue';\nimport type { Component, PropType } from 'vue';\nimport type { AnyExtension, Content, FocusPosition } from '@domternal/core';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { provideEditor, useCurrentEditor } from './EditorContext.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\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 watch(\n () => props.editable,\n (newEditable) => {\n const ed = editor.value;\n if (ed && !ed.isDestroyed) ed.setEditable(newEditable);\n },\n );\n\n return () => slots['default']?.();\n },\n}) as unknown as Component & {\n Content: Component;\n Loading: Component;\n Toolbar: Component;\n BubbleMenu: Component;\n FloatingMenu: Component;\n EmojiPicker: Component;\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;\nDomternal.Toolbar = DomternalToolbar;\nDomternal.BubbleMenu = DomternalBubbleMenu;\nDomternal.FloatingMenu = DomternalFloatingMenu;\nDomternal.EmojiPicker = DomternalEmojiPicker;\n","import { defineComponent, h, ref, watch } from 'vue';\nimport type { PropType } from 'vue';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, Editor } 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: Editor) => void;\n onUpdate?: (props: { editor: Editor }) => void;\n onSelectionChange?: (props: { editor: Editor }) => void;\n onFocus?: (props: { editor: Editor; event: FocusEvent }) => void;\n onBlur?: (props: { editor: 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: Editor) => void>, default: undefined },\n onUpdate: { type: Function as PropType<(props: { editor: Editor }) => void>, default: undefined },\n onSelectionChange: { type: Function as PropType<(props: { editor: Editor }) => void>, default: undefined },\n onFocus: { type: Function as PropType<(props: { editor: Editor; event: FocusEvent }) => void>, default: undefined },\n onBlur: { type: Function as PropType<(props: { editor: 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 // Sync editable prop to editor (useEditor's internal watcher can't track\n // props because the options object is a plain non-reactive snapshot)\n watch(\n () => props.editable,\n (newEditable) => {\n const ed = editor.value;\n if (ed && !ed.isDestroyed) ed.setEditable(newEditable);\n },\n );\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 = (): void => {\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 'data-dm-editor-ui': '',\n });\n },\n});\n","/**\n * useNotionColorPicker\n *\n * State and effect plumbing for the Notion-style inline color picker. Listens\n * for the `notionColorOpen` event emitted by the bubble menu's \"A\" trigger,\n * tracks the active text/background tokens, and exposes the imperative\n * commands consumers need (`applyText`, `applyBg`, `close`).\n *\n * The default component (`DomternalNotionColorPicker`) consumes this composable\n * and renders the panel via `<Teleport>`. Consumers building custom UIs can\n * call this composable directly.\n */\nimport { ref, shallowRef, watch } from 'vue';\nimport type { Ref, ShallowRef } from 'vue';\nimport type { Editor } from '@domternal/core';\n\ninterface NotionColorPickerStorage {\n isOpen: boolean;\n}\n\ninterface NotionColorPickerExtensionOptions {\n palette?: readonly string[];\n}\n\ninterface NotionColorOpenDetail {\n anchorElement?: HTMLElement;\n}\n\n/**\n * Display labels for the named-token palette. Used in tooltips / aria labels;\n * unknown tokens fall back to a title-cased version of the raw key.\n */\nconst TOKEN_LABELS: Record<string, string> = {\n gray: 'Gray',\n brown: 'Brown',\n orange: 'Orange',\n yellow: 'Yellow',\n green: 'Green',\n blue: 'Blue',\n purple: 'Purple',\n pink: 'Pink',\n red: 'Red',\n};\n\nexport interface UseNotionColorPickerOptions {\n editor: ShallowRef<Editor | null>;\n}\n\nexport interface UseNotionColorPickerResult {\n /** Whether the picker panel is currently open. */\n isOpen: Ref<boolean>;\n /** Editor host element (`.dm-editor`) used as the Teleport target. Null until the editor is ready. */\n hostEl: ShallowRef<HTMLElement | null>;\n /** Anchor element the picker positions against (the bubble-menu \"A\" trigger button). */\n anchorEl: ShallowRef<HTMLElement | null>;\n /** Ref to the panel root, used by the picker UI for positioning + focus management. */\n panelRef: Ref<HTMLDivElement | undefined>;\n /** Currently applied text token at the cursor, or null when default. */\n currentTextToken: Ref<string | null>;\n /** Currently applied background token at the cursor, or null when default. */\n currentBgToken: Ref<string | null>;\n /** Named-token palette (read from the NotionColorPicker extension options). */\n palette: ShallowRef<readonly string[]>;\n /** Apply a text color token to the current selection. Picker stays open. */\n applyText: (token: string | null) => void;\n /** Apply a background color token to the current selection. Picker stays open. */\n applyBg: (token: string | null) => void;\n /** Close the picker. When `refocus` is true, returns focus to the editor view. */\n close: (opts?: { refocus?: boolean }) => void;\n /** Display label for a palette token (defaults to title-case fallback). */\n tokenLabel: (token: string) => string;\n /** Arrow / Home / End keyboard navigation across the 5-column swatch grid. */\n onPanelKeydown: (event: KeyboardEvent) => void;\n}\n\nexport function useNotionColorPicker(\n options: UseNotionColorPickerOptions,\n): UseNotionColorPickerResult {\n const { editor } = options;\n\n const isOpen = ref(false);\n const anchorEl = shallowRef<HTMLElement | null>(null);\n const hostEl = shallowRef<HTMLElement | null>(null);\n const panelRef = ref<HTMLDivElement>();\n const currentTextToken = ref<string | null>(null);\n const currentBgToken = ref<string | null>(null);\n const palette = shallowRef<readonly string[]>([]);\n\n const setStorageOpen = (open: boolean): void => {\n const ed = editor.value;\n if (!ed) return;\n const slot = ed.storage['notionColorPicker'];\n if (slot && typeof slot === 'object') {\n (slot as NotionColorPickerStorage).isOpen = open;\n }\n };\n\n /**\n * Inspect the current selection and update active-state indicators. Reads\n * stored marks at empty cursor; walks text nodes for non-empty selections\n * (since `$from.nodeAfter` can land on a block at boundary positions).\n */\n const syncFromSelection = (): void => {\n const ed = editor.value;\n if (!ed) return;\n const { selection } = ed.state;\n\n let mark: { attrs: Record<string, unknown> } | null = null;\n if (selection.empty) {\n mark = selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n ed.state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (mark) return false;\n if (node.isText) {\n const found = node.marks.find((m) => m.type.name === 'textStyle');\n if (found) mark = found;\n }\n return true;\n });\n }\n\n const attrs = (mark?.attrs ?? {}) as { colorToken?: string | null; backgroundColorToken?: string | null };\n currentTextToken.value = attrs.colorToken ?? null;\n currentBgToken.value = attrs.backgroundColorToken ?? null;\n };\n\n const close = (opts: { refocus?: boolean } = {}): void => {\n if (!isOpen.value) return;\n isOpen.value = false;\n setStorageOpen(false);\n if (opts.refocus) {\n // Focus the editor view, not the trigger button: trigger focus would\n // leave the user without a caret.\n editor.value?.view.focus();\n }\n anchorEl.value = null;\n };\n\n // Editor-scoped subscription: open event + selection updates. Re-attaches\n // when the editor reference changes (i.e. HMR / route remount).\n watch(\n editor,\n (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) return;\n\n // Cache the `.dm-editor` host once per editor instance (it doesn't move).\n hostEl.value = ed.view.dom.closest<HTMLElement>('.dm-editor');\n\n // Read palette from the extension options. Extension list is immutable\n // after editor construction, so this only runs once per editor.\n const ext = ed.extensionManager.extensions.find((e) => e.name === 'notionColorPicker');\n const extOptions = (ext?.options ?? null) as NotionColorPickerExtensionOptions | null;\n palette.value = extOptions?.palette ? [...extOptions.palette] : [];\n\n const onOpen = (...args: unknown[]): void => {\n const detail = args[0] as NotionColorOpenDetail | undefined;\n const incomingAnchor = detail?.anchorElement;\n if (!incomingAnchor) return;\n // Toggle: clicking the same anchor while open closes the picker.\n if (isOpen.value && anchorEl.value === incomingAnchor) {\n close({ refocus: true });\n return;\n }\n anchorEl.value = incomingAnchor;\n syncFromSelection();\n isOpen.value = true;\n setStorageOpen(true);\n };\n\n const onSelectionUpdate = (): void => {\n if (!isOpen.value) return;\n // Anchor vanished (bubble menu hidden by selection becoming empty,\n // or by any other reason). Close defensively.\n if (!anchorEl.value?.isConnected) {\n close();\n return;\n }\n if (ed.state.selection.empty) {\n close();\n } else {\n // Selection changed but stays non-empty (e.g. shift+arrow). Refresh\n // active-state indicators against the new mark set.\n syncFromSelection();\n }\n };\n\n (ed.on as (e: string, h: (...args: unknown[]) => void) => void)('notionColorOpen', onOpen);\n (ed.on as (e: string, h: () => void) => void)('selectionUpdate', onSelectionUpdate);\n\n onCleanup(() => {\n (ed.off as (e: string, h: (...args: unknown[]) => void) => void)('notionColorOpen', onOpen);\n (ed.off as (e: string, h: () => void) => void)('selectionUpdate', onSelectionUpdate);\n // Only flip storage when the picker was actually open. Unconditional\n // reset would race a dev-mode double-mount: the first mount's\n // cleanup would clobber an `isOpen=true` set by the second mount's\n // open handler that landed between teardown and re-mount.\n if (isOpen.value) setStorageOpen(false);\n });\n },\n { immediate: true },\n );\n\n // Document-level listeners (outside-click + Escape) scoped to the open\n // window via a single AbortController.\n watch(isOpen, (open, _old, onCleanup) => {\n if (!open) return;\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n // No redundant `isOpen` guard: this effect only runs when `isOpen === true`\n // and the AbortController detaches the listener as soon as it flips false.\n const target = e.target as Node | null;\n if (!target) return;\n if (panelRef.value?.contains(target)) return;\n if (anchorEl.value?.contains(target)) return;\n close({ refocus: false });\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen.value) {\n e.preventDefault();\n close({ refocus: true });\n }\n }, { signal });\n\n onCleanup(() => { controller.abort(); });\n });\n\n const applyText = (token: string | null): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.commands as unknown as { setTextColorToken: (t: string | null) => boolean })\n .setTextColorToken(token);\n syncFromSelection();\n };\n\n const applyBg = (token: string | null): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.commands as unknown as { setBackgroundColorToken: (t: string | null) => boolean })\n .setBackgroundColorToken(token);\n syncFromSelection();\n };\n\n const tokenLabel = (token: string): string => {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n };\n\n /**\n * Arrow / Home / End nav across the 5-column swatch grid. Sequential focus\n * walks both Text and Background sections so keyboard users can reach any\n * swatch without re-grabbing Tab.\n */\n const onPanelKeydown = (event: KeyboardEvent): void => {\n const cols = 5;\n const root = panelRef.value;\n if (!root) return;\n const swatches = Array.from(\n root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement as HTMLElement | null;\n const idx = active ? swatches.indexOf(active) : -1;\n if (idx === -1) return;\n\n let next = idx;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n next = Math.min(idx + 1, swatches.length - 1);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n next = Math.max(idx - 1, 0);\n break;\n case 'ArrowDown':\n event.preventDefault();\n next = Math.min(idx + cols, swatches.length - 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n next = Math.max(idx - cols, 0);\n break;\n case 'Home':\n event.preventDefault();\n next = 0;\n break;\n case 'End':\n event.preventDefault();\n next = swatches.length - 1;\n break;\n default:\n return;\n }\n swatches[next]?.focus();\n };\n\n return {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n close,\n tokenLabel,\n onPanelKeydown,\n };\n}\n","/**\n * DomternalNotionColorPicker\n *\n * Notion-style inline color picker rendered via `<Teleport>` into the\n * `.dm-editor` host. The teleport target keeps the panel inside the editor's\n * CSS-variable scope (theme tokens cascade) without imperative DOM moves.\n *\n * Opens in response to the `notionColorOpen` event emitted by the bubble\n * menu's \"A\" trigger. Two sections: text color (top), background color\n * (bottom). Each section is a default-swatch plus the named-token palette.\n *\n * The default UI is rendered when no slot content is provided. Pass a\n * default scoped slot to take over rendering while keeping the composable's\n * lifecycle - the slot receives the full `useNotionColorPicker` API.\n */\nimport { computed, defineComponent, h, Teleport, watch } from 'vue';\nimport type { PropType, ShallowRef, VNode } from 'vue';\nimport { positionFloating } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useNotionColorPicker, type UseNotionColorPickerResult } from './useNotionColorPicker.js';\n\nexport interface DomternalNotionColorPickerProps {\n /** The editor instance. If omitted, uses provideEditor context. */\n editor?: Editor;\n}\n\nexport const DomternalNotionColorPicker = defineComponent({\n name: 'DomternalNotionColorPicker',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n // `computed` returns ComputedRef but the composables expect ShallowRef. Cast\n // is safe (both share the same .value interface and watch subscribes to either)\n // and matches the wrapper convention (see useEmojiPicker / DomternalBubbleMenu).\n const editorRef = computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>;\n\n const api = useNotionColorPicker({ editor: editorRef });\n const {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n tokenLabel,\n onPanelKeydown,\n } = api;\n\n // Position + two-rAF focus chain. `flush: 'post'` waits for the panel to\n // mount inside the Teleport target before measuring + focusing. Cleanup\n // cancels pending rAFs to avoid racing the panel unmount.\n watch(\n [isOpen, anchorEl],\n ([open, anchor], _old, onCleanup) => {\n if (!open || !anchor || !panelRef.value) return;\n const panel = panelRef.value;\n\n const cleanupFloating = positionFloating(anchor, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n // Second rAF waits for paint so focus doesn't race the bubble-menu blur.\n let id2 = 0;\n const id1 = requestAnimationFrame(() => {\n id2 = requestAnimationFrame(() => {\n if (!panel.isConnected) return;\n const active = panel.querySelector<HTMLElement>('.dm-ncp-swatch.dm-ncp-active');\n const fallback = panel.querySelector<HTMLElement>('.dm-ncp-swatch--text[data-color=\"null\"]');\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n });\n\n onCleanup(() => {\n cancelAnimationFrame(id1);\n if (id2) cancelAnimationFrame(id2);\n cleanupFloating();\n });\n },\n { flush: 'post' },\n );\n\n const renderDefaultPanel = (): VNode[] => {\n const tToken = currentTextToken.value;\n const bToken = currentBgToken.value;\n const pal = palette.value;\n return [\n h('div', { class: 'dm-ncp-section' }, [\n h('div', { class: 'dm-ncp-label' }, 'Text color'),\n h('div', { class: 'dm-ncp-grid' }, [\n h('button', {\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--text', tToken === null && 'dm-ncp-active'],\n 'aria-pressed': tToken === null,\n 'data-color': 'null',\n title: 'Default text color',\n 'aria-label': 'Default text color',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyText(null); },\n }),\n ...pal.map((t) => h('button', {\n key: t,\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--text', tToken === t && 'dm-ncp-active'],\n 'aria-pressed': tToken === t,\n 'data-color': t,\n title: tokenLabel(t),\n 'aria-label': `${tokenLabel(t)} text`,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyText(t); },\n })),\n ]),\n ]),\n h('div', { class: 'dm-ncp-section' }, [\n h('div', { class: 'dm-ncp-label' }, 'Background color'),\n h('div', { class: 'dm-ncp-grid' }, [\n h('button', {\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--bg', bToken === null && 'dm-ncp-active'],\n 'aria-pressed': bToken === null,\n 'data-color': 'null',\n title: 'Default background',\n 'aria-label': 'Default background',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyBg(null); },\n }),\n ...pal.map((t) => h('button', {\n key: t,\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--bg', bToken === t && 'dm-ncp-active'],\n 'aria-pressed': bToken === t,\n 'data-color': t,\n title: `${tokenLabel(t)} background`,\n 'aria-label': `${tokenLabel(t)} background`,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyBg(t); },\n })),\n ]),\n ]),\n ];\n };\n\n return () => {\n // SSR-safe: render nothing until the picker is open AND the editor host\n // has been resolved. Teleport's target must be a real DOM node.\n if (!isOpen.value || !hostEl.value) return null;\n\n const slot = slots['default'];\n const slotChildren = slot ? slot({ api } as { api: UseNotionColorPickerResult }) : undefined;\n const panelChildren = slotChildren ?? renderDefaultPanel();\n\n return h(Teleport, { to: hostEl.value }, [\n h('div', {\n ref: panelRef,\n class: 'dm-notion-color-picker',\n 'data-show': '',\n 'data-dm-editor-ui': '',\n role: 'dialog',\n 'aria-label': 'Text and background color',\n // Intentional non-modal: the picker doesn't trap focus (outside-click\n // closes, editor stays interactive). `role=\"dialog\"` defaults to\n // modal=true for screen readers, so we explicitly opt out.\n 'aria-modal': 'false',\n onKeydown: onPanelKeydown,\n }, panelChildren),\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 onDragStart: ((event: DragEvent) => void) | undefined;\n nodeViewContentRef: ((el: HTMLElement | null) => void) | undefined;\n} {\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): (node: PMNode, view: unknown, getPos: () => number | undefined, decorations: readonly unknown[]) => VueNodeView | { dom: HTMLElement; update: () => boolean; destroy: () => void } {\n // Handle class-based Vue components with __vccOpts\n const normalizedComponent: Component = typeof component === 'function'\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 | undefined;\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 || !editor) {\n if ((globalThis as { __DEV__?: boolean }).__DEV__ !== false) {\n // eslint-disable-next-line no-console\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: () => { /* noop */ } };\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): void => {\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): void => {\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(): void {\n this.props.selected = true;\n }\n\n deselectNode(): void {\n this.props.selected = false;\n }\n\n destroy(): void {\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/useEditor.ts","../src/utils.ts","../src/useEditorState.ts","../src/EditorContext.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/Domternal.ts","../src/DomternalEditor.ts","../src/EditorContent.ts","../src/notion-color-picker/useNotionColorPicker.ts","../src/notion-color-picker/DomternalNotionColorPicker.ts","../src/node-views/VueNodeViewContext.ts","../src/node-views/VueNodeViewRenderer.ts","../src/node-views/NodeViewWrapper.ts","../src/node-views/NodeViewContent.ts"],"names":["ref","watch","shallowRef","onScopeDispose","defineComponent","h","computed","ToolbarController","onMounted","defaultIcons","DROPDOWN_CARET","refocusEditorAfterCommand","positionFloatingOnce","PluginKey","watchEffect","setStorageOpen","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): void {\n ed.on('transaction', ({ transaction }: TransactionEventProps) => {\n // Mirror core's `update` event: skip programmatic writes (setContent(content, false))\n // that set skipUpdate, so onUpdate never echoes a silent content sync.\n if (transaction.docChanged && !transaction.getMeta('skipUpdate')) {\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): Editor {\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(insertClone = true): void {\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 unmount\n // transitions. The recreate path (insertClone=false) immediately mounts a\n // new editor in the same place, so it must skip the clone to avoid leaving\n // an orphan copy in the live container.\n if (insertClone) {\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\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 const ed = editor.value;\n if (ed) {\n // immediatelyRender path: the editor was created detached during setup.\n // Adopt its DOM into the mount node so it is not left blank.\n const mount = editorRef.value;\n if (mount && ed.view.dom.parentElement !== mount) {\n mount.appendChild(ed.view.dom);\n }\n return;\n }\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(false);\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, Ref } 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 * Previous rAFs are cancelled on each update so only one trigger fires per\n * double-frame window, preventing re-render storms during rapid\n * ProseMirror transactions (e.g. while typing).\n */\nexport function useDebouncedRef<T>(initialValue: T): Ref<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 * The core Editor is framework-agnostic, so a WeakMap associates each Editor\n * with its 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 html: string;\n json: JSONContent | null;\n empty: boolean;\n focused: boolean;\n editable: boolean;\n} {\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 = (): void => {\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 = (): void => {\n if (!isFocused.value) isFocused.value = true;\n };\n\n const onBlur = (): void => {\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 = (): void => { 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 = (): typeof instance.appContext => {\n const ctx = Object.create(instance.appContext) as typeof instance.appContext;\n const instanceWithProvides = instance as unknown as { provides: Record<string | symbol, unknown> };\n (ctx as unknown as { provides: Record<string | symbol, unknown> }).provides = instanceWithProvides.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 { onScopeDispose, ref, shallowRef, watch } from 'vue';\nimport type { Ref, 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 interface UseToolbarControllerResult {\n controller: { readonly current: ToolbarController | null };\n groups: ShallowRef<ToolbarGroup[]>;\n focusedIndex: Ref<number>;\n openDropdown: Ref<string | null>;\n activeVersion: Ref<number>;\n toolbarRef: Ref<HTMLDivElement | undefined>;\n isActive: (name: string) => boolean;\n isDisabled: (name: string) => boolean;\n isDropdownActive: (dropdown: ToolbarDropdown) => boolean;\n getAriaExpanded: (item: ToolbarButton) => string | null;\n getFlatIndex: (name: string) => number;\n handleDropdownToggle: (dropdown: ToolbarDropdown) => void;\n closeDropdown: () => void;\n executeCommand: (item: ToolbarButton) => void;\n syncState: () => void;\n}\n\nexport function useToolbarController(\n editor: ShallowRef<Editor | null>,\n layout?: ToolbarLayoutEntry[],\n): UseToolbarControllerResult {\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(): void {\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');\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 const ctl = controller;\n if (!ctl) return false;\n return dropdown.items.some((item: ToolbarButton) => ctl.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): void {\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<HTMLElement>('[aria-expanded=\"true\"]');\n const panel = trigger?.parentElement?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\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(): void {\n cleanupFloating?.();\n cleanupFloating = null;\n controller?.closeDropdown();\n syncState();\n }\n\n function executeCommand(item: ToolbarButton): void {\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 interface UseToolbarIconsResult {\n resolveIconSvg: (name: string) => string;\n getCachedIcon: (name: string) => string;\n getCachedTriggerLabel: (label: string, isIcon?: boolean) => string;\n getCachedTriggerIcon: (iconName: string) => string;\n getCachedItemContent: (iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon') => string;\n getDropdownTriggerHtml: (dropdown: ToolbarDropdown, activeItem: ToolbarButton | undefined) => string;\n}\n\nexport function useToolbarIcons(icons?: IconSet | null): UseToolbarIconsResult {\n const cache = new Map<string, string>();\n let prevIcons = icons;\n\n function checkCacheInvalidation(currentIcons: IconSet | null | undefined): void {\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(): { getTooltip: (item: ToolbarButton) => string } {\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 onKeyDown: (event: KeyboardEvent) => void;\n focusCurrentButton: () => void;\n} {\n function focusCurrentButton(): void {\n const buttons = toolbarRef.value?.querySelectorAll<HTMLElement>('.dm-toolbar-button');\n const controller = controllerRef.current;\n if (buttons && controller) {\n const btn = buttons[controller.focusedIndex];\n btn?.focus();\n }\n }\n\n function focusDropdownItem(direction: number, first?: boolean): void {\n const panel = toolbarRef.value?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\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): void {\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\nfunction resolveElementAtCursor(editor: Editor): HTMLElement | null {\n const { from } = editor.state.selection;\n const { node } = editor.view.domAtPos(from);\n return node instanceof HTMLElement ? node : node.parentElement;\n}\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 node = resolveElementAtCursor(editor);\n if (!node) return null;\n\n const inline = node.style.getPropertyValue(prop);\n if (inline) return inline;\n\n return window.getComputedStyle(node).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 node = resolveElementAtCursor(editor);\n if (!node) return null;\n\n return node.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 ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { refocusEditorAfterCommand } 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): void {\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 target = event?.target as HTMLElement | undefined;\n const anchor = target?.closest<HTMLElement>('.dm-toolbar-button') ?? target;\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 refocusEditorAfterCommand(editor.view);\n }\n\n function onDropdownItemClick(item: ToolbarButtonType, event: MouseEvent): void {\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<HTMLElement>('.dm-toolbar-dropdown-trigger') ?? 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 refocusEditorAfterCommand(editor.view);\n }\n\n function onButtonFocus(name: string): void {\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;\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;\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 { Ref, ShallowRef } from 'vue';\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n defaultIcons,\n} from '@domternal/core';\nimport type { Editor, IconSet, ToolbarButton, ToolbarDropdown, 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 | ToolbarDropdown | BubbleMenuSeparator;\n\n/**\n * Live state for the bubble-menu trailing buttons. Mirrors Angular's\n * `syncTrailingButtonsState` output. Computed per editor transaction and\n * coalesced into a single object so each transaction triggers at most one\n * re-render.\n */\nexport interface BubbleMenuTrailingState {\n /** True when current selection is a NodeSelection (image, HR, ...). Trailing buttons hide in that case. */\n isNodeSelection: boolean;\n /** True when the `notionColorPicker` extension is loaded on this editor (cached once per editor). */\n showColorPickerButton: boolean;\n /** True when the `blockContextMenu` extension is loaded on this editor (cached once per editor). */\n showBlockMenuButton: boolean;\n /** True when the selection spans more than one top-level block (multi-block \"...\" disable). */\n blockMenuButtonDisabled: boolean;\n /** CSS color value for the \"A\" trigger glyph (e.g. `var(--dm-block-text-yellow)`), or null. */\n currentTextColorVar: string | null;\n /** CSS color value for the \"A\" trigger underline, or null. */\n currentBgColorVar: string | null;\n /** True when any token-based text or background color is applied at the cursor. */\n hasAnyColor: boolean;\n}\n\nconst INITIAL_TRAILING_STATE: BubbleMenuTrailingState = {\n isNodeSelection: false,\n showColorPickerButton: false,\n showBlockMenuButton: false,\n blockMenuButtonDisabled: false,\n currentTextColorVar: null,\n currentBgColorVar: null,\n hasAnyColor: false,\n};\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 icons?: ShallowRef<IconSet | undefined> | undefined;\n}\n\nexport interface UseBubbleMenuResult {\n menuRef: Ref<HTMLDivElement | undefined>;\n resolvedItems: ShallowRef<BubbleMenuItem[]>;\n isItemActive: (item: ToolbarButton) => boolean;\n isItemDisabled: (item: ToolbarButton) => boolean;\n executeCommand: (item: ToolbarButton, event?: Event) => void;\n activeVersion: Ref<number>;\n getCachedIcon: (name: string) => string;\n /** Live trailing-button state (color preview, node-selection gate, multi-block disable). */\n trailing: ShallowRef<BubbleMenuTrailingState>;\n /** Open the Notion color picker by emitting `notionColorOpen` with the trigger as anchor. */\n openColorPicker: (anchor: HTMLElement) => void;\n /** Open the block context menu by dispatching `dm:block-context-menu-open` on `.dm-editor`. */\n openBlockContextMenu: (anchor: HTMLElement) => void;\n}\n\nexport function useBubbleMenu(options: UseBubbleMenuOptions): UseBubbleMenuResult {\n const { editor, shouldShow, placement = 'top', offset = 8, updateDelay = 0, items, contexts: explicitContexts, icons: iconsRef } = options;\n\n const menuRef = ref<HTMLDivElement>();\n // Prefer crypto.randomUUID for collision-free uniqueness when two\n // bubble-menu instances mount in the same editor (Math.random across\n // simultaneous mounts has a small but real collision probability, and\n // SSR may share the random seed). Matches Angular/React wrappers.\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const pluginKey = new PluginKey(\n 'vueBubbleMenu-' +\n (cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8)),\n );\n const resolvedItems = shallowRef<BubbleMenuItem[]>([]);\n // `useDebouncedRef` batches transaction-rate updates via double-rAF, so\n // each keystroke triggers at most one re-render even though the plugin\n // fires `transaction` on every keystroke. See utils.ts.\n const activeVersion = useDebouncedRef(0);\n // Coalesced trailing-button state, updated once per transaction.\n const trailing = shallowRef<BubbleMenuTrailingState>(INITIAL_TRAILING_STATE);\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 / dropdownMap / bubbleDefaults are only used inside doInit;\n // declared here so closures inside doInit can rebind on each run.\n let itemMap: Map<string, ToolbarButton>;\n let dropdownMap: Map<string, ToolbarDropdown>;\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): void => {\n if (initialized || ed.isDestroyed || !menuRef.value) return;\n initialized = true;\n\n // Resolve effective contexts: explicit user prop takes priority,\n // then items-only mode disables contexts entirely, otherwise fall\n // back to the standard default (Notion-richer when the editor sits\n // inside `.dm-notion-mode`).\n const contexts = explicitContexts ?? (items ? undefined : defaultBubbleContexts(ed));\n\n // Extension presence is immutable after editor construction: cache once\n // instead of walking the extension list on every transaction.\n const exts = ed.extensionManager.extensions;\n const hasNotionColorPicker = exts.some((e) => e.name === 'notionColorPicker');\n const hasBlockContextMenu = exts.some((e) => e.name === 'blockContextMenu');\n\n // Build item map. Dropdowns are kept separately so we can resolve them\n // by name (text-align dropdown in the bubble menu).\n itemMap = new Map();\n dropdownMap = 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 dropdownMap.set(item.name, item);\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): void => {\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-${String(sepIdx++)}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n bubbleDefaults.set(ctx, result);\n }\n\n // Resolve names helper. Dropdowns take priority over buttons sharing the\n // same name (mirrors the Angular wrapper). Pipe `|` is a separator marker.\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-${String(sepIdx++)}` });\n } else {\n const dropdown = dropdownMap.get(name);\n if (dropdown) { result.push(dropdown); continue; }\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) return false;\n if (state.selection.node) return bubbleDefaults.has(state.selection.node.type.name);\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[]): void => {\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): void => {\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 const trackButton = (btn: ToolbarButton): void => {\n activeMapRef.set(btn.name, ToolbarController.resolveActive(currentEd as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n disabledMapRef.set(btn.name, canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false);\n } catch { disabledMapRef.set(btn.name, false); }\n };\n\n for (const item of currentResolvedItems) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n // Track each child so dynamicIcon + isActive lookups work.\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n };\n\n const defaultItems = items ? resolveNames(items) : resolveNames(['bold', 'italic', 'underline']);\n\n /**\n * Coalesce all trailing-button derivations into a single shallowRef\n * update per transaction. New object identity ensures Vue's reactivity\n * triggers exactly one render per tick.\n */\n const syncTrailingState = (currentEd: Editor): void => {\n const sel = currentEd.state.selection as unknown as SelectionShape;\n const isNode = !!sel.node;\n\n // Multi-block disable for the \"...\" trigger: when $from and $to live\n // under different top-level blocks the context menu has no unambiguous\n // target. Cheap O(1) check via $.before(1).\n let blockMenuDisabled = false;\n if (hasBlockContextMenu) {\n const { $from, $to } = currentEd.state.selection;\n if ($from.depth < 1 || $to.depth < 1) {\n blockMenuDisabled = true;\n } else {\n blockMenuDisabled = $from.before(1) !== $to.before(1);\n }\n }\n\n // Color preview for the \"A\" trigger glyph + underline. Read the\n // textStyle mark at $from; null tokens render as transparent.\n let textVar: string | null = null;\n let bgVar: string | null = null;\n let hasAny = false;\n if (hasNotionColorPicker) {\n const mark = currentEd.state.selection.$from\n .marks()\n .find((m) => m.type.name === 'textStyle');\n const attrs = (mark?.attrs ?? {}) as {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\n const tToken = attrs.colorToken ?? null;\n const bToken = attrs.backgroundColorToken ?? null;\n textVar = tToken ? `var(--dm-block-text-${tToken})` : null;\n bgVar = bToken ? `var(--dm-block-bg-${bToken})` : null;\n hasAny = tToken !== null || bToken !== null;\n }\n\n trailing.value = {\n isNodeSelection: isNode,\n showColorPickerButton: hasNotionColorPicker,\n showBlockMenuButton: hasBlockContextMenu,\n blockMenuButtonDisabled: blockMenuDisabled,\n currentTextColorVar: textVar,\n currentBgColorVar: bgVar,\n hasAnyColor: hasAny,\n };\n };\n\n // Transaction handler\n const transactionHandler = (): void => {\n if (contexts) {\n updateContextItems(ed, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else {\n const sel = ed.state.selection as unknown as SelectionShape;\n if (sel.node && bubbleDefaults.has(sel.node.type.name)) {\n setItems(bubbleDefaults.get(sel.node.type.name) ?? []);\n } else {\n setItems(defaultItems);\n }\n }\n updateStates(ed);\n syncTrailingState(ed);\n activeVersion.value++;\n };\n ed.on('transaction', transactionHandler);\n updateStates(ed);\n syncTrailingState(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 ): void {\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, event?: Event): void => {\n const ed = editor.value;\n if (!ed) return;\n if (item.emitEvent) {\n // Forward the clicked button as the anchor so listeners (LinkPopover,\n // image popover, emoji picker, NotionColorPicker) can position their\n // panels against it. Matches Angular wrapper behaviour.\n const anchor =\n (event?.currentTarget as HTMLElement | undefined) ??\n (event?.target as HTMLElement | undefined) ?? null;\n (ed.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n ToolbarController.executeItem(ed as never, item);\n };\n\n const getCachedIcon = (name: string): string => {\n return iconsRef?.value?.[name] ?? defaultIcons[name] ?? '';\n };\n\n /**\n * Emit `notionColorOpen` with the trigger as anchor. The wrapper\n * `DomternalNotionColorPicker` listens and positions itself against the\n * anchor element.\n */\n const openColorPicker = (anchor: HTMLElement): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n };\n\n /**\n * Open the BlockContextMenu against the cursor's containing block. Walk one\n * level up when the cursor's textblock is not a direct doc child (e.g.\n * cursor in `listItem > paragraph` targets the listItem) so Delete /\n * Turn into operate on the visual block the user is editing.\n */\n const openBlockContextMenu = (anchor: HTMLElement): void => {\n const ed = editor.value;\n if (!ed) return;\n const $from = ed.state.selection.$from;\n if ($from.depth < 1) return;\n const depth = $from.depth > 1 && $from.node($from.depth - 1).type.name !== 'doc'\n ? $from.depth - 1\n : $from.depth;\n const blockPos = $from.before(depth);\n const editorEl = ed.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }));\n };\n\n return {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n trailing,\n openColorPicker,\n openBlockContextMenu,\n };\n}\n","import { computed, defineComponent, h, ref, watch } from 'vue';\nimport type { PropType, ShallowRef, VNode } from 'vue';\nimport {\n ToolbarController,\n positionFloatingOnce,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport type { Editor, IconSet, ToolbarButton, ToolbarDropdown, BubbleMenuOptions } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useBubbleMenu } from './useBubbleMenu.js';\n\nconst DROPDOWN_CARET =\n '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\">' +\n '<path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\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 /** Custom icon overrides. Falls back to default Phosphor icons for unmapped keys. */\n icons?: IconSet;\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 icons: { type: Object as PropType<IconSet>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n // `computed` returns ComputedRef but useBubbleMenu expects ShallowRef. Cast\n // is safe (both share the same .value interface and watch subscribes to either)\n // and matches the wrapper convention (see useEmojiPicker).\n const editorRef = computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>;\n const iconsRef = computed(() => props.icons) as ShallowRef<IconSet | undefined>;\n\n const {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n trailing,\n openColorPicker,\n openBlockContextMenu,\n } = useBubbleMenu({\n editor: editorRef,\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 icons: iconsRef,\n });\n\n // Only one dropdown is open at a time across the entire bubble menu - the\n // Angular component enforces the same constraint via `openDropdown` signal.\n const openDropdown = ref<string | null>(null);\n const closeDropdown = (): void => { openDropdown.value = null; };\n\n const executeSubItem = (sub: ToolbarButton): void => {\n closeDropdown();\n const ed = editorRef.value;\n if (!ed) return;\n ToolbarController.executeItem(ed as never, sub);\n refocusEditorAfterCommand(ed.view);\n };\n\n // Refs to the trailing trigger buttons so we can pass the element as anchor\n // to the color picker and block context menu (positioning targets).\n const colorBtnRef = ref<HTMLButtonElement>();\n const blockMenuBtnRef = ref<HTMLButtonElement>();\n\n return () => {\n // Read activeVersion to establish reactive dependency\n void activeVersion.value;\n const t = trailing.value;\n\n const children: VNode[] = [];\n\n for (const item of resolvedItems.value) {\n if (item.type === 'separator') {\n children.push(h('span', { key: item.name, class: 'dm-toolbar-separator', role: 'separator' }));\n continue;\n }\n if (item.type === 'dropdown') {\n children.push(\n h(BubbleDropdown, {\n key: item.name,\n dropdown: item,\n isOpen: openDropdown.value === item.name,\n isItemActive,\n getCachedIcon,\n activeVersion: activeVersion.value,\n executeSubItem,\n onToggle: (): void => {\n openDropdown.value = openDropdown.value === item.name ? null : item.name;\n },\n onClose: closeDropdown,\n }),\n );\n continue;\n }\n const btn = item;\n const active = isItemActive(btn);\n children.push(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: (e: MouseEvent) => { executeCommand(btn, e); },\n }));\n }\n\n if (t.showColorPickerButton && !t.isNodeSelection) {\n children.push(\n h('span', { class: 'dm-toolbar-separator', role: 'separator' }),\n h('button', {\n ref: colorBtnRef,\n type: 'button',\n class: ['dm-toolbar-button', 'dm-ncp-trigger', t.hasAnyColor && 'dm-toolbar-button--active'],\n title: 'Text and background color',\n 'aria-label': 'Text and background color',\n 'aria-haspopup': 'dialog',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { if (colorBtnRef.value) openColorPicker(colorBtnRef.value); },\n }, [\n h('span', {\n class: 'dm-ncp-trigger-glyph',\n style: t.currentTextColorVar ? { color: t.currentTextColorVar } : undefined,\n }, 'A'),\n h('span', {\n class: 'dm-ncp-trigger-underline',\n style: t.currentBgColorVar ? { backgroundColor: t.currentBgColorVar } : undefined,\n }),\n ]),\n );\n }\n\n if (t.showBlockMenuButton && !t.isNodeSelection) {\n children.push(\n h('span', { class: 'dm-toolbar-separator', role: 'separator' }),\n h('button', {\n ref: blockMenuBtnRef,\n type: 'button',\n class: 'dm-toolbar-button',\n disabled: t.blockMenuButtonDisabled,\n title: t.blockMenuButtonDisabled\n ? 'Block actions (select within a single block)'\n : 'More options',\n 'aria-label': 'More options',\n 'aria-haspopup': 'menu',\n innerHTML: getCachedIcon('dotsThree'),\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { if (blockMenuBtnRef.value) openBlockContextMenu(blockMenuBtnRef.value); },\n }),\n );\n }\n\n const slotContent = slots['default']?.();\n if (slotContent) children.push(...slotContent);\n\n return h('div', {\n ref: menuRef,\n class: 'dm-bubble-menu',\n role: 'toolbar',\n 'aria-label': 'Text formatting',\n }, children);\n };\n },\n});\n\n// ===== Bubble-menu-embedded dropdown =====\n\n/**\n * Bubble-menu-embedded dropdown (e.g. text-align). Manages its own outside-\n * click / Escape / `dm:dismiss-overlays` lifecycle. Panel stays INSIDE\n * `.dm-bubble-menu` so it inherits bubble-scoped active-state tokens.\n */\nconst BubbleDropdown = defineComponent({\n name: 'BubbleDropdown',\n props: {\n dropdown: { type: Object as PropType<ToolbarDropdown>, required: true },\n isOpen: { type: Boolean, required: true },\n isItemActive: { type: Function as PropType<(item: ToolbarButton) => boolean>, required: true },\n getCachedIcon: { type: Function as PropType<(name: string) => string>, required: true },\n activeVersion: { type: Number, required: true },\n executeSubItem: { type: Function as PropType<(sub: ToolbarButton) => void>, required: true },\n },\n emits: ['toggle', 'close'],\n setup(props, { emit }) {\n const triggerRef = ref<HTMLButtonElement>();\n const panelRef = ref<HTMLDivElement>();\n\n // Position dropdown + outside-close / Escape / cooperative dismissal via\n // a single AbortController. `flush: 'post'` waits for the panel to mount\n // before measuring + positioning.\n watch(\n () => props.isOpen,\n (open, _old, onCleanup) => {\n if (!open) return;\n const trigger = triggerRef.value;\n const panel = panelRef.value;\n if (!trigger || !panel) return;\n\n const cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (panel.contains(target)) return;\n if (trigger.contains(target)) return;\n emit('close');\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n emit('close');\n }\n }, { signal });\n\n // Cooperative dismissal: other overlays (color picker, link popover)\n // broadcast this event when opening; our dropdown closes in response.\n // We deliberately do NOT broadcast it ourselves - the bubble menu\n // plugin listens for it and would hide, taking our trigger with it.\n const editorEl = trigger.closest<HTMLElement>('.dm-editor');\n editorEl?.addEventListener('dm:dismiss-overlays', () => { emit('close'); }, { signal });\n\n onCleanup(() => {\n controller.abort();\n cleanupFloating();\n });\n },\n { flush: 'post' },\n );\n\n return () => {\n // Read activeVersion to subscribe to active-state changes.\n void props.activeVersion;\n const dropdown = props.dropdown;\n const dropdownActive = dropdown.items.some((sub) => props.isItemActive(sub));\n const activeChild = dropdown.dynamicIcon\n ? dropdown.items.find((sub) => props.isItemActive(sub))\n : undefined;\n const triggerIcon = activeChild?.icon ?? dropdown.icon;\n const triggerHtml = props.getCachedIcon(triggerIcon) + DROPDOWN_CARET;\n\n return h('div', {\n class: 'dm-toolbar-dropdown-wrapper',\n 'data-dropdown-wrapper': dropdown.name,\n }, [\n h('button', {\n ref: triggerRef,\n type: 'button',\n class: ['dm-toolbar-button', 'dm-toolbar-dropdown-trigger', dropdownActive && 'dm-toolbar-button--active'],\n 'aria-expanded': props.isOpen,\n 'aria-haspopup': 'true',\n 'aria-label': dropdown.label,\n title: dropdown.label,\n 'data-dropdown': dropdown.name,\n innerHTML: triggerHtml,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { emit('toggle'); },\n }),\n props.isOpen\n ? h('div', {\n ref: panelRef,\n class: 'dm-toolbar-dropdown-panel',\n role: 'menu',\n 'data-dm-editor-ui': '',\n 'data-dropdown-panel': dropdown.name,\n }, dropdown.items.map((sub) => {\n const subActive = props.isItemActive(sub);\n const subHtml = `${props.getCachedIcon(sub.icon)} ${sub.label}`;\n return h('button', {\n key: sub.name,\n type: 'button',\n class: ['dm-toolbar-dropdown-item', subActive && 'dm-toolbar-dropdown-item--active'],\n role: 'menuitem',\n 'aria-label': sub.label,\n innerHTML: subHtml,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { props.executeSubItem(sub); },\n });\n }))\n : null,\n ]);\n };\n },\n});\n","import {\n defineComponent,\n h,\n nextTick,\n onMounted,\n onScopeDispose,\n ref,\n shallowRef,\n watch,\n} from 'vue';\nimport type { PropType } from 'vue';\nimport {\n PluginKey,\n FloatingMenuController,\n createFloatingMenuPlugin,\n defaultIcons,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n} from '@domternal/core';\nimport { useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalFloatingMenuProps {\n editor?: Editor;\n shouldShow?: FloatingMenuOptions['shouldShow'];\n offset?: number;\n items?: FloatingMenuItemsOverride;\n keymap?: FloatingMenuKeymap;\n icons?: IconSet;\n /**\n * When true, the menu does NOT auto-show on every empty paragraph;\n * it only opens when the BlockHandle `+` button (or any caller of\n * `showFloatingMenu`) explicitly triggers it. Notion-style behaviour\n * - empty rows show a placeholder, the slash menu is the keyboard\n * trigger, the `+` button is the gutter trigger.\n * @default false\n */\n requireExplicitTrigger?: boolean;\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 items: {\n type: [Array, Function] as PropType<FloatingMenuItemsOverride>,\n default: undefined,\n },\n keymap: { type: Object as PropType<FloatingMenuKeymap>, default: undefined },\n icons: { type: Object as PropType<IconSet>, default: undefined },\n requireExplicitTrigger: { type: Boolean, default: false },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n const menuRef = ref<HTMLDivElement>();\n // Prefer crypto.randomUUID for collision-free uniqueness (Math.random\n // across simultaneous mounts may collide; SSR can share the seed).\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const pluginKey = new PluginKey(\n 'vueFloatingMenu-' +\n (cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8)),\n );\n\n // Reactive controller state exposed to the render function.\n const controller = shallowRef<FloatingMenuController | null>(null);\n // Bump tracker forces re-renders when controller state changes without\n // swapping the controller instance.\n const version = ref(0);\n\n let registered = false;\n let stopWatch: (() => void) | null = null;\n let currentEditor: Editor | null = null;\n\n const resolveIcon = (name?: string): string => {\n if (!name) return '';\n return props.icons?.[name] ?? defaultIcons[name] ?? '';\n };\n\n const doRegister = (editor: Editor): void => {\n if (registered || editor.isDestroyed || !menuRef.value) return;\n registered = true;\n currentEditor = editor;\n\n const plugin = createFloatingMenuPlugin({\n pluginKey,\n editor,\n element: menuRef.value,\n ...(props.shouldShow && { shouldShow: props.shouldShow }),\n offset: props.offset,\n ...(props.keymap && { keymap: props.keymap }),\n requireExplicitTrigger: props.requireExplicitTrigger,\n });\n editor.registerPlugin(plugin);\n\n // Only create a controller when consumer did not supply custom\n // content via the default slot; in that case they own the rendering\n // and we stay out of their way.\n const hasCustomSlot = Boolean(slots['default']);\n if (!hasCustomSlot) {\n const ctl = new FloatingMenuController(editor, () => { version.value++; }, props.items);\n ctl.subscribe();\n controller.value = ctl;\n }\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 // Imperatively focus the active menuitem when focusedIndex changes.\n watch(\n () => [controller.value?.focusedIndex ?? -1, version.value] as const,\n ([focusedIndex]) => {\n if (focusedIndex < 0 || !menuRef.value) return;\n void nextTick(() => {\n const target = menuRef.value?.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(focusedIndex)}\"]`,\n );\n target?.focus();\n });\n },\n );\n\n onScopeDispose(() => {\n stopWatch?.();\n controller.value?.destroy();\n controller.value = null;\n const editor = currentEditor ?? props.editor ?? contextEditor.value;\n if (editor && !editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey);\n }\n });\n\n const onItemClick = (item: FloatingMenuItem): void => {\n const ctl = controller.value;\n const ed = currentEditor;\n if (!ctl || !ed) return;\n ctl.execute(item);\n refocusEditorAfterCommand(ed.view);\n };\n\n const onMenuKeyDown = (e: KeyboardEvent): void => {\n const ctl = controller.value;\n if (!ctl) return;\n const focused = ctl.focusedItem();\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n ctl.next();\n return;\n case 'ArrowUp':\n e.preventDefault();\n ctl.prev();\n return;\n case 'Home':\n e.preventDefault();\n ctl.first();\n return;\n case 'End':\n e.preventDefault();\n ctl.last();\n return;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n ctl.leaveMenu();\n currentEditor?.view.focus();\n return;\n case 'Enter':\n case ' ':\n if (focused) {\n e.preventDefault();\n onItemClick(focused);\n }\n return;\n default:\n return;\n }\n };\n\n return () => {\n // Custom slot: consumer owns rendering.\n if (slots['default']) {\n return h(\n 'div',\n { ref: menuRef, class: 'dm-floating-menu', 'data-dm-editor-ui': '' },\n slots['default'](),\n );\n }\n\n // Default render: groups of menu items from the controller.\n const ctl = controller.value;\n // Read version to ensure reactivity on state changes.\n void version.value;\n const groups = ctl?.groups ?? [];\n const focusedIndex = ctl?.focusedIndex ?? -1;\n\n // Flat index map for roving tabindex.\n const flatNames = groups.flatMap((g) => g.items.map((i) => i.name));\n\n return h(\n 'div',\n {\n ref: menuRef,\n class: 'dm-floating-menu',\n role: 'menu',\n 'aria-label': 'Insert block',\n 'data-dm-editor-ui': '',\n onKeydown: onMenuKeyDown,\n },\n groups.map((group, gi) => {\n const groupId = `dm-fm-g${String(gi)}`;\n return h('div', { key: group.name || `__group-${String(gi)}`, class: 'dm-floating-menu-group-wrapper' }, [\n group.name\n ? h('div', { class: 'dm-floating-menu-group-label', id: groupId }, group.name)\n : null,\n h(\n 'div',\n {\n class: 'dm-floating-menu-group',\n role: 'group',\n ...(group.name ? { 'aria-labelledby': groupId } : {}),\n },\n group.items.map((item) => {\n const flatIndex = flatNames.indexOf(item.name);\n const isFocused = flatIndex === focusedIndex;\n const disabled = ctl?.isDisabled(item) ?? false;\n const iconHtml = resolveIcon(item.icon);\n return h(\n 'button',\n {\n key: item.name,\n type: 'button',\n role: 'menuitem',\n class: 'dm-floating-menu-item',\n 'data-floating-menu-item': item.name,\n 'data-floating-menu-index': String(flatIndex),\n tabindex: isFocused || (focusedIndex < 0 && flatIndex === 0) ? 0 : -1,\n 'aria-disabled': disabled ? 'true' : undefined,\n 'aria-keyshortcuts': item.shortcut,\n disabled,\n onMousedown: (e: Event) => { e.preventDefault(); },\n onClick: () => { onItemClick(item); },\n },\n [\n iconHtml\n ? h('span', {\n class: 'dm-floating-menu-item-icon',\n 'aria-hidden': 'true',\n innerHTML: iconHtml,\n })\n : null,\n h('span', { class: 'dm-floating-menu-item-label' }, item.label),\n item.shortcut\n ? h('span', { class: 'dm-floating-menu-item-shortcut', 'aria-hidden': 'true' }, item.shortcut)\n : null,\n ],\n );\n }),\n ),\n ]);\n }),\n );\n };\n },\n});\n","import { computed, onScopeDispose, ref, watch } from 'vue';\nimport type { ComputedRef, Ref, 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 interface UseEmojiPickerResult {\n isOpen: Ref<boolean>;\n searchQuery: Ref<string>;\n activeCategory: Ref<string>;\n categories: ComputedRef<Map<string, EmojiPickerItem[]>>;\n categoryNames: ComputedRef<string[]>;\n filteredEmojis: ComputedRef<EmojiPickerItem[]>;\n frequentlyUsed: ComputedRef<EmojiPickerItem[]>;\n pickerRef: Ref<HTMLDivElement | undefined>;\n selectEmoji: (item: EmojiPickerItem) => void;\n onSearch: (event: Event) => void;\n scrollToCategory: (cat: string) => void;\n onGridScroll: () => void;\n close: () => void;\n}\n\nexport function useEmojiPicker(editor: ShallowRef<Editor | null>, emojis: EmojiPickerItem[]): UseEmojiPickerResult {\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 if (!storage) return [];\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(): void {\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(): void {\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(): void {\n clickOutsideHandler = (e: Event): void => {\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): void => {\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[]): void => {\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<HTMLElement>('.dm-emoji-picker');\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<HTMLInputElement>('.dm-emoji-picker-search input');\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): void {\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): void {\n searchQuery.value = (event.target as HTMLInputElement).value;\n }\n\n function scrollToCategory(cat: string): void {\n searchQuery.value = '';\n activeCategory.value = cat;\n requestAnimationFrame(() => {\n const grid = pickerRef.value?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\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(): void {\n if (searchQuery.value) return;\n const grid = pickerRef.value?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n\n const labels = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'));\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;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? 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): void {\n const grid = event.currentTarget as HTMLElement;\n const swatches = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'));\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n const 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): ReturnType<typeof h> {\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 { defineComponent, h, ref, watch, watchEffect } from 'vue';\nimport type { Component, PropType } from 'vue';\nimport type { AnyExtension, Content, FocusPosition } from '@domternal/core';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { provideEditor, useCurrentEditor } from './EditorContext.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\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 watch(\n () => props.editable,\n (newEditable) => {\n const ed = editor.value;\n if (ed && !ed.isDestroyed) ed.setEditable(newEditable);\n },\n );\n\n return () => slots['default']?.();\n },\n}) as unknown as Component & {\n Content: Component;\n Loading: Component;\n Toolbar: Component;\n BubbleMenu: Component;\n FloatingMenu: Component;\n EmojiPicker: Component;\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;\nDomternal.Toolbar = DomternalToolbar;\nDomternal.BubbleMenu = DomternalBubbleMenu;\nDomternal.FloatingMenu = DomternalFloatingMenu;\nDomternal.EmojiPicker = DomternalEmojiPicker;\n","import { defineComponent, h, ref, watch } from 'vue';\nimport type { PropType } from 'vue';\nimport type { Content, AnyExtension, FocusPosition, JSONContent, Editor } 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: Editor) => void;\n onUpdate?: (props: { editor: Editor }) => void;\n onSelectionChange?: (props: { editor: Editor }) => void;\n onFocus?: (props: { editor: Editor; event: FocusEvent }) => void;\n onBlur?: (props: { editor: 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: Editor) => void>, default: undefined },\n onUpdate: { type: Function as PropType<(props: { editor: Editor }) => void>, default: undefined },\n onSelectionChange: { type: Function as PropType<(props: { editor: Editor }) => void>, default: undefined },\n onFocus: { type: Function as PropType<(props: { editor: Editor; event: FocusEvent }) => void>, default: undefined },\n onBlur: { type: Function as PropType<(props: { editor: 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 // Sync editable prop to editor (useEditor's internal watcher can't track\n // props because the options object is a plain non-reactive snapshot)\n watch(\n () => props.editable,\n (newEditable) => {\n const ed = editor.value;\n if (ed && !ed.isDestroyed) ed.setEditable(newEditable);\n },\n );\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 = (): void => {\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 'data-dm-editor-ui': '',\n });\n },\n});\n","/**\n * useNotionColorPicker\n *\n * State and effect plumbing for the Notion-style inline color picker. Listens\n * for the `notionColorOpen` event emitted by the bubble menu's \"A\" trigger,\n * tracks the active text/background tokens, and exposes the imperative\n * commands consumers need (`applyText`, `applyBg`, `close`).\n *\n * The default component (`DomternalNotionColorPicker`) consumes this composable\n * and renders the panel via `<Teleport>`. Consumers building custom UIs can\n * call this composable directly.\n */\nimport { ref, shallowRef, watch } from 'vue';\nimport type { Ref, ShallowRef } from 'vue';\nimport type { Editor } from '@domternal/core';\n\ninterface NotionColorPickerStorage {\n isOpen: boolean;\n}\n\ninterface NotionColorPickerExtensionOptions {\n palette?: readonly string[];\n}\n\ninterface NotionColorOpenDetail {\n anchorElement?: HTMLElement;\n}\n\n/**\n * Display labels for the named-token palette. Used in tooltips / aria labels;\n * unknown tokens fall back to a title-cased version of the raw key.\n */\nconst TOKEN_LABELS: Record<string, string> = {\n gray: 'Gray',\n brown: 'Brown',\n orange: 'Orange',\n yellow: 'Yellow',\n green: 'Green',\n blue: 'Blue',\n purple: 'Purple',\n pink: 'Pink',\n red: 'Red',\n};\n\nexport interface UseNotionColorPickerOptions {\n editor: ShallowRef<Editor | null>;\n}\n\nexport interface UseNotionColorPickerResult {\n /** Whether the picker panel is currently open. */\n isOpen: Ref<boolean>;\n /** Editor host element (`.dm-editor`) used as the Teleport target. Null until the editor is ready. */\n hostEl: ShallowRef<HTMLElement | null>;\n /** Anchor element the picker positions against (the bubble-menu \"A\" trigger button). */\n anchorEl: ShallowRef<HTMLElement | null>;\n /** Ref to the panel root, used by the picker UI for positioning + focus management. */\n panelRef: Ref<HTMLDivElement | undefined>;\n /** Currently applied text token at the cursor, or null when default. */\n currentTextToken: Ref<string | null>;\n /** Currently applied background token at the cursor, or null when default. */\n currentBgToken: Ref<string | null>;\n /** Named-token palette (read from the NotionColorPicker extension options). */\n palette: ShallowRef<readonly string[]>;\n /** Apply a text color token to the current selection. Picker stays open. */\n applyText: (token: string | null) => void;\n /** Apply a background color token to the current selection. Picker stays open. */\n applyBg: (token: string | null) => void;\n /** Close the picker. When `refocus` is true, returns focus to the editor view. */\n close: (opts?: { refocus?: boolean }) => void;\n /** Display label for a palette token (defaults to title-case fallback). */\n tokenLabel: (token: string) => string;\n /** Arrow / Home / End keyboard navigation across the 5-column swatch grid. */\n onPanelKeydown: (event: KeyboardEvent) => void;\n}\n\nexport function useNotionColorPicker(\n options: UseNotionColorPickerOptions,\n): UseNotionColorPickerResult {\n const { editor } = options;\n\n const isOpen = ref(false);\n const anchorEl = shallowRef<HTMLElement | null>(null);\n const hostEl = shallowRef<HTMLElement | null>(null);\n const panelRef = ref<HTMLDivElement>();\n const currentTextToken = ref<string | null>(null);\n const currentBgToken = ref<string | null>(null);\n const palette = shallowRef<readonly string[]>([]);\n\n const setStorageOpen = (open: boolean): void => {\n const ed = editor.value;\n if (!ed) return;\n const slot = ed.storage['notionColorPicker'];\n if (slot && typeof slot === 'object') {\n (slot as NotionColorPickerStorage).isOpen = open;\n }\n };\n\n /**\n * Inspect the current selection and update active-state indicators. Reads\n * stored marks at empty cursor; walks text nodes for non-empty selections\n * (since `$from.nodeAfter` can land on a block at boundary positions).\n */\n const syncFromSelection = (): void => {\n const ed = editor.value;\n if (!ed) return;\n const { selection } = ed.state;\n\n let mark: { attrs: Record<string, unknown> } | null = null;\n if (selection.empty) {\n mark = selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n ed.state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (mark) return false;\n if (node.isText) {\n const found = node.marks.find((m) => m.type.name === 'textStyle');\n if (found) mark = found;\n }\n return true;\n });\n }\n\n const attrs = (mark?.attrs ?? {}) as { colorToken?: string | null; backgroundColorToken?: string | null };\n currentTextToken.value = attrs.colorToken ?? null;\n currentBgToken.value = attrs.backgroundColorToken ?? null;\n };\n\n const close = (opts: { refocus?: boolean } = {}): void => {\n if (!isOpen.value) return;\n isOpen.value = false;\n setStorageOpen(false);\n if (opts.refocus) {\n // Focus the editor view, not the trigger button: trigger focus would\n // leave the user without a caret.\n editor.value?.view.focus();\n }\n anchorEl.value = null;\n };\n\n // Editor-scoped subscription: open event + selection updates. Re-attaches\n // when the editor reference changes (i.e. HMR / route remount).\n watch(\n editor,\n (ed, _oldEd, onCleanup) => {\n if (!ed || ed.isDestroyed) return;\n\n // Cache the `.dm-editor` host once per editor instance (it doesn't move).\n hostEl.value = ed.view.dom.closest<HTMLElement>('.dm-editor');\n\n // Read palette from the extension options. Extension list is immutable\n // after editor construction, so this only runs once per editor.\n const ext = ed.extensionManager.extensions.find((e) => e.name === 'notionColorPicker');\n const extOptions = (ext?.options ?? null) as NotionColorPickerExtensionOptions | null;\n palette.value = extOptions?.palette ? [...extOptions.palette] : [];\n\n const onOpen = (...args: unknown[]): void => {\n const detail = args[0] as NotionColorOpenDetail | undefined;\n const incomingAnchor = detail?.anchorElement;\n if (!incomingAnchor) return;\n // Toggle: clicking the same anchor while open closes the picker.\n if (isOpen.value && anchorEl.value === incomingAnchor) {\n close({ refocus: true });\n return;\n }\n anchorEl.value = incomingAnchor;\n syncFromSelection();\n isOpen.value = true;\n setStorageOpen(true);\n };\n\n const onSelectionUpdate = (): void => {\n if (!isOpen.value) return;\n // Anchor vanished (bubble menu hidden by selection becoming empty,\n // or by any other reason). Close defensively.\n if (!anchorEl.value?.isConnected) {\n close();\n return;\n }\n if (ed.state.selection.empty) {\n close();\n } else {\n // Selection changed but stays non-empty (e.g. shift+arrow). Refresh\n // active-state indicators against the new mark set.\n syncFromSelection();\n }\n };\n\n (ed.on as (e: string, h: (...args: unknown[]) => void) => void)('notionColorOpen', onOpen);\n (ed.on as (e: string, h: () => void) => void)('selectionUpdate', onSelectionUpdate);\n\n onCleanup(() => {\n (ed.off as (e: string, h: (...args: unknown[]) => void) => void)('notionColorOpen', onOpen);\n (ed.off as (e: string, h: () => void) => void)('selectionUpdate', onSelectionUpdate);\n // Only flip storage when the picker was actually open. Unconditional\n // reset would race a dev-mode double-mount: the first mount's\n // cleanup would clobber an `isOpen=true` set by the second mount's\n // open handler that landed between teardown and re-mount.\n if (isOpen.value) setStorageOpen(false);\n });\n },\n { immediate: true },\n );\n\n // Document-level listeners (outside-click + Escape) scoped to the open\n // window via a single AbortController.\n watch(isOpen, (open, _old, onCleanup) => {\n if (!open) return;\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n // No redundant `isOpen` guard: this effect only runs when `isOpen === true`\n // and the AbortController detaches the listener as soon as it flips false.\n const target = e.target as Node | null;\n if (!target) return;\n if (panelRef.value?.contains(target)) return;\n if (anchorEl.value?.contains(target)) return;\n close({ refocus: false });\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen.value) {\n e.preventDefault();\n close({ refocus: true });\n }\n }, { signal });\n\n onCleanup(() => { controller.abort(); });\n });\n\n const applyText = (token: string | null): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.commands as unknown as { setTextColorToken: (t: string | null) => boolean })\n .setTextColorToken(token);\n syncFromSelection();\n };\n\n const applyBg = (token: string | null): void => {\n const ed = editor.value;\n if (!ed) return;\n (ed.commands as unknown as { setBackgroundColorToken: (t: string | null) => boolean })\n .setBackgroundColorToken(token);\n syncFromSelection();\n };\n\n const tokenLabel = (token: string): string => {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n };\n\n /**\n * Arrow / Home / End nav across the 5-column swatch grid. Sequential focus\n * walks both Text and Background sections so keyboard users can reach any\n * swatch without re-grabbing Tab.\n */\n const onPanelKeydown = (event: KeyboardEvent): void => {\n const cols = 5;\n const root = panelRef.value;\n if (!root) return;\n const swatches = Array.from(\n root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement as HTMLElement | null;\n const idx = active ? swatches.indexOf(active) : -1;\n if (idx === -1) return;\n\n let next = idx;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n next = Math.min(idx + 1, swatches.length - 1);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n next = Math.max(idx - 1, 0);\n break;\n case 'ArrowDown':\n event.preventDefault();\n next = Math.min(idx + cols, swatches.length - 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n next = Math.max(idx - cols, 0);\n break;\n case 'Home':\n event.preventDefault();\n next = 0;\n break;\n case 'End':\n event.preventDefault();\n next = swatches.length - 1;\n break;\n default:\n return;\n }\n swatches[next]?.focus();\n };\n\n return {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n close,\n tokenLabel,\n onPanelKeydown,\n };\n}\n","/**\n * DomternalNotionColorPicker\n *\n * Notion-style inline color picker rendered via `<Teleport>` into the\n * `.dm-editor` host. The teleport target keeps the panel inside the editor's\n * CSS-variable scope (theme tokens cascade) without imperative DOM moves.\n *\n * Opens in response to the `notionColorOpen` event emitted by the bubble\n * menu's \"A\" trigger. Two sections: text color (top), background color\n * (bottom). Each section is a default-swatch plus the named-token palette.\n *\n * The default UI is rendered when no slot content is provided. Pass a\n * default scoped slot to take over rendering while keeping the composable's\n * lifecycle - the slot receives the full `useNotionColorPicker` API.\n */\nimport { computed, defineComponent, h, Teleport, watch } from 'vue';\nimport type { PropType, ShallowRef, VNode } from 'vue';\nimport { positionFloating } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useNotionColorPicker, type UseNotionColorPickerResult } from './useNotionColorPicker.js';\n\nexport interface DomternalNotionColorPickerProps {\n /** The editor instance. If omitted, uses provideEditor context. */\n editor?: Editor;\n}\n\nexport const DomternalNotionColorPicker = defineComponent({\n name: 'DomternalNotionColorPicker',\n props: {\n editor: { type: Object as PropType<Editor>, default: undefined },\n },\n setup(props, { slots }) {\n const { editor: contextEditor } = useCurrentEditor();\n // `computed` returns ComputedRef but the composables expect ShallowRef. Cast\n // is safe (both share the same .value interface and watch subscribes to either)\n // and matches the wrapper convention (see useEmojiPicker / DomternalBubbleMenu).\n const editorRef = computed(() => props.editor ?? contextEditor.value) as ShallowRef<Editor | null>;\n\n const api = useNotionColorPicker({ editor: editorRef });\n const {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n tokenLabel,\n onPanelKeydown,\n } = api;\n\n // Position + two-rAF focus chain. `flush: 'post'` waits for the panel to\n // mount inside the Teleport target before measuring + focusing. Cleanup\n // cancels pending rAFs to avoid racing the panel unmount.\n watch(\n [isOpen, anchorEl],\n ([open, anchor], _old, onCleanup) => {\n if (!open || !anchor || !panelRef.value) return;\n const panel = panelRef.value;\n\n const cleanupFloating = positionFloating(anchor, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n // Second rAF waits for paint so focus doesn't race the bubble-menu blur.\n let id2 = 0;\n const id1 = requestAnimationFrame(() => {\n id2 = requestAnimationFrame(() => {\n if (!panel.isConnected) return;\n const active = panel.querySelector<HTMLElement>('.dm-ncp-swatch.dm-ncp-active');\n const fallback = panel.querySelector<HTMLElement>('.dm-ncp-swatch--text[data-color=\"null\"]');\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n });\n\n onCleanup(() => {\n cancelAnimationFrame(id1);\n if (id2) cancelAnimationFrame(id2);\n cleanupFloating();\n });\n },\n { flush: 'post' },\n );\n\n const renderDefaultPanel = (): VNode[] => {\n const tToken = currentTextToken.value;\n const bToken = currentBgToken.value;\n const pal = palette.value;\n return [\n h('div', { class: 'dm-ncp-section' }, [\n h('div', { class: 'dm-ncp-label' }, 'Text color'),\n h('div', { class: 'dm-ncp-grid' }, [\n h('button', {\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--text', tToken === null && 'dm-ncp-active'],\n 'aria-pressed': tToken === null,\n 'data-color': 'null',\n title: 'Default text color',\n 'aria-label': 'Default text color',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyText(null); },\n }),\n ...pal.map((t) => h('button', {\n key: t,\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--text', tToken === t && 'dm-ncp-active'],\n 'aria-pressed': tToken === t,\n 'data-color': t,\n title: tokenLabel(t),\n 'aria-label': `${tokenLabel(t)} text`,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyText(t); },\n })),\n ]),\n ]),\n h('div', { class: 'dm-ncp-section' }, [\n h('div', { class: 'dm-ncp-label' }, 'Background color'),\n h('div', { class: 'dm-ncp-grid' }, [\n h('button', {\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--bg', bToken === null && 'dm-ncp-active'],\n 'aria-pressed': bToken === null,\n 'data-color': 'null',\n title: 'Default background',\n 'aria-label': 'Default background',\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyBg(null); },\n }),\n ...pal.map((t) => h('button', {\n key: t,\n type: 'button',\n class: ['dm-ncp-swatch', 'dm-ncp-swatch--bg', bToken === t && 'dm-ncp-active'],\n 'aria-pressed': bToken === t,\n 'data-color': t,\n title: `${tokenLabel(t)} background`,\n 'aria-label': `${tokenLabel(t)} background`,\n onMousedown: (e: MouseEvent) => { e.preventDefault(); },\n onClick: () => { applyBg(t); },\n })),\n ]),\n ]),\n ];\n };\n\n return () => {\n // SSR-safe: render nothing until the picker is open AND the editor host\n // has been resolved. Teleport's target must be a real DOM node.\n if (!isOpen.value || !hostEl.value) return null;\n\n const slot = slots['default'];\n const slotChildren = slot ? slot({ api } as { api: UseNotionColorPickerResult }) : undefined;\n const panelChildren = slotChildren ?? renderDefaultPanel();\n\n return h(Teleport, { to: hostEl.value }, [\n h('div', {\n ref: panelRef,\n class: 'dm-notion-color-picker',\n 'data-show': '',\n 'data-dm-editor-ui': '',\n role: 'dialog',\n 'aria-label': 'Text and background color',\n // Intentional non-modal: the picker doesn't trap focus (outside-click\n // closes, editor stays interactive). `role=\"dialog\"` defaults to\n // modal=true for screen readers, so we explicitly opt out.\n 'aria-modal': 'false',\n onKeydown: onPanelKeydown,\n }, panelChildren),\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 onDragStart: ((event: DragEvent) => void) | undefined;\n nodeViewContentRef: ((el: HTMLElement | null) => void) | undefined;\n} {\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): (node: PMNode, view: unknown, getPos: () => number | undefined, decorations: readonly unknown[]) => VueNodeView | { dom: HTMLElement; update: () => boolean; destroy: () => void } {\n // Handle class-based Vue components with __vccOpts\n const normalizedComponent: Component = typeof component === 'function'\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 | undefined;\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 || !editor) {\n if ((globalThis as { __DEV__?: boolean }).__DEV__ !== false) {\n // eslint-disable-next-line no-console\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: () => { /* noop */ } };\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): void => {\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): void => {\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(): void {\n this.props.selected = true;\n }\n\n deselectNode(): void {\n this.props.selected = false;\n }\n\n destroy(): void {\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"]}
|