@domternal/vanilla 0.9.1 → 0.10.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/isBrowser.ts","../src/shared/pluginKey.ts","../src/shared/iconRenderer.ts","../src/shared/eventTarget.ts","../src/editor/DomternalEditor.ts","../src/toolbar/tooltip.ts","../src/toolbar/iconCache.ts","../src/toolbar/computedStyle.ts","../src/toolbar/DomternalToolbar.ts","../src/bubble-menu/itemResolver.ts","../src/bubble-menu/trailingState.ts","../src/bubble-menu/DomternalBubbleMenu.ts","../src/floating-menu/DomternalFloatingMenu.ts","../src/notion-color-picker/DomternalNotionColorPicker.ts","../src/emoji-picker/DomternalEmojiPicker.ts"],"names":["defaultIcons","DROPDOWN_CARET","ToolbarController","positionFloatingOnce"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SSR-safe environment check.\n *\n * `@domternal/vanilla` classes construct DOM nodes and attach listeners on\n * `document` / `window`. During SSR (Astro/Nuxt/Next.js build), the module\n * may be imported but constructors must NOT run server-side.\n *\n * Class constructors call `assertBrowser()` early to throw a clear error\n * if invoked outside a browser environment.\n *\n * @example\n * ```ts\n * import { isBrowser, assertBrowser } from '@domternal/vanilla';\n *\n * if (isBrowser) {\n * const editor = new DomternalEditor(host, { editor });\n * }\n *\n * // Or, in a constructor that requires browser:\n * class MyWrapper {\n * constructor(host: HTMLElement) {\n * assertBrowser('MyWrapper');\n * // ... safe to use document/window from here\n * }\n * }\n * ```\n */\nexport const isBrowser: boolean =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Assert the current environment is a browser. Throws with an actionable\n * error message tailored to common SSR frameworks (Astro, Nuxt, Next.js).\n *\n * @param className - Name of the calling class, included in the error\n * message so users can identify the culprit constructor in a stack trace.\n *\n * @throws Error if called server-side.\n */\nexport function assertBrowser(className: string): void {\n if (!isBrowser) {\n throw new Error(\n `[${className}] requires a browser environment. ` +\n `If using Astro, wrap with <client:only=\"vanilla\"> or instantiate inside a <script> tag. ` +\n `If using Nuxt/Next.js, gate construction with a typeof window check.`,\n );\n }\n}\n","import { PluginKey } from '@domternal/core';\n\n/**\n * Create a unique `PluginKey` with collision-free suffix.\n *\n * Two instances of the same wrapper class mounted in the same editor (rare\n * but supported) need distinct keys to avoid ProseMirror plugin clashes.\n *\n * Why crypto.randomUUID + Math.random fallback: matches the framework\n * wrapper convention (angular, react, vue all use this pattern as of\n * commit fbef072). SSR may share Math.random seed across mount cycles,\n * giving collisions; crypto.randomUUID is collision-free by spec.\n *\n * @param prefix - Human-readable prefix for debugging. Convention: kebab or\n * camel case identifying the wrapper. e.g. `'vanillaBubbleMenu'`.\n * @returns A `PluginKey` with format `<prefix>-<8-char-suffix>`.\n *\n * @example\n * ```ts\n * import { createPluginKey } from '@domternal/vanilla';\n *\n * class MyBubbleMenu {\n * #pluginKey = createPluginKey('myBubbleMenu');\n *\n * constructor(editor: Editor) {\n * const plugin = createBubbleMenuPlugin({\n * pluginKey: this.#pluginKey,\n * editor,\n * element: this.host,\n * });\n * editor.registerPlugin(plugin);\n * }\n *\n * destroy() {\n * this.editor.unregisterPlugin(this.#pluginKey);\n * }\n * }\n * ```\n */\nexport function createPluginKey(prefix: string): PluginKey {\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const suffix =\n cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8);\n return new PluginKey(prefix + '-' + suffix);\n}\n","import { defaultIcons } from '@domternal/core';\nimport type { IconSet } from '@domternal/core';\n\n/**\n * Resolve and inject an icon's SVG string into a host element.\n *\n * Why innerHTML is safe here: icons come from the `defaultIcons` lookup\n * table (Phosphor SVG strings shipped with core) or from a consumer-provided\n * `IconSet` object. Both are trusted by contract because they are constants in\n * source code, not user input. This matches the React (`dangerouslySetInnerHTML`),\n * Angular (`bypassSecurityTrustHtml`), and Vue (`v-html`) patterns.\n *\n * Consumer responsibility (documented in README): never pass user-controlled\n * strings as icon values in your `IconSet`.\n *\n * @param hostEl - Target element. `innerHTML` is replaced (existing children\n * are removed).\n * @param iconKey - Icon name to look up in `icons` first, then `defaultIcons`.\n * When `undefined`, the host is emptied.\n * @param icons - Optional consumer-provided icon overrides. Falls back to\n * `defaultIcons` if not provided or if the key is missing.\n *\n * @example\n * ```ts\n * import { renderIconInto } from '@domternal/vanilla';\n *\n * const button = document.createElement('button');\n * const iconSpan = document.createElement('span');\n * button.appendChild(iconSpan);\n *\n * renderIconInto(iconSpan, 'textB'); // default Phosphor icon\n * renderIconInto(iconSpan, 'bold', { bold: mySvg }); // custom override\n * renderIconInto(iconSpan, undefined); // clear icon\n * ```\n */\nexport function renderIconInto(\n hostEl: HTMLElement,\n iconKey: string | undefined,\n icons: IconSet | undefined,\n): void {\n if (!iconKey) {\n hostEl.innerHTML = '';\n return;\n }\n const customIcon: string | undefined = icons?.[iconKey];\n const defaultIcon: string | undefined = defaultIcons[iconKey];\n const svg = customIcon ?? defaultIcon ?? '';\n hostEl.innerHTML = svg;\n}\n\n/**\n * Resolve an icon's SVG string without injection. Useful when caller\n * builds the final DOM tree (e.g. via `document.createElement` chain\n * or template literal interpolation).\n *\n * @param iconKey - Icon name to look up. When `undefined`, returns `''`.\n * @param icons - Optional consumer overrides; falls back to `defaultIcons`.\n * @returns Trusted SVG string, or `''` if the icon is unknown.\n *\n * @example\n * ```ts\n * import { resolveIcon } from '@domternal/vanilla';\n *\n * const iconHtml = resolveIcon('textB', undefined);\n * const button = document.createElement('button');\n * button.innerHTML = `<span class=\"icon\">${iconHtml}</span><span>Bold</span>`;\n * ```\n */\nexport function resolveIcon(\n iconKey: string | undefined,\n icons: IconSet | undefined,\n): string {\n if (!iconKey) return '';\n return icons?.[iconKey] ?? defaultIcons[iconKey] ?? '';\n}\n","/**\n * Helpers for typed event subscription over `EventTarget`.\n *\n * Each `@domternal/vanilla` class extends the platform `EventTarget` and\n * dispatches `CustomEvent` instances. Consumers can use the platform\n * `addEventListener('eventName', handler)` directly, OR call `subscribe()`\n * which returns an unsubscribe function and narrows the detail type.\n *\n * Usage:\n * ```ts\n * import { subscribe } from '@domternal/vanilla';\n *\n * const off = subscribe<{ isOpen: boolean }>(picker, 'openchange', (detail) => {\n * console.log(detail.isOpen);\n * });\n * off(); // remove listener\n * ```\n *\n * Each class JSDoc lists the events it emits + the shape of `detail`.\n */\n// TDetail is used once in the signature (intentional - consumer specifies\n// the CustomEvent detail type at call site for type-safe handler). The\n// rule flags this as \"unnecessary\", but it IS necessary for DX.\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport function subscribe<TDetail = unknown>(\n target: EventTarget,\n type: string,\n listener: (detail: TDetail) => void,\n): () => void {\n const wrapper = (event: Event): void => {\n listener((event as CustomEvent<TDetail>).detail);\n };\n target.addEventListener(type, wrapper);\n return (): void => {\n target.removeEventListener(type, wrapper);\n };\n}\n","import {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type {\n Content,\n AnyExtension,\n FocusPosition,\n JSONContent,\n TransactionEventProps,\n FocusEventProps,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n];\n\nexport interface DomternalEditorOptions {\n /** Custom extensions to add. Merged on top of `DEFAULT_EXTENSIONS`. */\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 /**\n * Output format hint for downstream consumers (e.g. host frameworks\n * comparing controlled-mode content). Does not change editor behavior.\n * @default 'html'\n */\n outputFormat?: 'html' | 'json';\n /** Called once when the underlying Editor instance is created. */\n onCreate?: (editor: Editor) => void;\n /** Called when the document content changes. */\n onUpdate?: (ctx: { editor: Editor }) => void;\n /** Called when the selection moves without a content change. */\n onSelectionChange?: (ctx: { editor: Editor }) => void;\n /** Called when the editor gains focus. */\n onFocus?: (ctx: { editor: Editor; event: FocusEvent }) => void;\n /** Called when the editor loses focus. */\n onBlur?: (ctx: { editor: Editor; event: FocusEvent }) => void;\n /** Called before the underlying Editor is destroyed. */\n onDestroy?: () => void;\n}\n\n/**\n * `DomternalEditor` - vanilla DOM wrapper around `@domternal/core`'s `Editor`.\n *\n * Mounts an editor into the host element, wires lifecycle callbacks, exposes\n * reactive-friendly getters via plain properties, and dispatches `CustomEvent`\n * instances for state changes (so framework adapters can bridge).\n *\n * Construction is browser-only - throws in SSR contexts (use Astro\n * `<client:only=\"vanilla\">` or similar gate).\n *\n * Cleanup is automatic via `destroy()` (calls `editor.destroy()` + emits\n * `destroy` event).\n *\n * @example\n * ```ts\n * import { DomternalEditor } from '@domternal/vanilla';\n * import { StarterKit } from '@domternal/core';\n *\n * const host = document.getElementById('editor')!;\n * const wrapper = new DomternalEditor(host, {\n * extensions: [StarterKit],\n * content: '<p>Hello world</p>',\n * onUpdate: ({ editor }) => console.log(editor.getHTML()),\n * });\n *\n * // Reactive access via getters:\n * console.log(wrapper.htmlContent);\n * console.log(wrapper.isEmpty);\n *\n * // Event subscription (CustomEvent):\n * wrapper.addEventListener('update', () => {\n * console.log('content changed');\n * });\n *\n * // Cleanup:\n * wrapper.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `create` - `{ editor: Editor }` - emitted once after Editor instantiation\n * - `update` - `{ editor: Editor }` - emitted on every content change\n * - `selectionchange` - `{ editor: Editor }` - emitted on selection-only updates\n * - `focus` - `{ editor: Editor; event: FocusEvent }`\n * - `blur` - `{ editor: Editor; event: FocusEvent }`\n * - `destroy` - `null` - emitted just before destroy completes\n */\nexport class DomternalEditor extends EventTarget {\n /** The underlying ProseMirror-backed `Editor` instance. */\n readonly editor: Editor;\n /** The host element provided to the constructor. */\n readonly host: HTMLElement;\n\n #destroyed = false;\n #onCreate: DomternalEditorOptions['onCreate'];\n #onUpdate: DomternalEditorOptions['onUpdate'];\n #onSelectionChange: DomternalEditorOptions['onSelectionChange'];\n #onFocus: DomternalEditorOptions['onFocus'];\n #onBlur: DomternalEditorOptions['onBlur'];\n #onDestroy: DomternalEditorOptions['onDestroy'];\n\n #transactionHandler: ((props: TransactionEventProps) => void) | null = null;\n #focusHandler: ((props: FocusEventProps) => void) | null = null;\n #blurHandler: ((props: FocusEventProps) => void) | null = null;\n\n constructor(host: HTMLElement, options: DomternalEditorOptions = {}) {\n super();\n assertBrowser('DomternalEditor');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalEditor] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#editor\")).',\n );\n }\n\n this.host = host;\n this.#onCreate = options.onCreate;\n this.#onUpdate = options.onUpdate;\n this.#onSelectionChange = options.onSelectionChange;\n this.#onFocus = options.onFocus;\n this.#onBlur = options.onBlur;\n this.#onDestroy = options.onDestroy;\n\n this.editor = new Editor({\n element: host,\n extensions: [...DEFAULT_EXTENSIONS, ...(options.extensions ?? [])],\n content: options.content ?? '',\n editable: options.editable ?? true,\n autofocus: options.autofocus ?? false,\n });\n\n this.#wireEditorEvents();\n\n this.#onCreate?.(this.editor);\n this.dispatchEvent(\n new CustomEvent('create', { detail: { editor: this.editor } }),\n );\n }\n\n // === Reactive-friendly getters ===\n\n get htmlContent(): string {\n return this.editor.getHTML();\n }\n\n get jsonContent(): JSONContent {\n return this.editor.getJSON();\n }\n\n get isEmpty(): boolean {\n return this.editor.isEmpty;\n }\n\n get isFocused(): boolean {\n return this.editor.isFocused;\n }\n\n get isEditable(): boolean {\n return this.editor.isEditable;\n }\n\n // === Mutators ===\n\n /**\n * Replace editor content. Does NOT emit `update` event by default\n * (mirrors `Editor.setContent` behavior); pass `emitUpdate=true` to fire.\n *\n * No-op if the wrapper has been destroyed.\n */\n setContent(content: Content, emitUpdate = false): void {\n if (this.#destroyed) return;\n this.editor.setContent(content, emitUpdate);\n }\n\n /**\n * Toggle the editor's editable state (`true` allows input, `false` makes\n * it read-only). No-op if the wrapper has been destroyed.\n */\n setEditable(editable: boolean): void {\n if (this.#destroyed) return;\n this.editor.setEditable(editable);\n }\n\n /**\n * Programmatically focus the editor.\n *\n * @param position - Focus position (`'start' | 'end' | 'all' | number | boolean`).\n * Defaults to current selection. No-op if the wrapper has been destroyed.\n */\n focus(position?: FocusPosition): void {\n if (this.#destroyed) return;\n this.editor.commands.focus(position);\n }\n\n /**\n * Tear down the underlying editor + remove all subscriptions.\n *\n * Idempotent - calling twice is a no-op. Dispatches a `destroy` CustomEvent\n * BEFORE the editor is destroyed, so listeners can read `this.editor` state\n * one last time.\n */\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#onDestroy?.();\n this.dispatchEvent(new CustomEvent('destroy', { detail: null }));\n\n this.#unwireEditorEvents();\n\n if (!this.editor.isDestroyed) {\n this.editor.destroy();\n }\n }\n\n // === Internal ===\n\n #wireEditorEvents(): void {\n this.#transactionHandler = ({ transaction }: TransactionEventProps): void => {\n if (transaction.docChanged) {\n this.#onUpdate?.({ editor: this.editor });\n this.dispatchEvent(\n new CustomEvent('update', { detail: { editor: this.editor } }),\n );\n }\n if (!transaction.docChanged && transaction.selectionSet) {\n this.#onSelectionChange?.({ editor: this.editor });\n this.dispatchEvent(\n new CustomEvent('selectionchange', { detail: { editor: this.editor } }),\n );\n }\n };\n\n this.#focusHandler = ({ event }: FocusEventProps): void => {\n this.#onFocus?.({ editor: this.editor, event });\n this.dispatchEvent(\n new CustomEvent('focus', { detail: { editor: this.editor, event } }),\n );\n };\n\n this.#blurHandler = ({ event }: FocusEventProps): void => {\n this.#onBlur?.({ editor: this.editor, event });\n this.dispatchEvent(\n new CustomEvent('blur', { detail: { editor: this.editor, event } }),\n );\n };\n\n this.editor.on('transaction', this.#transactionHandler as (...args: unknown[]) => void);\n this.editor.on('focus', this.#focusHandler as (...args: unknown[]) => void);\n this.editor.on('blur', this.#blurHandler as (...args: unknown[]) => void);\n }\n\n #unwireEditorEvents(): void {\n if (this.#transactionHandler) {\n this.editor.off('transaction', this.#transactionHandler as (...args: unknown[]) => void);\n this.#transactionHandler = null;\n }\n if (this.#focusHandler) {\n this.editor.off('focus', this.#focusHandler as (...args: unknown[]) => void);\n this.#focusHandler = null;\n }\n if (this.#blurHandler) {\n this.editor.off('blur', this.#blurHandler as (...args: unknown[]) => void);\n this.#blurHandler = null;\n }\n }\n}\n","import type { ToolbarButton } from '@domternal/core';\n\nconst isMac =\n typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\nconst MODIFIER_MAP: Record<string, string> = isMac\n ? { Mod: '⌘', Shift: '⇧', Alt: '⌥' }\n : { Mod: 'Ctrl', Shift: 'Shift', Alt: 'Alt' };\n\n/**\n * Format a toolbar button's tooltip including its keyboard shortcut.\n *\n * On macOS uses Unicode glyphs (⌘ ⇧ ⌥); elsewhere falls back\n * to \"Ctrl+Shift+Alt\" text. Mirrors Vue/React wrapper behavior.\n */\nexport 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","import { defaultIcons } from '@domternal/core';\nimport type { IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const 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 IconCache {\n resolveSvg: (name: string) => string;\n getIcon: (name: string) => string;\n getTriggerLabel: (label: string, isIcon?: boolean) => string;\n getTriggerIcon: (iconName: string) => string;\n getItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n getDropdownTriggerHtml: (dropdown: ToolbarDropdown, activeItem: ToolbarButton | undefined) => string;\n setIcons: (icons: IconSet | undefined) => void;\n}\n\n/**\n * Resolve + cache toolbar icons. Mirrors Vue's `useToolbarIcons` logic\n * verbatim - same cache keys, same fallback order (consumer `IconSet` ->\n * `defaultIcons`), same dropdown trigger HTML composition.\n *\n * Cache is invalidated when consumer swaps `IconSet`.\n */\nexport function createIconCache(initialIcons: IconSet | undefined): IconCache {\n const cache = new Map<string, string>();\n let icons: IconSet | undefined = initialIcons;\n let prevIcons: IconSet | undefined = initialIcons;\n\n function checkInvalidation(): void {\n if (icons !== prevIcons) {\n cache.clear();\n prevIcons = icons;\n }\n }\n\n function resolveSvg(name: string): string {\n if (icons) {\n return icons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n function getIcon(name: string): string {\n checkInvalidation();\n const key = `i:${name}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n cached = resolveSvg(name);\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getTriggerLabel(label: string, isIcon?: boolean): string {\n checkInvalidation();\n const key = `tl:${label}:${isIcon ? '1' : '0'}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n const content = isIcon ? resolveSvg(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 getTriggerIcon(iconName: string): string {\n checkInvalidation();\n const key = `t:${iconName}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n cached = resolveSvg(iconName) + DROPDOWN_CARET;\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getItemContent(\n iconName: string,\n label: string,\n displayMode?: 'icon-text' | 'text' | 'icon',\n ): string {\n const mode = displayMode ?? 'icon-text';\n checkInvalidation();\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n if (mode === 'text') {\n cached = label;\n } else if (mode === 'icon') {\n cached = resolveSvg(iconName);\n } else {\n cached = resolveSvg(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 checkInvalidation();\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 === undefined) {\n cached = resolveSvg(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 getTriggerLabel(activeItem.label);\n if (dropdown.dynamicLabelFallback) return getTriggerLabel(dropdown.dynamicLabelFallback);\n return getTriggerLabel(dropdown.icon, true);\n }\n\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return getTriggerIcon(icon);\n }\n\n function setIcons(newIcons: IconSet | undefined): void {\n icons = newIcons;\n }\n\n return {\n resolveSvg,\n getIcon,\n getTriggerLabel,\n getTriggerIcon,\n getItemContent,\n getDropdownTriggerHtml,\n setIcons,\n };\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 * Read a CSS property at the current cursor position.\n * Prefers inline style, falls back to computed style. Used by dropdowns\n * with `computedStyleProperty` (e.g. font-size) to show the current value\n * in their trigger label.\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 * Read ONLY inline style at the current cursor position (skips browser-default\n * computed inheritance). Used for `font-family` where computed value includes\n * the document's default fallback that would override any user-set font in the\n * toolbar's \"current font\" indicator.\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 {\n ToolbarController,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n Editor,\n IconSet,\n ToolbarButton,\n ToolbarControllerEditor,\n ToolbarDropdown,\n ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { getTooltip } from './tooltip.js';\nimport { createIconCache, DROPDOWN_CARET } from './iconCache.js';\nimport type { IconCache } from './iconCache.js';\nimport { getComputedStyleAtCursor, getInlineStyleAtCursor } from './computedStyle.js';\n\nexport interface DomternalToolbarOptions {\n /** Editor instance the toolbar binds to. */\n editor: Editor;\n /** Optional icon set override. Falls back to `defaultIcons` per key. */\n icons?: IconSet;\n /**\n * Optional custom layout (item names + separators + custom dropdowns).\n * When omitted, items are grouped by their declared `group` property and\n * sorted by priority within each group.\n *\n * @example\n * ```ts\n * new DomternalToolbar(host, {\n * editor,\n * layout: ['bold', 'italic', 'underline', '|', 'heading', '|', 'undo', 'redo'],\n * });\n * ```\n */\n layout?: ToolbarLayoutEntry[];\n}\n\n/**\n * `DomternalToolbar` - vanilla DOM toolbar bound to an editor's items.\n *\n * Mounts a `ToolbarController` from `@domternal/core` and renders its state\n * (groups, active map, disabled map, dropdown state) into the host element.\n *\n * Re-renders are batched via `requestAnimationFrame` so transaction-rate\n * updates don't thrash the DOM. Button DOM nodes are reused across renders\n * (only their classes/attrs update) to preserve focus when navigating with\n * the keyboard.\n *\n * @example\n * ```ts\n * import { Editor, StarterKit } from '@domternal/core';\n * import { DomternalToolbar } from '@domternal/vanilla';\n * import '@domternal/theme';\n *\n * const editor = new Editor({\n * element: document.getElementById('editor')!,\n * extensions: [StarterKit],\n * });\n *\n * const toolbar = new DomternalToolbar(document.getElementById('toolbar')!, {\n * editor,\n * // Optional custom layout:\n * // layout: ['bold', 'italic', '|', 'heading'],\n * });\n *\n * // Update later:\n * toolbar.setLayout(['bold', 'italic', 'underline']);\n *\n * // Cleanup:\n * toolbar.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `dropdownopen` - `{ name: string }` - emitted when a dropdown opens\n * - `dropdownclose` - `{ name: string }` - emitted when a dropdown closes\n */\nexport class DomternalToolbar extends EventTarget {\n readonly host: HTMLElement;\n\n /** The editor instance this toolbar is bound to. */\n get editor(): Editor {\n return this.#editor;\n }\n\n /** Underlying controller. Exposed for power-user introspection. */\n get controller(): ToolbarController {\n return this.#controller;\n }\n\n #controller: ToolbarController;\n #editor: Editor;\n #layout: ToolbarLayoutEntry[] | undefined;\n #iconCache: IconCache;\n #abortCtl = new AbortController();\n #destroyed = false;\n\n /** Tracks the groups array reference to detect \"structure changed\" vs \"state changed\". */\n #lastGroupsRef: readonly unknown[] | null = null;\n\n /** Maps top-level button/dropdown name -> rendered trigger element. */\n #buttonEls = new Map<string, HTMLButtonElement>();\n\n /** Rendered dropdown panel elements (created lazily when opened). */\n #dropdownPanelEl: HTMLElement | null = null;\n #cleanupFloating: (() => void) | null = null;\n\n #renderPending = false;\n #renderRaf = 0;\n #editorEl: HTMLElement | null = null;\n\n constructor(host: HTMLElement, options: DomternalToolbarOptions) {\n super();\n assertBrowser('DomternalToolbar');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalToolbar] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#toolbar\")).',\n );\n }\n // Runtime guard for JS users who bypass TS type-checking.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalToolbar] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#layout = options.layout;\n this.#iconCache = createIconCache(options.icons);\n\n // Host setup\n this.host.classList.add('dm-toolbar');\n this.host.setAttribute('role', 'toolbar');\n this.host.setAttribute('aria-label', 'Editor formatting');\n this.host.setAttribute('data-dm-editor-ui', '');\n\n // Controller\n this.#controller = new ToolbarController(\n this.#editor as unknown as ToolbarControllerEditor,\n () => { this.#scheduleRender(); },\n this.#layout,\n );\n this.#controller.subscribe();\n\n // Wire global listeners (AbortController scoped)\n this.#attachListeners();\n\n // Initial paint\n this.#render();\n }\n\n // === Getters ===\n\n get openDropdown(): string | null {\n return this.#controller.openDropdown;\n }\n\n // === Setters ===\n\n setLayout(layout: ToolbarLayoutEntry[] | undefined): void {\n if (this.#destroyed) return;\n this.#layout = layout;\n // ToolbarController doesn't expose a public setLayout, so recreate.\n // Destroy + new is the documented pattern.\n this.#controller.destroy();\n this.#controller = new ToolbarController(\n this.#editor as unknown as ToolbarControllerEditor,\n () => { this.#scheduleRender(); },\n this.#layout,\n );\n this.#controller.subscribe();\n this.#lastGroupsRef = null; // force full rebuild\n this.#scheduleRender();\n }\n\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#iconCache.setIcons(icons);\n this.#lastGroupsRef = null; // force full rebuild (icons baked into innerHTML)\n this.#scheduleRender();\n }\n\n closeDropdown(): void {\n if (this.#destroyed) return;\n this.#controller.closeDropdown();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#abortCtl.abort();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#controller.destroy();\n\n this.#dropdownPanelEl?.remove();\n this.#dropdownPanelEl = null;\n this.host.replaceChildren();\n this.#buttonEls.clear();\n }\n\n // === Lifecycle helpers ===\n\n #attachListeners(): void {\n const { signal } = this.#abortCtl;\n\n // Outside-click closes any open dropdown\n document.addEventListener(\n 'mousedown',\n (e) => {\n if (!this.#controller.openDropdown) return;\n const target = e.target as Node;\n if (this.host.contains(target)) return;\n if (this.#dropdownPanelEl?.contains(target)) return;\n this.closeDropdown();\n },\n { signal },\n );\n\n // Keyboard navigation on toolbar host\n this.host.addEventListener(\n 'keydown',\n (e) => { this.#onKeyDown(e); },\n { signal },\n );\n\n // Cooperative dismissal across editor overlays\n this.#editorEl = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n this.#editorEl?.addEventListener(\n 'dm:dismiss-overlays',\n () => {\n if (this.#controller.openDropdown) {\n this.closeDropdown();\n }\n },\n { signal },\n );\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed) return;\n this.#render();\n });\n }\n\n #render(): void {\n const groups = this.#controller.groups;\n const groupsChanged = groups !== this.#lastGroupsRef;\n if (groupsChanged) {\n this.#renderGroupsStructure(groups);\n this.#lastGroupsRef = groups;\n }\n this.#updateButtonStates();\n this.#renderDropdown();\n }\n\n #renderGroupsStructure(groups: readonly { name: string; items: ToolbarItem[] }[]): void {\n // Wipe and rebuild structure. Button refs are tracked so subsequent\n // state updates target individual DOM nodes (no full rebuild per tx).\n // Also drop any open dropdown panel reference - replaceChildren() removed\n // it from DOM; renderDropdown() will recreate it next pass if still open.\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#dropdownPanelEl = null;\n this.host.replaceChildren();\n this.#buttonEls.clear();\n\n groups.forEach((group, gi) => {\n if (gi > 0) {\n const sep = document.createElement('div');\n sep.className = 'dm-toolbar-separator';\n sep.setAttribute('role', 'separator');\n this.host.appendChild(sep);\n }\n\n const groupEl = document.createElement('div');\n groupEl.className = 'dm-toolbar-group';\n groupEl.setAttribute('role', 'group');\n groupEl.setAttribute('aria-label', group.name || 'Tools');\n\n for (const item of group.items) {\n if (item.type === 'button') {\n const btnEl = this.#createButton(item);\n groupEl.appendChild(btnEl);\n this.#buttonEls.set(item.name, btnEl);\n } else if (item.type === 'dropdown') {\n const wrapper = this.#createDropdownTrigger(item);\n groupEl.appendChild(wrapper);\n }\n }\n\n this.host.appendChild(groupEl);\n });\n }\n\n #createButton(item: ToolbarButton): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n btn.innerHTML = this.#iconCache.getIcon(item.icon);\n btn.setAttribute('aria-label', item.label);\n btn.title = getTooltip(item);\n if (item.style) btn.setAttribute('style', item.style);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onButtonClick(item, e); });\n btn.addEventListener('focus', () => { this.#onButtonFocus(item.name); });\n\n return btn;\n }\n\n #createDropdownTrigger(dd: ToolbarDropdown): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-toolbar-dropdown-wrapper';\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button dm-toolbar-dropdown-trigger';\n btn.setAttribute('aria-haspopup', 'true');\n btn.setAttribute('aria-label', dd.label);\n btn.title = dd.label;\n btn.setAttribute('data-dropdown', dd.name);\n btn.innerHTML = this.#resolveDropdownTriggerHtml(dd);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#onDropdownToggle(dd); });\n btn.addEventListener('focus', () => { this.#onButtonFocus(dd.name); });\n\n wrapper.appendChild(btn);\n this.#buttonEls.set(dd.name, btn);\n return wrapper;\n }\n\n #resolveDropdownTriggerHtml(dd: ToolbarDropdown): string {\n const activeItem = dd.items.find((sub) => this.#controller.activeMap.get(sub.name));\n\n // Dynamic-label dropdown reading computed style at cursor (e.g. font-size)\n if (dd.dynamicLabel && !activeItem && dd.computedStyleProperty) {\n let computed: string | null;\n if (dd.computedStyleProperty === 'font-family') {\n computed = getInlineStyleAtCursor(this.#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(this.#editor, dd.computedStyleProperty);\n }\n if (computed) {\n return `<span class=\"dm-toolbar-trigger-label\">${computed}</span>${DROPDOWN_CARET}`;\n }\n }\n\n return this.#iconCache.getDropdownTriggerHtml(dd, activeItem);\n }\n\n #updateButtonStates(): void {\n const groups = this.#controller.groups;\n const focusedIndex = this.#controller.focusedIndex;\n\n for (const group of groups) {\n for (const item of group.items) {\n if (item.type === 'button') {\n this.#updateButton(item, focusedIndex);\n } else if (item.type === 'dropdown') {\n this.#updateDropdownTrigger(item, focusedIndex);\n }\n }\n }\n }\n\n #updateButton(item: ToolbarButton, focusedIndex: number): void {\n const btn = this.#buttonEls.get(item.name);\n if (!btn) return;\n const isActive = this.#controller.activeMap.get(item.name) ?? false;\n const isDisabled = this.#controller.disabledMap.get(item.name) ?? false;\n const flat = this.#controller.getFlatIndex(item.name);\n\n btn.classList.toggle('dm-toolbar-button--active', isActive);\n btn.disabled = isDisabled;\n btn.setAttribute('aria-pressed', String(isActive));\n btn.tabIndex = flat === focusedIndex ? 0 : -1;\n\n if (item.emitEvent) {\n const expanded = this.#controller.expandedMap.get(item.name) === true;\n if (expanded) {\n btn.setAttribute('aria-expanded', 'true');\n } else {\n btn.removeAttribute('aria-expanded');\n }\n }\n }\n\n #updateDropdownTrigger(dd: ToolbarDropdown, focusedIndex: number): void {\n const btn = this.#buttonEls.get(dd.name);\n if (!btn) return;\n\n const isDisabled = this.#controller.disabledMap.get(dd.name) ?? false;\n const isOpen = this.#controller.openDropdown === dd.name;\n const flat = this.#controller.getFlatIndex(dd.name);\n\n // dropdown trigger active when its currently-active sub-item exists\n const isDropdownActive = dd.layout !== 'grid'\n && !dd.dynamicLabel\n && dd.items.some((sub) => this.#controller.activeMap.get(sub.name) ?? false);\n\n btn.classList.toggle('dm-toolbar-button--active', isDropdownActive);\n btn.disabled = isDisabled;\n btn.setAttribute('aria-expanded', String(isOpen));\n btn.tabIndex = flat === focusedIndex ? 0 : -1;\n\n // Trigger HTML may change with cursor (dynamicLabel/dynamicIcon).\n // Recompute and only swap if different (avoids needless DOM writes).\n const newHtml = this.#resolveDropdownTriggerHtml(dd);\n if (btn.innerHTML !== newHtml) {\n btn.innerHTML = newHtml;\n }\n }\n\n #renderDropdown(): void {\n const openName = this.#controller.openDropdown;\n const currentPanel = this.#dropdownPanelEl;\n\n // Nothing to do\n if (openName === null && currentPanel === null) return;\n\n // Closing: remove panel\n if (openName === null) {\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n currentPanel?.remove();\n this.#dropdownPanelEl = null;\n return;\n }\n\n // Open: find the dropdown definition\n const dd = this.#findDropdown(openName);\n if (!dd) return;\n\n // If panel already shows this dropdown, do nothing\n if (currentPanel?.dataset['dropdownPanel'] === openName) return;\n\n // Replace any prior panel (shouldn't happen but be safe)\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n currentPanel?.remove();\n\n const panel = this.#createDropdownPanel(dd);\n const trigger = this.#buttonEls.get(dd.name);\n if (!trigger) return;\n\n // Append to wrapper so theme styles position relative\n trigger.parentElement?.appendChild(panel);\n this.#dropdownPanelEl = panel;\n\n requestAnimationFrame(() => {\n if (this.#destroyed || !panel.isConnected) return;\n const placement = dd.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.#cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n });\n\n this.dispatchEvent(new CustomEvent('dropdownopen', { detail: { name: openName } }));\n }\n\n #createDropdownPanel(dd: ToolbarDropdown): HTMLElement {\n const panel = document.createElement('div');\n panel.dataset['dropdownPanel'] = dd.name;\n panel.setAttribute('role', 'menu');\n\n if (dd.layout === 'grid') {\n panel.className = 'dm-toolbar-dropdown-panel dm-color-palette';\n panel.style.setProperty('--dm-palette-columns', String(dd.gridColumns ?? 10));\n\n for (const sub of dd.items) {\n if (sub.color) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-color-swatch';\n if (this.#controller.activeMap.get(sub.name)) {\n btn.classList.add('dm-color-swatch--active');\n }\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.title = sub.label;\n btn.style.backgroundColor = sub.color;\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n } else {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-color-palette-reset';\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.innerHTML = this.#iconCache.getItemContent(sub.icon, sub.label);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n }\n }\n return panel;\n }\n\n // Standard list dropdown\n panel.className = 'dm-toolbar-dropdown-panel';\n if (dd.displayMode) panel.setAttribute('data-display-mode', dd.displayMode);\n\n for (const sub of dd.items) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-dropdown-item';\n if (this.#controller.activeMap.get(sub.name)) {\n btn.classList.add('dm-toolbar-dropdown-item--active');\n }\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.title = sub.label;\n btn.innerHTML = this.#iconCache.getItemContent(sub.icon, sub.label, dd.displayMode);\n if (sub.style) btn.setAttribute('style', sub.style);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n }\n return panel;\n }\n\n #findDropdown(name: string): ToolbarDropdown | null {\n for (const group of this.#controller.groups) {\n for (const item of group.items) {\n if (item.type === 'dropdown' && item.name === name) {\n return item;\n }\n }\n }\n return null;\n }\n\n // === Event handlers ===\n\n #onButtonClick(item: ToolbarButton, event: MouseEvent): void {\n if (this.#controller.openDropdown) {\n this.closeDropdown();\n }\n\n if (item.emitEvent) {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest<HTMLElement>('.dm-toolbar-button') ?? target ?? undefined;\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n return;\n }\n\n this.#controller.executeCommand(item);\n\n // Refocus editor so caret stays visible (mousedown.preventDefault holds\n // focus on mouse path; keyboard activations need explicit refocus).\n requestAnimationFrame(() => { this.#editor.view.focus(); });\n }\n\n #onDropdownToggle(dd: ToolbarDropdown): void {\n const wasOpen = this.#controller.openDropdown === dd.name;\n if (wasOpen) {\n this.closeDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: dd.name } }));\n return;\n }\n\n // Close any prior dropdown before opening new one (controller does this\n // via toggleDropdown internally too, but emit close event explicitly)\n if (this.#controller.openDropdown) {\n const prev = this.#controller.openDropdown;\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n }\n\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#controller.toggleDropdown(dd.name);\n }\n\n #onDropdownItemClick(item: ToolbarButton, event: MouseEvent): void {\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 this.closeDropdown();\n\n if (item.emitEvent) {\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n } else {\n this.#controller.executeCommand(item);\n }\n\n requestAnimationFrame(() => { this.#editor.view.focus(); });\n }\n\n #onButtonFocus(name: string): void {\n const index = this.#controller.getFlatIndex(name);\n if (index >= 0) {\n this.#controller.setFocusedIndex(index);\n }\n }\n\n // === Keyboard navigation ===\n\n #onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.#controller.navigateNext();\n this.#focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.#controller.navigatePrev();\n this.#focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (this.#controller.openDropdown) {\n this.#focusDropdownItem(1);\n } else {\n const btn = document.activeElement;\n if (btn instanceof HTMLElement && btn.getAttribute('aria-haspopup') && this.host.contains(btn)) {\n btn.click();\n requestAnimationFrame(() => { this.#focusDropdownItem(0, true); });\n }\n }\n break;\n }\n case 'ArrowUp':\n event.preventDefault();\n if (this.#controller.openDropdown) {\n this.#focusDropdownItem(-1);\n }\n break;\n case 'Home':\n event.preventDefault();\n this.#controller.navigateFirst();\n this.#focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.#controller.navigateLast();\n this.#focusCurrentButton();\n break;\n case 'Escape':\n if (this.#controller.openDropdown) {\n event.preventDefault();\n this.closeDropdown();\n this.#focusCurrentButton();\n }\n break;\n }\n }\n\n #focusCurrentButton(): void {\n const buttons = this.host.querySelectorAll<HTMLElement>('.dm-toolbar-button');\n const btn = buttons.item(this.#controller.focusedIndex);\n btn.focus();\n }\n\n #focusDropdownItem(direction: number, first?: boolean): void {\n const panel = this.#dropdownPanelEl;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\n if (!items.length) return;\n if (first) {\n items[0]?.focus();\n return;\n }\n const current = document.activeElement;\n const idx = current instanceof HTMLElement ? items.indexOf(current) : -1;\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","import type { Editor, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\n// --- Duck-typed ProseMirror shapes (avoids instanceof across bundles) ---\n\nexport interface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\nexport interface 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\nexport interface BubbleMenuSeparator {\n type: 'separator';\n name: string;\n}\n\nexport type BubbleMenuItem = ToolbarButton | ToolbarDropdown | BubbleMenuSeparator;\n\nexport interface ItemMaps {\n itemMap: Map<string, ToolbarButton>;\n dropdownMap: Map<string, ToolbarDropdown>;\n /** Bubble defaults indexed by context name (e.g. 'text', 'codeBlock'). */\n bubbleDefaults: Map<string, BubbleMenuItem[]>;\n}\n\n/**\n * Walks `editor.toolbarItems` and indexes them by name. Dropdowns are kept\n * separately so the bubble menu can resolve them by name (e.g. text-align).\n */\nexport function buildItemMaps(editor: Editor): ItemMaps {\n const itemMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\n\n for (const item of editor.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 return {\n itemMap,\n dropdownMap,\n bubbleDefaults: buildBubbleDefaults(editor),\n };\n}\n\n/**\n * Build bubble-menu defaults keyed by `bubbleMenu` context name. Items are\n * sorted by priority (higher first) within each context, with separators\n * inserted between consecutive different `group` runs.\n */\nfunction buildBubbleDefaults(editor: Editor): Map<string, BubbleMenuItem[]> {\n const byCtx = new Map<string, ToolbarButton[]>();\n\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) {\n arr = [];\n byCtx.set(ctx, arr);\n }\n arr.push(btn);\n };\n\n for (const item of editor.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\n const result = new Map<string, BubbleMenuItem[]>();\n for (const [ctx, ctxItems] of byCtx) {\n ctxItems.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const list: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of ctxItems) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n list.push({ type: 'separator', name: `bsep-${String(sepIdx++)}` });\n }\n list.push(item);\n lastGroup = item.group;\n }\n result.set(ctx, list);\n }\n\n return result;\n}\n\n/**\n * Resolve a name array to BubbleMenuItems via the item/dropdown maps.\n * Dropdowns take priority over buttons sharing the same name. Pipe `|`\n * tokens become separator entries.\n */\nexport function resolveNames(\n names: string[],\n itemMap: Map<string, ToolbarButton>,\n dropdownMap: Map<string, ToolbarDropdown>,\n): 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 continue;\n }\n const dropdown = dropdownMap.get(name);\n if (dropdown) {\n result.push(dropdown);\n continue;\n }\n const item = itemMap.get(name);\n if (item) result.push(item);\n }\n return result;\n}\n\n/**\n * All `format`-group buttons sorted by priority (used by `context: true`\n * shorthand to show \"all format marks for this context\").\n */\nexport function getFormatItems(itemMap: Map<string, ToolbarButton>): 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/**\n * Determine the active bubble-menu context based on the selection. Returns\n * `null` when no context matches (menu should not show).\n *\n * Resolution order:\n * 1. CellSelection (`$anchorCell`) - no menu inside table cell selections\n * 2. NodeSelection (image, HR, etc.) - return the node's type name\n * 3. Empty selection - no context (caret-only)\n * 4. Inside a table cell - return 'table' (when from/to share a cell)\n * 5. `$from.parent.type.name` if listed in contexts\n * 6. 'text' if the parent allows marks\n */\nexport function detectContext(\n selection: SelectionShape,\n ctxs: Record<string, string[] | true | null>,\n): 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/**\n * Filter items by what the schema actually allows in the given context.\n * E.g. inside a `codeBlock` node, marks like Bold/Italic aren't permitted.\n *\n * Pass-through for 'text' and 'table' contexts (schema check would be\n * lossy there because marks are allowed but some items still apply).\n */\nexport function filterBySchema(\n editor: Editor,\n contextName: string,\n schemaItems: ToolbarButton[],\n): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return schemaItems;\n const schema = (editor.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/**\n * Detect whether `$pos` is inside a table cell (cell or header).\n */\nexport function 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","import type { Editor } from '@domternal/core';\nimport type { SelectionShape } from './itemResolver.js';\n\n/**\n * Live state for the bubble-menu trailing buttons.\n *\n * Mirrors Angular's `syncTrailingButtonsState` output. Computed per editor\n * transaction and coalesced into a single object so each transaction\n * triggers at most one 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\nexport const 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\ninterface SyncOptions {\n hasNotionColorPicker: boolean;\n hasBlockContextMenu: boolean;\n}\n\n/**\n * Compute trailing-button state for the current editor selection.\n *\n * - `isNodeSelection`: hides trailing buttons during NodeSelection (image, HR)\n * - `blockMenuButtonDisabled`: multi-block disable via `$from.before(1) !== $to.before(1)`\n * - `currentTextColorVar` / `currentBgColorVar` / `hasAnyColor`: read the\n * `textStyle` mark at cursor and project token names to CSS-var refs that\n * the theme resolves at paint time.\n */\nexport function computeTrailingState(\n editor: Editor,\n opts: SyncOptions,\n): BubbleMenuTrailingState {\n const sel = editor.state.selection as unknown as SelectionShape;\n const isNode = !!sel.node;\n\n // Multi-block disable for the \"...\" trigger\n let blockMenuDisabled = false;\n if (opts.hasBlockContextMenu) {\n const { $from, $to } = editor.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\n let textVar: string | null = null;\n let bgVar: string | null = null;\n let hasAny = false;\n if (opts.hasNotionColorPicker) {\n const mark = editor.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 return {\n isNodeSelection: isNode,\n showColorPickerButton: opts.hasNotionColorPicker,\n showBlockMenuButton: opts.hasBlockContextMenu,\n blockMenuButtonDisabled: blockMenuDisabled,\n currentTextColorVar: textVar,\n currentBgColorVar: bgVar,\n hasAnyColor: hasAny,\n };\n}\n","import {\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n positionFloatingOnce,\n} from '@domternal/core';\nimport { resolveIcon } from '../shared/iconRenderer.js';\nimport type {\n Editor,\n BubbleMenuOptions,\n IconSet,\n ToolbarButton,\n ToolbarDropdown,\n PluginKey,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { createPluginKey } from '../shared/pluginKey.js';\nimport type { CustomContentOption } from '../shared/types.js';\nimport {\n buildItemMaps,\n resolveNames,\n getFormatItems,\n detectContext,\n filterBySchema,\n isInsideTableCell,\n type BubbleMenuItem,\n type ItemMaps,\n type SelectionShape,\n} from './itemResolver.js';\nimport {\n computeTrailingState,\n INITIAL_TRAILING_STATE,\n type BubbleMenuTrailingState,\n} from './trailingState.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 DomternalBubbleMenuOptions extends CustomContentOption {\n /** Editor instance the bubble menu binds to. */\n editor: Editor;\n /** Custom visibility predicate. Replaces the default (auto-detect context). */\n shouldShow?: BubbleMenuOptions['shouldShow'];\n /** Placement relative to the selection. @default 'top' */\n placement?: 'top' | 'bottom';\n /** Pixel offset from the selection edge. @default 8 */\n offset?: number;\n /** Debounce delay for position updates (ms). @default 0 */\n updateDelay?: number;\n /** Explicit item list (overrides contexts). E.g. `['bold', 'italic', '|', 'link']`. */\n items?: string[];\n /**\n * Context-aware items. Map from context name (`'text'`, `'codeBlock'`, etc.)\n * to item name list, `true` (show all format items), or `null` (no menu for\n * this context). Defaults to `defaultBubbleContexts(editor)`.\n */\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 type { BubbleMenuItem, BubbleMenuTrailingState };\n\n/**\n * `DomternalBubbleMenu` - vanilla DOM bubble menu bound to an editor.\n *\n * Mounts `createBubbleMenuPlugin` from `@domternal/core` for visibility and\n * positioning, then renders ProseMirror selection-aware buttons + dropdowns\n * inside the host element. Trailing buttons (\"A\" for Notion color picker,\n * \"...\" for block context menu) are rendered automatically when the\n * corresponding extensions are loaded.\n *\n * Re-renders are batched via `requestAnimationFrame`. DOM is rebuilt on every\n * transaction because the item list changes with context (selection moves\n * between text and code-block, for example).\n *\n * **Stable identity convention.** Trigger buttons (including the \"A\" and \"...\"\n * trailing triggers and dropdown triggers) are DESTROYED and RECREATED on\n * every transaction. Consumers that store a reference to a trigger element\n * (e.g. as a popover anchor) should:\n * - Either listen for `selectionUpdate` / `transaction` and re-resolve the\n * anchor via `host.querySelector('.dm-ncp-trigger')` on demand\n * - Or match the trigger by class + container (`closest('.dm-bubble-menu')`)\n * rather than DOM identity for purposes like toggle-on-second-click.\n *\n * @example\n * ```ts\n * import { DomternalBubbleMenu } from '@domternal/vanilla';\n *\n * const bubble = new DomternalBubbleMenu(host, { editor });\n *\n * // Custom item list:\n * new DomternalBubbleMenu(host, {\n * editor,\n * items: ['bold', 'italic', '|', 'link'],\n * });\n *\n * // Listen for state changes:\n * bubble.addEventListener('dropdownopen', (e) => {\n * console.log('opened', (e as CustomEvent<{ name: string }>).detail.name);\n * });\n *\n * bubble.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `dropdownopen` - `{ name: string }`\n * - `dropdownclose` - `{ name: string }`\n */\nexport class DomternalBubbleMenu extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n /** Current trailing-button state snapshot. */\n get trailing(): Readonly<BubbleMenuTrailingState> {\n return this.#trailing;\n }\n\n /** Currently open dropdown name (e.g. text-align), or `null`. */\n get openDropdown(): string | null {\n return this.#openDropdown;\n }\n\n #editor: Editor;\n #pluginKey: PluginKey;\n #destroyed = false;\n /** Optional consumer-provided DOM appended after default items + trailing. */\n #customContent: HTMLElement | undefined;\n\n // Configuration cached from constructor\n #shouldShowOpt: BubbleMenuOptions['shouldShow'] | undefined;\n #placement: 'top' | 'bottom';\n #offset: number;\n #updateDelay: number;\n #explicitItems: string[] | undefined;\n #explicitContexts: Record<string, string[] | true | null> | undefined;\n #icons: IconSet | undefined;\n\n // Editor-derived caches (set once in #init)\n #maps: ItemMaps | null = null;\n #hasNotionColorPicker = false;\n #hasBlockContextMenu = false;\n #effectiveContexts: Record<string, string[] | true | null> | undefined;\n #defaultItemList: BubbleMenuItem[] = [];\n #transactionHandler: (() => void) | null = null;\n\n // Live state\n #resolvedItems: BubbleMenuItem[] = [];\n #activeMap = new Map<string, boolean>();\n #disabledMap = new Map<string, boolean>();\n #trailing: BubbleMenuTrailingState = { ...INITIAL_TRAILING_STATE };\n\n // Dropdown state (text-align dropdown inside bubble menu)\n #openDropdown: string | null = null;\n #dropdownPanelEl: HTMLDivElement | null = null;\n #cleanupDropdownFloating: (() => void) | null = null;\n #dropdownAbortCtl: AbortController | null = null;\n\n #renderPending = false;\n #renderRaf = 0;\n\n constructor(host: HTMLElement, options: DomternalBubbleMenuOptions) {\n super();\n assertBrowser('DomternalBubbleMenu');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalBubbleMenu] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#bubble\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalBubbleMenu] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#shouldShowOpt = options.shouldShow;\n this.#placement = options.placement ?? 'top';\n this.#offset = options.offset ?? 8;\n this.#updateDelay = options.updateDelay ?? 0;\n this.#explicitItems = options.items;\n this.#explicitContexts = options.contexts;\n this.#icons = options.icons;\n this.#customContent = options.customContent;\n this.#pluginKey = createPluginKey('vanillaBubbleMenu');\n\n // Host setup\n this.host.classList.add('dm-bubble-menu');\n this.host.setAttribute('role', 'toolbar');\n this.host.setAttribute('aria-label', 'Text formatting');\n\n this.#init();\n }\n\n // === Public API ===\n\n /**\n * Emit `notionColorOpen` with the given anchor element. Listened to by\n * `DomternalNotionColorPicker` (Phase 4) which positions its panel against\n * the anchor. Typically called by the wrapper's internal \"A\" trigger but\n * exposed publicly for power users with custom UIs.\n */\n openColorPicker(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n (this.#editor.emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n }\n\n /**\n * Open the block context menu against the cursor's containing block.\n * Dispatches `dm:block-context-menu-open` on `.dm-editor`. The\n * `BlockContextMenu` extension listens and positions itself against the\n * provided anchor.\n *\n * Walks one level up when the cursor's textblock is not a direct doc\n * child (e.g. cursor in `listItem > paragraph` targets the `listItem`),\n * so \"Delete\" / \"Turn into\" operate on the visual block.\n */\n openBlockContextMenu(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n const $from = this.#editor.state.selection.$from;\n if ($from.depth < 1) return;\n const depth =\n $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 = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(\n new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }),\n );\n }\n\n /**\n * Replace the explicit item list. When `undefined`, falls back to\n * context-aware resolution (per `contexts` or `defaultBubbleContexts`).\n * Re-renders on next transaction; call manually if needed:\n * `editor.dispatch(editor.state.tr)` to force an immediate re-resolve.\n */\n setItems(items: string[] | undefined): void {\n if (this.#destroyed) return;\n this.#explicitItems = items;\n // Recompute the static default list (used when contexts are disabled).\n if (this.#maps) {\n this.#defaultItemList = items\n ? resolveNames(items, this.#maps.itemMap, this.#maps.dropdownMap)\n : resolveNames(['bold', 'italic', 'underline'], this.#maps.itemMap, this.#maps.dropdownMap);\n }\n this.#updateResolvedItems();\n this.#updateStates();\n this.#scheduleRender();\n }\n\n /**\n * Replace context map. When `undefined`, defaults to\n * `defaultBubbleContexts(editor)`. Note: `shouldShow` is baked into the\n * plugin at construction; this only changes WHICH items render once the\n * menu is visible.\n */\n setContexts(contexts: Record<string, string[] | true | null> | undefined): void {\n if (this.#destroyed) return;\n this.#explicitContexts = contexts;\n this.#effectiveContexts =\n contexts ?? (this.#explicitItems ? undefined : defaultBubbleContexts(this.#editor));\n this.#updateResolvedItems();\n this.#updateStates();\n this.#scheduleRender();\n }\n\n /** Replace the icon set. `undefined` restores default Phosphor icons. */\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#icons = icons;\n this.#scheduleRender();\n }\n\n /** Close any open dropdown (text-align). No-op if nothing is open. */\n closeDropdown(): void {\n if (this.#openDropdown === null) return;\n const prev = this.#openDropdown;\n this.#openDropdown = null;\n this.#detachDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n this.#scheduleRender();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#detachDropdown();\n\n if (this.#transactionHandler) {\n this.#editor.off('transaction', this.#transactionHandler);\n this.#transactionHandler = null;\n }\n if (!this.#editor.isDestroyed) {\n this.#editor.unregisterPlugin(this.#pluginKey);\n }\n\n this.host.replaceChildren();\n }\n\n // === Init ===\n\n #init(): void {\n const ed = this.#editor;\n if (ed.isDestroyed) return;\n\n // Cache extension presence (immutable per editor lifetime)\n const exts = ed.extensionManager.extensions;\n this.#hasNotionColorPicker = exts.some((e) => e.name === 'notionColorPicker');\n this.#hasBlockContextMenu = exts.some((e) => e.name === 'blockContextMenu');\n\n // Build item maps + bubble defaults\n this.#maps = buildItemMaps(ed);\n\n // Resolve effective contexts\n this.#effectiveContexts =\n this.#explicitContexts ?? (this.#explicitItems ? undefined : defaultBubbleContexts(ed));\n\n // Resolve default item list (used when contexts disabled and no NodeSelection match)\n this.#defaultItemList = this.#explicitItems\n ? resolveNames(this.#explicitItems, this.#maps.itemMap, this.#maps.dropdownMap)\n : resolveNames(['bold', 'italic', 'underline'], this.#maps.itemMap, this.#maps.dropdownMap);\n\n // Register the visibility/positioning plugin\n const shouldShow = this.#shouldShowOpt ?? this.#buildDefaultShouldShow();\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.#pluginKey,\n editor: ed,\n element: this.host,\n shouldShow,\n placement: this.#placement,\n offset: this.#offset,\n updateDelay: this.#updateDelay,\n });\n ed.registerPlugin(plugin);\n\n // Initial item resolution + state sync\n this.#updateResolvedItems();\n this.#updateStates();\n this.#trailing = computeTrailingState(ed, {\n hasNotionColorPicker: this.#hasNotionColorPicker,\n hasBlockContextMenu: this.#hasBlockContextMenu,\n });\n\n // Transaction handler - resolves items + recomputes state per change.\n // rAF-batched render below dedups multiple consecutive transactions.\n this.#transactionHandler = (): void => {\n if (this.#destroyed) return;\n this.#updateResolvedItems();\n this.#updateStates();\n this.#trailing = computeTrailingState(ed, {\n hasNotionColorPicker: this.#hasNotionColorPicker,\n hasBlockContextMenu: this.#hasBlockContextMenu,\n });\n this.#scheduleRender();\n };\n ed.on('transaction', this.#transactionHandler);\n\n // Initial paint\n this.#render();\n }\n\n #buildDefaultShouldShow(): BubbleMenuOptions['shouldShow'] {\n const contexts = this.#effectiveContexts;\n const defaults = this.#maps?.bubbleDefaults;\n\n if (contexts) {\n return ({ state }) => {\n const ctx = detectContext(\n state.selection as unknown as SelectionShape,\n contexts,\n );\n if (!ctx) return false;\n if (ctx in contexts) {\n const val = contexts[ctx];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return defaults?.has(ctx) ?? false;\n };\n }\n\n return ({ state }) => {\n const sel = state.selection as unknown as SelectionShape;\n if (sel.empty) return false;\n if (sel.node) return defaults?.has(sel.node.type.name) ?? false;\n if (isInsideTableCell(sel.$from)) return false;\n return (\n sel.$from.parent.type.spec.marks !== '' ||\n sel.$to.parent.type.spec.marks !== ''\n );\n };\n }\n\n // === State updates (called per transaction) ===\n\n #updateResolvedItems(): void {\n if (!this.#maps) return;\n const ed = this.#editor;\n const contexts = this.#effectiveContexts;\n\n if (contexts) {\n const ctx = detectContext(\n ed.state.selection as unknown as SelectionShape,\n contexts,\n );\n if (!ctx) {\n this.#resolvedItems = [];\n return;\n }\n\n if (ctx in contexts) {\n const val = contexts[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.#resolvedItems = [];\n return;\n }\n if (val === true) {\n this.#resolvedItems = filterBySchema(ed, ctx, getFormatItems(this.#maps.itemMap));\n return;\n }\n if (Array.isArray(val)) {\n const resolved = resolveNames(val, this.#maps.itemMap, this.#maps.dropdownMap);\n const buttons = resolved.filter(\n (i): i is ToolbarButton => i.type !== 'separator',\n );\n const allowed = new Set(filterBySchema(ed, ctx, buttons).map((b) => b.name));\n this.#resolvedItems = resolved.filter(\n (i) => i.type === 'separator' || allowed.has(i.name),\n );\n return;\n }\n }\n this.#resolvedItems = this.#maps.bubbleDefaults.get(ctx) ?? [];\n return;\n }\n\n // No contexts mode: use NodeSelection defaults OR the static default list.\n const sel = ed.state.selection as unknown as SelectionShape;\n if (sel.node && this.#maps.bubbleDefaults.has(sel.node.type.name)) {\n this.#resolvedItems = this.#maps.bubbleDefaults.get(sel.node.type.name) ?? [];\n } else {\n this.#resolvedItems = this.#defaultItemList;\n }\n }\n\n #updateStates(): void {\n const ed = this.#editor;\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = ed.can() as unknown as Record<string, (...args: unknown[]) => boolean>;\n } catch {\n canProxy = null;\n }\n\n const trackButton = (btn: ToolbarButton): void => {\n this.#activeMap.set(btn.name, ToolbarController.resolveActive(ed as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n this.#disabledMap.set(\n btn.name,\n canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false,\n );\n } catch {\n this.#disabledMap.set(btn.name, false);\n }\n };\n\n for (const item of this.#resolvedItems) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed) return;\n this.#render();\n });\n }\n\n #render(): void {\n // Bubble menu items change with selection context, so we rebuild DOM\n // every render. The cost is small (typically <10 buttons) and keeps\n // the logic straightforward vs incremental diff.\n this.host.replaceChildren();\n\n // The dropdown panel was a child of host - replaceChildren() removed it.\n // Detach our floating + AbortController state but KEEP `#openDropdown`\n // name so `#createDropdownTrigger` re-creates the panel when it encounters\n // the matching item below. Without this preservation, clicking a dropdown\n // trigger (which sets openDropdown then calls #render) would immediately\n // see the panel orphaned and close.\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = null;\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = null;\n this.#dropdownPanelEl = null;\n\n // If the open dropdown is no longer in resolvedItems (e.g. selection\n // moved to a context that doesn't show it), clear the flag.\n if (this.#openDropdown !== null) {\n const stillExists = this.#resolvedItems.some(\n (item) => item.type === 'dropdown' && item.name === this.#openDropdown,\n );\n if (!stillExists) this.#openDropdown = null;\n }\n\n for (const item of this.#resolvedItems) {\n if (item.type === 'separator') {\n this.host.appendChild(this.#createSeparator(item.name));\n } else if (item.type === 'dropdown') {\n this.host.appendChild(this.#createDropdownTrigger(item));\n } else {\n this.host.appendChild(this.#createButton(item));\n }\n }\n\n // Trailing buttons (gated on extension presence + not NodeSelection)\n const t = this.#trailing;\n if (t.showColorPickerButton && !t.isNodeSelection) {\n this.host.appendChild(this.#createSeparator('trailing-sep-color'));\n this.host.appendChild(this.#createColorTrigger());\n }\n if (t.showBlockMenuButton && !t.isNodeSelection) {\n this.host.appendChild(this.#createSeparator('trailing-sep-block'));\n this.host.appendChild(this.#createBlockMenuTrigger());\n }\n\n // Consumer-provided customContent: appended LAST so it sits after the\n // default items + trailing. The wrapper does not own its lifecycle - its\n // event listeners survive each render because the same DOM reference is\n // re-appended (DOM listeners attach to nodes, not parents).\n if (this.#customContent) {\n this.host.appendChild(this.#customContent);\n }\n }\n\n #createSeparator(name: string): HTMLSpanElement {\n const sep = document.createElement('span');\n sep.className = 'dm-toolbar-separator';\n sep.setAttribute('role', 'separator');\n sep.dataset['name'] = name;\n return sep;\n }\n\n #createButton(item: ToolbarButton): HTMLButtonElement {\n const isActive = this.#activeMap.get(item.name) ?? false;\n const isDisabled = this.#disabledMap.get(item.name) ?? false;\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n if (isActive) btn.classList.add('dm-toolbar-button--active');\n btn.disabled = isDisabled;\n btn.setAttribute('aria-label', item.label);\n btn.setAttribute('aria-pressed', String(isActive));\n btn.title = item.label;\n btn.innerHTML = resolveIcon(item.icon, this.#icons);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onButtonClick(item, e); });\n return btn;\n }\n\n #createDropdownTrigger(dd: ToolbarDropdown): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-toolbar-dropdown-wrapper';\n wrapper.dataset['dropdownWrapper'] = dd.name;\n\n const dropdownActive = dd.items.some((sub) => this.#activeMap.get(sub.name) ?? false);\n const activeChild = dd.dynamicIcon\n ? dd.items.find((sub) => this.#activeMap.get(sub.name) ?? false)\n : undefined;\n const triggerIcon = activeChild?.icon ?? dd.icon;\n const triggerHtml = resolveIcon(triggerIcon, this.#icons) + DROPDOWN_CARET;\n\n const trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.className = 'dm-toolbar-button dm-toolbar-dropdown-trigger';\n if (dropdownActive) trigger.classList.add('dm-toolbar-button--active');\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', String(this.#openDropdown === dd.name));\n trigger.setAttribute('aria-label', dd.label);\n trigger.title = dd.label;\n trigger.dataset['dropdown'] = dd.name;\n trigger.innerHTML = triggerHtml;\n trigger.addEventListener('mousedown', (e) => { e.preventDefault(); });\n trigger.addEventListener('click', () => { this.#onDropdownToggle(dd); });\n\n wrapper.appendChild(trigger);\n\n // If this dropdown was already open (e.g. re-render preserving open state)\n // append its panel too. In practice #render closes open dropdowns first,\n // so this branch is reached only from explicit re-opens.\n if (this.#openDropdown === dd.name) {\n const panel = this.#createDropdownPanel(dd);\n wrapper.appendChild(panel);\n this.#dropdownPanelEl = panel;\n this.#attachDropdownListeners(trigger, panel);\n }\n return wrapper;\n }\n\n #createDropdownPanel(dd: ToolbarDropdown): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-toolbar-dropdown-panel';\n panel.setAttribute('role', 'menu');\n panel.setAttribute('data-dm-editor-ui', '');\n panel.dataset['dropdownPanel'] = dd.name;\n\n for (const sub of dd.items) {\n const subActive = this.#activeMap.get(sub.name) ?? false;\n const subHtml = `${resolveIcon(sub.icon, this.#icons)} ${sub.label}`;\n const subBtn = document.createElement('button');\n subBtn.type = 'button';\n subBtn.className = 'dm-toolbar-dropdown-item';\n if (subActive) subBtn.classList.add('dm-toolbar-dropdown-item--active');\n subBtn.setAttribute('role', 'menuitem');\n subBtn.setAttribute('aria-label', sub.label);\n subBtn.innerHTML = subHtml;\n subBtn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n subBtn.addEventListener('click', () => { this.#onDropdownItemClick(sub); });\n panel.appendChild(subBtn);\n }\n return panel;\n }\n\n #createColorTrigger(): HTMLButtonElement {\n const t = this.#trailing;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button dm-ncp-trigger';\n if (t.hasAnyColor) btn.classList.add('dm-toolbar-button--active');\n btn.title = 'Text and background color';\n btn.setAttribute('aria-label', 'Text and background color');\n btn.setAttribute('aria-haspopup', 'dialog');\n\n const glyph = document.createElement('span');\n glyph.className = 'dm-ncp-trigger-glyph';\n glyph.textContent = 'A';\n if (t.currentTextColorVar) glyph.style.color = t.currentTextColorVar;\n btn.appendChild(glyph);\n\n const underline = document.createElement('span');\n underline.className = 'dm-ncp-trigger-underline';\n if (t.currentBgColorVar) underline.style.backgroundColor = t.currentBgColorVar;\n btn.appendChild(underline);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.openColorPicker(btn); });\n return btn;\n }\n\n #createBlockMenuTrigger(): HTMLButtonElement {\n const t = this.#trailing;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n btn.disabled = t.blockMenuButtonDisabled;\n btn.title = t.blockMenuButtonDisabled\n ? 'Block actions (select within a single block)'\n : 'More options';\n btn.setAttribute('aria-label', 'More options');\n btn.setAttribute('aria-haspopup', 'menu');\n btn.innerHTML = resolveIcon('dotsThree', this.#icons);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.openBlockContextMenu(btn); });\n return btn;\n }\n\n // === Event handlers ===\n\n #onButtonClick(item: ToolbarButton, event: MouseEvent): void {\n if (this.#openDropdown) this.closeDropdown();\n\n if (item.emitEvent) {\n const anchor =\n (event.currentTarget as HTMLElement | null) ??\n (event.target as HTMLElement | null);\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n return;\n }\n ToolbarController.executeItem(this.#editor as never, item);\n }\n\n #onDropdownToggle(dd: ToolbarDropdown): void {\n if (this.#openDropdown === dd.name) {\n this.closeDropdown();\n return;\n }\n\n // Switching from another open dropdown - emit close for the previous one.\n if (this.#openDropdown !== null) {\n const prev = this.#openDropdown;\n this.#detachDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n }\n\n this.#openDropdown = dd.name;\n this.dispatchEvent(new CustomEvent('dropdownopen', { detail: { name: dd.name } }));\n // Re-render to insert the panel under the new trigger.\n this.#render();\n }\n\n #onDropdownItemClick(sub: ToolbarButton): void {\n this.closeDropdown();\n ToolbarController.executeItem(this.#editor as never, sub);\n requestAnimationFrame(() => { this.#editor.view.focus(); });\n }\n\n // === Dropdown lifecycle ===\n\n #attachDropdownListeners(trigger: HTMLButtonElement, panel: HTMLDivElement): void {\n // Position the panel relative to its trigger.\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n // Scoped AbortController for outside-click / Escape / cooperative dismissal\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = new AbortController();\n const { signal } = this.#dropdownAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (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 this.closeDropdown();\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closeDropdown();\n }\n },\n { signal },\n );\n\n // Cooperative dismissal - other overlays announce, we listen and close.\n // We do NOT dispatch this ourselves - the bubble menu plugin listens\n // for it and would hide, taking our trigger with it.\n const editorEl = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.addEventListener(\n 'dm:dismiss-overlays',\n () => { this.closeDropdown(); },\n { signal },\n );\n }\n\n #detachDropdown(): void {\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = null;\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = null;\n this.#dropdownPanelEl?.remove();\n this.#dropdownPanelEl = null;\n }\n}\n","import { FloatingMenuController, createFloatingMenuPlugin } from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n PluginKey,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { createPluginKey } from '../shared/pluginKey.js';\nimport { resolveIcon } from '../shared/iconRenderer.js';\nimport type { CustomContentOption } from '../shared/types.js';\n\nexport interface DomternalFloatingMenuOptions extends CustomContentOption {\n /** Editor instance the floating menu binds to. */\n editor: Editor;\n /** Custom visibility predicate. Defaults to \"cursor at start of empty paragraph\". */\n shouldShow?: FloatingMenuOptions['shouldShow'];\n /** Pixel offset from the anchor. @default 0 */\n offset?: number;\n /** Items override (array replaces defaults; function filters/reorders). */\n items?: FloatingMenuItemsOverride;\n /** Keyboard shortcuts for entering the menu. */\n keymap?: FloatingMenuKeymap;\n /** Icon set override. Falls back to `defaultIcons` per key. */\n icons?: IconSet;\n /**\n * When `true`, the menu opens ONLY via explicit trigger (`showFloatingMenu`\n * call, typically from BlockHandle's `+` button). Pressing Enter to make\n * a new empty paragraph does NOT auto-show the menu. Notion-style behavior.\n * @default false\n */\n requireExplicitTrigger?: boolean;\n}\n\n/**\n * `DomternalFloatingMenu` - vanilla DOM block-insert menu bound to an editor.\n *\n * Renders the editor's `floatingMenuItems` (collected via extensions'\n * `addFloatingMenuItems()` hook) in groups, with roving-tabindex keyboard\n * navigation and `requireExplicitTrigger` support for Notion-style flow.\n *\n * Mounts `createFloatingMenuPlugin` from `@domternal/core`\n * for visibility + positioning. The plugin moves the host element inside\n * `.dm-editor` automatically so it scrolls with the editor.\n *\n * @example\n * ```ts\n * import { DomternalFloatingMenu } from '@domternal/vanilla';\n *\n * // Classic: auto-shows on every empty paragraph\n * new DomternalFloatingMenu(host, { editor });\n *\n * // Notion-style: only opens via \"+\" button or `showFloatingMenu(view)`\n * new DomternalFloatingMenu(host, { editor, requireExplicitTrigger: true });\n * ```\n */\nexport class DomternalFloatingMenu extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n /**\n * Underlying controller. Exposed for power-user introspection.\n *\n * `null` when `customContent` is provided (consumer owns rendering, and\n * therefore the item-state machine). Use the `editor.floatingMenuItems`\n * direct API in that case.\n */\n get controller(): FloatingMenuController | null {\n return this.#controller;\n }\n\n #editor: Editor;\n #pluginKey: PluginKey;\n #controller: FloatingMenuController | null = null;\n #icons: IconSet | undefined;\n #abortCtl = new AbortController();\n #destroyed = false;\n /** When `customContent` is provided, we skip controller + default render. */\n #hasCustomContent = false;\n\n #renderPending = false;\n #renderRaf = 0;\n\n constructor(host: HTMLElement, options: DomternalFloatingMenuOptions) {\n super();\n assertBrowser('DomternalFloatingMenu');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalFloatingMenu] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#floating\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalFloatingMenu] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#icons = options.icons;\n this.#pluginKey = createPluginKey('vanillaFloatingMenu');\n\n // Host setup\n this.host.classList.add('dm-floating-menu');\n this.host.setAttribute('role', 'menu');\n this.host.setAttribute('aria-label', 'Insert block');\n this.host.setAttribute('data-dm-editor-ui', '');\n\n // Register the visibility/positioning plugin\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.#pluginKey,\n editor: this.#editor,\n element: this.host,\n ...(options.shouldShow !== undefined && { shouldShow: options.shouldShow }),\n offset: options.offset ?? 0,\n ...(options.keymap !== undefined && { keymap: options.keymap }),\n ...(options.requireExplicitTrigger !== undefined && {\n requireExplicitTrigger: options.requireExplicitTrigger,\n }),\n });\n this.#editor.registerPlugin(plugin);\n\n // customContent path: consumer owns rendering entirely. Plugin handles\n // visibility/positioning; we skip controller + default rendering + key\n // nav (consumer wires their own). Matches Vue's `hasCustomSlot` branch.\n if (options.customContent) {\n this.#hasCustomContent = true;\n this.host.appendChild(options.customContent);\n return;\n }\n\n // Default rendering path: spin up controller + key nav + initial paint.\n this.#controller = new FloatingMenuController(\n this.#editor,\n () => { this.#scheduleRender(); },\n options.items,\n );\n this.#controller.subscribe();\n\n this.host.addEventListener(\n 'keydown',\n (e) => { this.#onKeyDown(e); },\n { signal: this.#abortCtl.signal },\n );\n\n this.#render();\n }\n\n /**\n * Swap the icon set. Re-renders to refresh button SVGs. No-op when\n * `customContent` is in use (consumer renders their own icons).\n */\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#icons = icons;\n if (!this.#hasCustomContent) this.#scheduleRender();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#abortCtl.abort();\n this.#controller?.destroy();\n\n if (!this.#editor.isDestroyed) {\n this.#editor.unregisterPlugin(this.#pluginKey);\n }\n\n this.host.replaceChildren();\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending || this.#hasCustomContent) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed || !this.#controller) return;\n this.#render();\n // After paint, focus the active item if the menu has keyboard focus\n const focusedIdx = this.#controller.focusedIndex;\n if (focusedIdx >= 0) {\n queueMicrotask(() => {\n const target = this.host.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(focusedIdx)}\"]`,\n );\n target?.focus();\n });\n }\n });\n }\n\n #render(): void {\n if (!this.#controller) return;\n this.host.replaceChildren();\n const groups = this.#controller.groups;\n const focusedIdx = this.#controller.focusedIndex;\n\n let flatIndex = 0;\n groups.forEach((group, gi) => {\n if (group.name) {\n const label = document.createElement('div');\n label.className = 'dm-floating-menu-group-label';\n label.id = `dm-fm-g${String(gi)}`;\n label.textContent = group.name;\n this.host.appendChild(label);\n }\n\n const groupEl = document.createElement('div');\n groupEl.className = 'dm-floating-menu-group';\n groupEl.setAttribute('role', 'group');\n if (group.name) groupEl.setAttribute('aria-labelledby', `dm-fm-g${String(gi)}`);\n\n for (const item of group.items) {\n const currentFlat = flatIndex;\n flatIndex += 1;\n const btn = this.#createItem(item, currentFlat, focusedIdx);\n groupEl.appendChild(btn);\n }\n\n this.host.appendChild(groupEl);\n });\n }\n\n #createItem(\n item: FloatingMenuItem,\n flatIndex: number,\n focusedIndex: number,\n ): HTMLButtonElement {\n const disabled = this.#controller?.isDisabled(item) ?? false;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-floating-menu-item';\n btn.setAttribute('role', 'menuitem');\n btn.dataset['floatingMenuItem'] = item.name;\n btn.dataset['floatingMenuIndex'] = String(flatIndex);\n btn.tabIndex = this.#tabIndexFor(flatIndex, focusedIndex);\n if (disabled) btn.setAttribute('aria-disabled', 'true');\n if (item.shortcut) btn.setAttribute('aria-keyshortcuts', item.shortcut);\n btn.disabled = disabled;\n\n if (item.icon) {\n const iconHtml = resolveIcon(item.icon, this.#icons);\n if (iconHtml) {\n const iconSpan = document.createElement('span');\n iconSpan.className = 'dm-floating-menu-item-icon';\n iconSpan.setAttribute('aria-hidden', 'true');\n iconSpan.innerHTML = iconHtml;\n btn.appendChild(iconSpan);\n }\n }\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'dm-floating-menu-item-label';\n labelSpan.textContent = item.label;\n btn.appendChild(labelSpan);\n\n if (item.shortcut) {\n const shortcutSpan = document.createElement('span');\n shortcutSpan.className = 'dm-floating-menu-item-shortcut';\n shortcutSpan.setAttribute('aria-hidden', 'true');\n shortcutSpan.textContent = item.shortcut;\n btn.appendChild(shortcutSpan);\n }\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#onItemClick(item); });\n return btn;\n }\n\n /**\n * Roving tabindex: focused item gets 0; when no item focused, first item\n * gets 0 (so tab traversal from outside lands naturally on the menu).\n */\n #tabIndexFor(flat: number, focused: number): 0 | -1 {\n if (flat === focused) return 0;\n if (focused < 0 && flat === 0) return 0;\n return -1;\n }\n\n // === Event handlers ===\n\n #onItemClick(item: FloatingMenuItem): void {\n if (this.#destroyed || !this.#controller) return;\n this.#controller.execute(item);\n requestAnimationFrame(() => { this.#editor.view.focus(); });\n }\n\n #onKeyDown(event: KeyboardEvent): void {\n if (!this.#controller) return;\n const focused = this.#controller.focusedItem();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#controller.next();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#controller.prev();\n break;\n case 'Home':\n event.preventDefault();\n this.#controller.first();\n break;\n case 'End':\n event.preventDefault();\n this.#controller.last();\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.#controller.leaveMenu();\n this.#editor.view.focus();\n break;\n case 'Enter':\n case ' ':\n if (focused) {\n event.preventDefault();\n this.#onItemClick(focused);\n }\n break;\n default:\n break;\n }\n }\n}\n","import { positionFloating } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\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 DomternalNotionColorPickerOptions {\n /** The editor instance the picker binds to. */\n editor: Editor;\n}\n\n/**\n * `DomternalNotionColorPicker` - vanilla DOM Notion-style color picker.\n *\n * Listens for the `notionColorOpen` editor event (emitted by the bubble menu's\n * \"A\" trigger) and renders an inline panel positioned against the trigger.\n * Two sections (Text color / Background color), each with a 5-column grid of\n * named-token swatches plus a default reset swatch.\n *\n * The panel is appended into the `.dm-editor` host so CSS variables\n * (`--dm-block-text-{token}`, `--dm-block-bg-{token}`) cascade naturally\n * from the editor's theme scope. **Requires the editor view to be inside a\n * `.dm-editor` host** (matches `@domternal/theme` convention). When that\n * ancestor is missing the picker silently no-ops on open.\n *\n * Unlike other `@domternal/vanilla` components, this class does NOT take a\n * `host` element argument - it auto-resolves the `.dm-editor` parent. The\n * resolved host is exposed via the `host` getter for power-user inspection.\n *\n * @example\n * ```ts\n * import { DomternalNotionColorPicker } from '@domternal/vanilla';\n *\n * const picker = new DomternalNotionColorPicker({ editor });\n *\n * // picker.open(anchor) opens programmatically; usually called by the\n * // bubble menu's \"A\" trigger via the `notionColorOpen` editor event.\n *\n * picker.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `openchange` - `{ isOpen: boolean }`\n * - `apply` - `{ kind: 'text' | 'bg', token: string | null }`\n */\nexport class DomternalNotionColorPicker extends EventTarget {\n /** The picker's panel element (created on first open, persistent for reuse). */\n get panel(): HTMLDivElement | null {\n return this.#panel;\n }\n\n /**\n * The `.dm-editor` host into which the panel mounts. Auto-resolved from\n * `editor.view.dom.closest('.dm-editor')`. Returns `null` when the editor\n * view is not inside a `.dm-editor` ancestor (in which case the picker\n * silently no-ops on `open()`).\n */\n get host(): HTMLElement | null {\n return this.#host;\n }\n\n get editor(): Editor {\n return this.#editor;\n }\n\n get isOpen(): boolean {\n return this.#isOpen;\n }\n\n get currentTextToken(): string | null {\n return this.#currentTextToken;\n }\n\n get currentBgToken(): string | null {\n return this.#currentBgToken;\n }\n\n get palette(): readonly string[] {\n return this.#palette;\n }\n\n #editor: Editor;\n #destroyed = false;\n\n #isOpen = false;\n #anchor: HTMLElement | null = null;\n /**\n * Bubble menu container captured when the picker was opened against an\n * anchor inside the bubble menu. Used by the virtual reference to re-resolve\n * `.dm-ncp-trigger` when the bubble menu rebuilds its DOM on transactions\n * and the original anchor element becomes disconnected. Null when the\n * picker was opened from a custom UI outside the bubble menu.\n */\n #anchorBubbleMenu: HTMLElement | null = null;\n /** Last computed anchor rect; used as a fallback when no live anchor can be resolved. */\n #lastAnchorRect: DOMRect | null = null;\n #host: HTMLElement | null = null;\n #panel: HTMLDivElement | null = null;\n #currentTextToken: string | null = null;\n #currentBgToken: string | null = null;\n #palette: readonly string[] = [];\n\n #onOpen: ((...args: unknown[]) => void) | null = null;\n #onSelectionUpdate: (() => void) | null = null;\n /** Global listeners (mousedown + keydown + selectionUpdate) bound while open. */\n #openAbortCtl: AbortController | null = null;\n #cleanupFloating: (() => void) | null = null;\n #rafIds: number[] = [];\n\n constructor(options: DomternalNotionColorPickerOptions) {\n super();\n assertBrowser('DomternalNotionColorPicker');\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalNotionColorPicker] options.editor is required.');\n }\n\n this.#editor = options.editor;\n this.#host = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n\n // Read palette from extension options (immutable per editor lifetime)\n const ext = this.#editor.extensionManager.extensions.find(\n (e) => e.name === 'notionColorPicker',\n );\n const extOpts = (ext?.options ?? null) as NotionColorPickerExtensionOptions | null;\n this.#palette = extOpts?.palette ? [...extOpts.palette] : [];\n\n // Subscribe to editor events (not AbortSignal-aware; explicit off in destroy).\n // Toggle logic lives in `open()` so the public API and event handler\n // behave identically for same-anchor re-opens.\n this.#onOpen = (...args: unknown[]): void => {\n const detail = args[0] as NotionColorOpenDetail | undefined;\n const incoming = detail?.anchorElement;\n if (!incoming) return;\n this.open(incoming);\n };\n this.#onSelectionUpdate = (): void => {\n if (!this.#isOpen) return;\n // Anchor vanished (bubble menu hidden by selection change). Close defensively.\n // Matches commit fbef072 which brought this defense to Angular too.\n if (!this.#anchor?.isConnected) {\n this.close();\n return;\n }\n if (this.#editor.state.selection.empty) {\n this.close();\n } else {\n // Selection moved but stays non-empty - refresh active state.\n this.#syncFromSelection();\n this.#updateActiveClasses();\n }\n };\n this.#editor.on('notionColorOpen', this.#onOpen);\n this.#editor.on('selectionUpdate', this.#onSelectionUpdate);\n }\n\n // === Public API ===\n\n /**\n * Open the picker against the given anchor element. Typically called\n * implicitly via the `notionColorOpen` editor event, but exposed publicly\n * for power users who emit the open from custom UI.\n *\n * Toggle semantics: calling `open(anchor)` with the SAME anchor while the\n * picker is already open closes the picker (with refocus). Calling with a\n * different anchor re-anchors against the new element.\n */\n open(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n // Toggle: same-anchor click while open closes (mirrors bubble menu \"A\"\n // button click-to-close behaviour). We accept BOTH exact DOM identity\n // OR class-based identity (`.dm-ncp-trigger`) because the bubble menu\n // rebuilds its trigger button on every transaction - the new instance\n // is a different DOM node but logically the same trigger.\n if (this.#isOpen && this.#isSameTrigger(anchor)) {\n this.close({ refocus: true });\n return;\n }\n // Lazy host resolution - in case editor view wasn't in DOM at construction.\n this.#host ??= this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n this.#anchor = anchor;\n // Capture bubble menu container if anchor lives inside one. Stored\n // separately because the anchor element itself may get disconnected when\n // the bubble menu rebuilds; the container element is stable.\n this.#anchorBubbleMenu = anchor.closest<HTMLElement>('.dm-bubble-menu');\n this.#lastAnchorRect = anchor.getBoundingClientRect();\n this.#syncFromSelection();\n this.#isOpen = true;\n this.#setStorageOpen(true);\n this.#renderOrUpdatePanel();\n this.#positionAndFocus();\n this.#attachGlobalListeners();\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: true } }));\n }\n\n /**\n * Close the picker. When `refocus` is `true`, returns focus to the editor\n * view (NOT the anchor button - the anchor is on the bubble menu which\n * vanishes on focus return).\n */\n close(opts: { refocus?: boolean } = {}): void {\n if (!this.#isOpen) return;\n this.#isOpen = false;\n this.#setStorageOpen(false);\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#cancelPendingRafs();\n if (this.#panel) {\n this.#panel.remove();\n // Keep `#panel` for reuse on next open; just detach from DOM.\n }\n this.#anchor = null;\n this.#anchorBubbleMenu = null;\n this.#lastAnchorRect = null;\n if (opts.refocus && !this.#editor.isDestroyed) {\n this.#editor.view.focus();\n }\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: false } }));\n }\n\n /** Apply a text color token to the current selection. Picker stays open. */\n applyText(token: string | null): void {\n if (this.#destroyed) return;\n (this.#editor.commands as unknown as {\n setTextColorToken: (t: string | null) => boolean;\n }).setTextColorToken(token);\n this.#syncFromSelection();\n this.#updateActiveClasses();\n this.dispatchEvent(\n new CustomEvent('apply', { detail: { kind: 'text', token } }),\n );\n }\n\n /** Apply a background color token to the current selection. Picker stays open. */\n applyBg(token: string | null): void {\n if (this.#destroyed) return;\n (this.#editor.commands as unknown as {\n setBackgroundColorToken: (t: string | null) => boolean;\n }).setBackgroundColorToken(token);\n this.#syncFromSelection();\n this.#updateActiveClasses();\n this.dispatchEvent(\n new CustomEvent('apply', { detail: { kind: 'bg', token } }),\n );\n }\n\n /** Display label for a palette token (title-case fallback). */\n tokenLabel(token: string): string {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#cancelPendingRafs();\n\n if (this.#onOpen) {\n this.#editor.off('notionColorOpen', this.#onOpen);\n this.#onOpen = null;\n }\n if (this.#onSelectionUpdate) {\n this.#editor.off('selectionUpdate', this.#onSelectionUpdate);\n this.#onSelectionUpdate = null;\n }\n if (this.#isOpen) this.#setStorageOpen(false);\n this.#panel?.remove();\n this.#panel = null;\n this.#isOpen = false;\n this.#anchor = null;\n this.#anchorBubbleMenu = null;\n this.#lastAnchorRect = null;\n }\n\n // === Internal ===\n\n /**\n * Test whether the incoming anchor is functionally the same trigger as\n * the currently stored anchor.\n *\n * - Exact DOM identity is preferred (cheap + unambiguous).\n * - Fallback: both anchors are `.dm-ncp-trigger` buttons inside the SAME\n * `.dm-bubble-menu` host. The bubble menu rebuilds its trigger button\n * on every transaction (new DOM node, same logical trigger), so the\n * ancestor check lets toggle-on-second-click work across rebuilds\n * without conflating with custom triggers in other host elements.\n */\n #isSameTrigger(incoming: HTMLElement): boolean {\n if (this.#anchor === incoming) return true;\n if (!incoming.classList.contains('dm-ncp-trigger')) return false;\n if (!(this.#anchor?.classList.contains('dm-ncp-trigger') ?? false)) return false;\n const currentBubble = this.#anchor?.closest('.dm-bubble-menu') ?? null;\n const incomingBubble = incoming.closest('.dm-bubble-menu');\n return currentBubble !== null && currentBubble === incomingBubble;\n }\n\n /**\n * Inspect the current selection and update the active text/bg tokens.\n * Empty selection: read stored marks. Non-empty: walk text nodes (because\n * `$from.nodeAfter` can land on a block at boundary positions).\n */\n #syncFromSelection(): void {\n const { selection } = this.#editor.state;\n let mark: { attrs: Record<string, unknown> } | null = null;\n\n if (selection.empty) {\n mark =\n selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n this.#editor.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 {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\n this.#currentTextToken = attrs.colorToken ?? null;\n this.#currentBgToken = attrs.backgroundColorToken ?? null;\n }\n\n #setStorageOpen(open: boolean): void {\n const slot = this.#editor.storage['notionColorPicker'];\n if (slot && typeof slot === 'object') {\n (slot as NotionColorPickerStorage).isOpen = open;\n }\n }\n\n #renderOrUpdatePanel(): void {\n if (!this.#host) return;\n if (!this.#panel) {\n this.#panel = this.#createPanel();\n } else {\n // Refresh content (active classes) in case panel was reused.\n this.#panel.replaceChildren(...this.#renderSections());\n }\n // Append (or re-append) panel to host\n this.#host.appendChild(this.#panel);\n }\n\n #createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-notion-color-picker';\n panel.setAttribute('data-show', '');\n panel.setAttribute('data-dm-editor-ui', '');\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Text and background color');\n panel.setAttribute('aria-modal', 'false');\n panel.addEventListener('keydown', (e) => { this.#onPanelKeydown(e); });\n panel.append(...this.#renderSections());\n return panel;\n }\n\n #renderSections(): Node[] {\n return [\n this.#createSection({\n label: 'Text color',\n variant: 'text',\n activeToken: this.#currentTextToken,\n onApply: (t) => { this.applyText(t); },\n }),\n this.#createSection({\n label: 'Background color',\n variant: 'bg',\n activeToken: this.#currentBgToken,\n onApply: (t) => { this.applyBg(t); },\n }),\n ];\n }\n\n #createSection(opts: {\n label: string;\n variant: 'text' | 'bg';\n activeToken: string | null;\n onApply: (token: string | null) => void;\n }): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'dm-ncp-section';\n\n const heading = document.createElement('div');\n heading.className = 'dm-ncp-label';\n heading.textContent = opts.label;\n section.appendChild(heading);\n\n const grid = document.createElement('div');\n grid.className = 'dm-ncp-grid';\n\n // Default swatch (null token)\n grid.appendChild(\n this.#createSwatch({\n token: null,\n variant: opts.variant,\n label: opts.variant === 'text' ? 'Default text color' : 'Default background',\n activeToken: opts.activeToken,\n onApply: opts.onApply,\n }),\n );\n\n // Named token swatches\n for (const t of this.#palette) {\n const label =\n opts.variant === 'text'\n ? `${this.tokenLabel(t)} text`\n : `${this.tokenLabel(t)} background`;\n grid.appendChild(\n this.#createSwatch({\n token: t,\n variant: opts.variant,\n label,\n activeToken: opts.activeToken,\n onApply: opts.onApply,\n }),\n );\n }\n\n section.appendChild(grid);\n return section;\n }\n\n #createSwatch(opts: {\n token: string | null;\n variant: 'text' | 'bg';\n label: string;\n activeToken: string | null;\n onApply: (token: string | null) => void;\n }): HTMLButtonElement {\n const swatch = document.createElement('button');\n swatch.type = 'button';\n swatch.className = `dm-ncp-swatch dm-ncp-swatch--${opts.variant}`;\n if (opts.activeToken === opts.token) swatch.classList.add('dm-ncp-active');\n swatch.setAttribute('aria-pressed', String(opts.activeToken === opts.token));\n swatch.dataset['color'] = opts.token ?? 'null';\n swatch.title =\n opts.token === null\n ? (opts.variant === 'text' ? 'Default text color' : 'Default background')\n : this.tokenLabel(opts.token);\n swatch.setAttribute('aria-label', opts.label);\n swatch.addEventListener('mousedown', (e) => { e.preventDefault(); });\n swatch.addEventListener('click', () => { opts.onApply(opts.token); });\n return swatch;\n }\n\n /** Update only active-class state without rebuilding DOM. */\n #updateActiveClasses(): void {\n if (!this.#panel) return;\n const textSwatches = Array.from(\n this.#panel.querySelectorAll<HTMLButtonElement>('.dm-ncp-swatch--text'),\n );\n const bgSwatches = Array.from(\n this.#panel.querySelectorAll<HTMLButtonElement>('.dm-ncp-swatch--bg'),\n );\n for (const sw of textSwatches) {\n const token = sw.dataset['color'] === 'null' ? null : (sw.dataset['color'] ?? null);\n const isActive = token === this.#currentTextToken;\n sw.classList.toggle('dm-ncp-active', isActive);\n sw.setAttribute('aria-pressed', String(isActive));\n }\n for (const sw of bgSwatches) {\n const token = sw.dataset['color'] === 'null' ? null : (sw.dataset['color'] ?? null);\n const isActive = token === this.#currentBgToken;\n sw.classList.toggle('dm-ncp-active', isActive);\n sw.setAttribute('aria-pressed', String(isActive));\n }\n }\n\n /**\n * Position + two-rAF focus chain. Floating-UI positions immediately; second\n * rAF waits for paint so focus doesn't race the bubble-menu blur. Focuses\n * the active swatch or falls back to the first default text swatch.\n */\n #positionAndFocus(): void {\n if (!this.#anchor || !this.#panel) return;\n this.#cleanupFloating?.();\n // Virtual reference: re-resolves the live `.dm-ncp-trigger` inside the\n // captured bubble menu container on every position update. The vanilla\n // bubble menu rebuilds its DOM with `replaceChildren` on every editor\n // transaction, which disconnects the original anchor element; without\n // re-resolution `getBoundingClientRect` returns a zero rect and the panel\n // flies to the top-left corner. When opened from a custom UI (no bubble\n // menu container), we fall back to the stored anchor or its last known\n // rect.\n const virtualRef = {\n getBoundingClientRect: (): DOMRect => {\n if (this.#anchor?.isConnected) {\n const rect = this.#anchor.getBoundingClientRect();\n this.#lastAnchorRect = rect;\n return rect;\n }\n if (this.#anchorBubbleMenu?.isConnected) {\n const fresh = this.#anchorBubbleMenu.querySelector<HTMLElement>(\n '.dm-ncp-trigger',\n );\n if (fresh) {\n this.#anchor = fresh;\n const rect = fresh.getBoundingClientRect();\n this.#lastAnchorRect = rect;\n return rect;\n }\n }\n return this.#lastAnchorRect ?? new DOMRect(0, 0, 0, 0);\n },\n };\n this.#cleanupFloating = positionFloating(virtualRef, this.#panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n const id1 = requestAnimationFrame(() => {\n const id2 = requestAnimationFrame(() => {\n if (!this.#panel?.isConnected) return;\n const active = this.#panel.querySelector<HTMLElement>('.dm-ncp-swatch.dm-ncp-active');\n const fallback = this.#panel.querySelector<HTMLElement>(\n '.dm-ncp-swatch--text[data-color=\"null\"]',\n );\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n this.#rafIds.push(id2);\n });\n this.#rafIds.push(id1);\n }\n\n #cancelPendingRafs(): void {\n for (const id of this.#rafIds) cancelAnimationFrame(id);\n this.#rafIds = [];\n }\n\n #attachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = new AbortController();\n const { signal } = this.#openAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (this.#panel?.contains(target)) return;\n if (this.#anchor?.contains(target)) return;\n this.close();\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isOpen) {\n e.preventDefault();\n this.close({ refocus: true });\n }\n },\n { signal },\n );\n }\n\n #detachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = null;\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 #onPanelKeydown(event: KeyboardEvent): void {\n const cols = 5;\n if (!this.#panel) return;\n const swatches = Array.from(\n this.#panel.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) return;\n const idx = swatches.indexOf(active);\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","import { positionFloatingOnce } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\n/** Display glyph for each top-level emoji category (matches Angular wrapper). */\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\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 DomternalEmojiPickerOptions {\n /** The editor instance the picker binds to. */\n editor: Editor;\n /** Full emoji set with `{ emoji, name, group }` entries. Required. */\n emojis: EmojiPickerItem[];\n}\n\n/**\n * `DomternalEmojiPicker` - vanilla DOM emoji picker.\n *\n * Listens for the `insertEmoji` editor event (emitted by the toolbar's emoji\n * trigger or via custom code) and renders a panel with search input, category\n * tabs, and an 8-column grid of swatches. Frequently-used emojis come from\n * the `Emoji` extension's storage if available.\n *\n * @example\n * ```ts\n * import { DomternalEmojiPicker } from '@domternal/vanilla';\n * import { emojis } from '@domternal/extension-emoji';\n *\n * const picker = new DomternalEmojiPicker(host, { editor, emojis });\n *\n * // picker.open(anchor) opens programmatically; usually triggered\n * // implicitly by the `insertEmoji` editor event.\n *\n * picker.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `openchange` - `{ isOpen: boolean }`\n * - `select` - `{ name: string; emoji: string }`\n */\nexport class DomternalEmojiPicker extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n get isOpen(): boolean {\n return this.#isOpen;\n }\n\n get searchQuery(): string {\n return this.#searchQuery;\n }\n\n get activeCategory(): string {\n return this.#activeCategory;\n }\n\n #editor: Editor;\n #emojis: EmojiPickerItem[];\n #categories: Map<string, EmojiPickerItem[]>;\n #categoryNames: string[];\n\n #destroyed = false;\n #isOpen = false;\n #searchQuery = '';\n #activeCategory = '';\n #anchor: HTMLElement | null = null;\n\n #panel: HTMLDivElement | null = null;\n #cleanupFloating: (() => void) | null = null;\n #openAbortCtl: AbortController | null = null;\n #eventHandler: ((...args: unknown[]) => void) | null = null;\n\n constructor(host: HTMLElement, options: DomternalEmojiPickerOptions) {\n super();\n assertBrowser('DomternalEmojiPicker');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalEmojiPicker] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#emoji-host\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalEmojiPicker] options.editor is required.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.emojis) {\n throw new TypeError('[DomternalEmojiPicker] options.emojis is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#emojis = options.emojis;\n\n // Group emojis by their `group` property (immutable per construction).\n this.#categories = new Map<string, EmojiPickerItem[]>();\n for (const item of this.#emojis) {\n let list = this.#categories.get(item.group);\n if (!list) {\n list = [];\n this.#categories.set(item.group, list);\n }\n list.push(item);\n }\n this.#categoryNames = [...this.#categories.keys()];\n\n this.host.classList.add('dm-emoji-picker-host');\n\n // Subscribe to insertEmoji event (not AbortSignal-aware; explicit off in destroy)\n this.#eventHandler = (...args: unknown[]): void => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n if (this.#isOpen) {\n this.close();\n return;\n }\n this.open(data?.anchorElement ?? null);\n };\n (this.#editor.on as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.#eventHandler,\n );\n }\n\n // === Public API ===\n\n /**\n * Open the picker. If `anchor` is provided, panel positions against it;\n * otherwise the panel renders un-positioned inside the host (consumer's CSS\n * responsibility).\n */\n open(anchor: HTMLElement | null): void {\n if (this.#destroyed || this.#isOpen) return;\n this.#anchor = anchor;\n this.#isOpen = true;\n this.#searchQuery = '';\n if (this.#categoryNames[0]) {\n this.#activeCategory = this.#categoryNames[0];\n }\n this.#setStorageOpen(true);\n\n this.#renderPanel();\n this.#attachGlobalListeners();\n this.#positionAndFocus();\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: true } }));\n }\n\n /**\n * Close the picker. Returns focus to the editor view (so the caret stays\n * visible). Idempotent.\n */\n close(): void {\n if (!this.#isOpen) return;\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#isOpen = false;\n this.#setStorageOpen(false);\n this.#searchQuery = '';\n this.#anchor = null;\n this.#detachGlobalListeners();\n this.#panel?.remove();\n this.#panel = null;\n if (!this.#editor.isDestroyed) {\n this.#editor.view.focus();\n }\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: false } }));\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n\n if (this.#eventHandler) {\n (this.#editor.off as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.#eventHandler,\n );\n this.#eventHandler = null;\n }\n if (this.#isOpen) this.#setStorageOpen(false);\n this.#panel?.remove();\n this.#panel = null;\n this.#isOpen = false;\n }\n\n // === Internal ===\n\n /** Title-cased emoji name for tooltip/aria-label (replaces underscores). */\n #formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n /** Display glyph for a category tab. Falls back to first character. */\n #categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n #getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.#editor.storage;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? null;\n }\n\n #setStorageOpen(open: boolean): void {\n const storage = this.#getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // No-op transaction so toolbar's transaction handler re-evaluates\n // `isActiveFn` and marks the emoji button as active/inactive.\n if (!this.#editor.isDestroyed) {\n this.#editor.view.dispatch(this.#editor.view.state.tr);\n }\n }\n\n #getFilteredEmojis(): EmojiPickerItem[] {\n const query = this.#searchQuery.toLowerCase();\n if (!query) return [];\n const storage = this.#getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as\n | ((q: string) => EmojiPickerItem[])\n | undefined;\n if (searchFn) return searchFn(query);\n return this.#emojis.filter(\n (item) =>\n item.name.includes(query) || item.group.toLowerCase().includes(query),\n );\n }\n\n #getFrequentlyUsed(): EmojiPickerItem[] {\n const storage = this.#getEmojiStorage();\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\n | Map<string, EmojiPickerItem>\n | undefined;\n if (!nameMap) return [];\n return names\n .slice(0, 16)\n .map((n) => nameMap.get(n))\n .filter((v): v is EmojiPickerItem => Boolean(v));\n }\n\n /** Render or refresh the picker panel inside `host`. */\n #renderPanel(): void {\n if (!this.#panel) {\n this.#panel = this.#createPanel();\n this.host.appendChild(this.#panel);\n } else {\n this.#panel.replaceChildren(...this.#renderPanelChildren());\n }\n }\n\n #createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-emoji-picker';\n panel.append(...this.#renderPanelChildren());\n return panel;\n }\n\n #renderPanelChildren(): Node[] {\n return [\n this.#renderSearch(),\n this.#renderTabs(),\n this.#renderGrid(),\n ];\n }\n\n #renderSearch(): HTMLDivElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-emoji-picker-search';\n const input = document.createElement('input');\n input.type = 'text';\n input.placeholder = 'Search emoji...';\n input.value = this.#searchQuery;\n input.setAttribute('aria-label', 'Search emoji');\n input.addEventListener('input', (e) => {\n this.#searchQuery = (e.target as HTMLInputElement).value;\n this.#refreshGrid();\n });\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') this.close();\n });\n wrapper.appendChild(input);\n return wrapper;\n }\n\n #renderTabs(): HTMLDivElement {\n const tabs = document.createElement('div');\n tabs.className = 'dm-emoji-picker-tabs';\n tabs.setAttribute('role', 'tablist');\n for (const cat of this.#categoryNames) {\n const tab = document.createElement('button');\n tab.type = 'button';\n tab.className = 'dm-emoji-picker-tab';\n if (this.#activeCategory === cat) {\n tab.classList.add('dm-emoji-picker-tab--active');\n }\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', String(this.#activeCategory === cat));\n tab.title = cat;\n tab.setAttribute('aria-label', cat);\n tab.textContent = this.#categoryIcon(cat);\n tab.addEventListener('mousedown', (e) => { e.preventDefault(); });\n tab.addEventListener('click', () => { this.#scrollToCategory(cat); });\n tabs.appendChild(tab);\n }\n return tabs;\n }\n\n #renderGrid(): HTMLDivElement {\n const grid = document.createElement('div');\n grid.className = 'dm-emoji-picker-grid';\n grid.addEventListener('scroll', () => { this.#onGridScroll(); });\n grid.addEventListener('keydown', (e) => { this.#onGridKeydown(e); });\n\n if (this.#searchQuery) {\n const filtered = this.#getFilteredEmojis();\n if (filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'dm-emoji-picker-empty';\n empty.textContent = 'No emoji found';\n grid.appendChild(empty);\n } else {\n for (const item of filtered) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n return grid;\n }\n\n // Default view: frequently used + categories\n const freq = this.#getFrequentlyUsed();\n if (freq.length) {\n const freqLabel = document.createElement('div');\n freqLabel.className = 'dm-emoji-picker-category-label';\n freqLabel.textContent = 'Frequently Used';\n grid.appendChild(freqLabel);\n for (const item of freq) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n\n for (const cat of this.#categoryNames) {\n const label = document.createElement('div');\n label.className = 'dm-emoji-picker-category-label';\n label.dataset['category'] = cat;\n label.textContent = cat;\n grid.appendChild(label);\n const items = this.#categories.get(cat) ?? [];\n for (const item of items) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n return grid;\n }\n\n #createSwatch(item: EmojiPickerItem): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-emoji-swatch';\n btn.tabIndex = -1;\n btn.title = this.#formatName(item.name);\n btn.setAttribute('aria-label', this.#formatName(item.name));\n btn.textContent = item.emoji;\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#selectEmoji(item); });\n return btn;\n }\n\n /**\n * Update `searchQuery` field AND sync the DOM input value. Centralised\n * so all callers see a consistent state - field is the source of truth\n * but the input element doesn't track it automatically.\n */\n #setSearchQuery(value: string): void {\n this.#searchQuery = value;\n const input = this.#panel?.querySelector<HTMLInputElement>(\n '.dm-emoji-picker-search input',\n );\n if (input && input.value !== value) input.value = value;\n }\n\n /** Replace grid contents only (used when searchQuery changes). */\n #refreshGrid(): void {\n if (!this.#panel) return;\n const oldGrid = this.#panel.querySelector('.dm-emoji-picker-grid');\n const newGrid = this.#renderGrid();\n oldGrid?.replaceWith(newGrid);\n }\n\n #refreshTabs(): void {\n if (!this.#panel) return;\n const oldTabs = this.#panel.querySelector('.dm-emoji-picker-tabs');\n const newTabs = this.#renderTabs();\n oldTabs?.replaceWith(newTabs);\n }\n\n #selectEmoji(item: EmojiPickerItem): void {\n const cmd = this.#editor.commands as Record<string, (...args: unknown[]) => boolean>;\n cmd['insertEmoji']?.(item.name);\n this.dispatchEvent(\n new CustomEvent('select', { detail: { name: item.name, emoji: item.emoji } }),\n );\n this.close();\n }\n\n #scrollToCategory(cat: string): void {\n // Clear search to ensure category view is rendered (not filtered)\n if (cat !== this.#activeCategory) this.#setSearchQuery('');\n this.#activeCategory = cat;\n this.#refreshTabs();\n this.#refreshGrid();\n\n // Wait for grid to be in DOM, then scroll + focus\n requestAnimationFrame(() => {\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\n if (!label) return;\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n setTimeout(() => {\n const first = label.nextElementSibling;\n if (first instanceof HTMLElement && first.classList.contains('dm-emoji-swatch')) {\n first.focus();\n }\n }, SCROLL_SETTLE_MS);\n });\n }\n\n #onGridScroll(): void {\n if (this.#searchQuery) return;\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const labels = Array.from(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'),\n );\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 !== this.#activeCategory) {\n this.#activeCategory = currentCat;\n this.#refreshTabs();\n }\n }\n\n #onGridKeydown(event: KeyboardEvent): void {\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const swatches = Array.from(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement;\n const idx = active instanceof HTMLElement ? swatches.indexOf(active) : -1;\n if (idx === -1) {\n // Focus is somewhere else (e.g. grid container) - 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':\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 'Enter':\n case ' ':\n event.preventDefault();\n swatches[idx]?.click();\n return;\n default:\n return;\n }\n swatches[next]?.focus();\n }\n\n #positionAndFocus(): void {\n requestAnimationFrame(() => {\n if (!this.#panel || this.#destroyed) return;\n if (this.#anchor) {\n this.#cleanupFloating?.();\n this.#cleanupFloating = positionFloatingOnce(this.#anchor, this.#panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.#panel.querySelector<HTMLInputElement>(\n '.dm-emoji-picker-search input',\n );\n input?.focus({ preventScroll: true });\n });\n }\n\n #attachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = new AbortController();\n const { signal } = this.#openAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target || !this.#isOpen) return;\n if (this.#panel?.contains(target)) return;\n if (target === this.#anchor) return;\n if (this.#anchor?.contains(target)) return;\n // Defer close so the click handler on a panel descendant fires first\n requestAnimationFrame(() => { this.close(); });\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isOpen) {\n e.preventDefault();\n this.close();\n }\n },\n { signal },\n );\n }\n\n #detachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = null;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/isBrowser.ts","../src/shared/pluginKey.ts","../src/shared/iconRenderer.ts","../src/shared/eventTarget.ts","../src/editor/DomternalEditor.ts","../src/toolbar/tooltip.ts","../src/toolbar/iconCache.ts","../src/toolbar/computedStyle.ts","../src/toolbar/DomternalToolbar.ts","../src/bubble-menu/itemResolver.ts","../src/bubble-menu/trailingState.ts","../src/bubble-menu/DomternalBubbleMenu.ts","../src/floating-menu/DomternalFloatingMenu.ts","../src/notion-color-picker/DomternalNotionColorPicker.ts","../src/emoji-picker/DomternalEmojiPicker.ts"],"names":["defaultIcons","DROPDOWN_CARET","ToolbarController","refocusEditorAfterCommand","positionFloatingOnce"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * SSR-safe environment check.\n *\n * `@domternal/vanilla` classes construct DOM nodes and attach listeners on\n * `document` / `window`. During SSR (Astro/Nuxt/Next.js build), the module\n * may be imported but constructors must NOT run server-side.\n *\n * Class constructors call `assertBrowser()` early to throw a clear error\n * if invoked outside a browser environment.\n *\n * @example\n * ```ts\n * import { isBrowser, assertBrowser } from '@domternal/vanilla';\n *\n * if (isBrowser) {\n * const editor = new DomternalEditor(host, { editor });\n * }\n *\n * // Or, in a constructor that requires browser:\n * class MyWrapper {\n * constructor(host: HTMLElement) {\n * assertBrowser('MyWrapper');\n * // ... safe to use document/window from here\n * }\n * }\n * ```\n */\nexport const isBrowser: boolean =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n\n/**\n * Assert the current environment is a browser. Throws with an actionable\n * error message tailored to common SSR frameworks (Astro, Nuxt, Next.js).\n *\n * @param className - Name of the calling class, included in the error\n * message so users can identify the culprit constructor in a stack trace.\n *\n * @throws Error if called server-side.\n */\nexport function assertBrowser(className: string): void {\n if (!isBrowser) {\n throw new Error(\n `[${className}] requires a browser environment. ` +\n `If using Astro, wrap with <client:only=\"vanilla\"> or instantiate inside a <script> tag. ` +\n `If using Nuxt/Next.js, gate construction with a typeof window check.`,\n );\n }\n}\n","import { PluginKey } from '@domternal/core';\n\n/**\n * Create a unique `PluginKey` with collision-free suffix.\n *\n * Two instances of the same wrapper class mounted in the same editor (rare\n * but supported) need distinct keys to avoid ProseMirror plugin clashes.\n *\n * Why crypto.randomUUID + Math.random fallback: matches the framework\n * wrapper convention (angular, react, vue all use this pattern as of\n * commit fbef072). SSR may share Math.random seed across mount cycles,\n * giving collisions; crypto.randomUUID is collision-free by spec.\n *\n * @param prefix - Human-readable prefix for debugging. Convention: kebab or\n * camel case identifying the wrapper. e.g. `'vanillaBubbleMenu'`.\n * @returns A `PluginKey` with format `<prefix>-<8-char-suffix>`.\n *\n * @example\n * ```ts\n * import { createPluginKey } from '@domternal/vanilla';\n *\n * class MyBubbleMenu {\n * #pluginKey = createPluginKey('myBubbleMenu');\n *\n * constructor(editor: Editor) {\n * const plugin = createBubbleMenuPlugin({\n * pluginKey: this.#pluginKey,\n * editor,\n * element: this.host,\n * });\n * editor.registerPlugin(plugin);\n * }\n *\n * destroy() {\n * this.editor.unregisterPlugin(this.#pluginKey);\n * }\n * }\n * ```\n */\nexport function createPluginKey(prefix: string): PluginKey {\n const cryptoRef = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n const suffix =\n cryptoRef?.randomUUID?.().slice(0, 8) ?? Math.random().toString(36).slice(2, 8);\n return new PluginKey(prefix + '-' + suffix);\n}\n","import { defaultIcons } from '@domternal/core';\nimport type { IconSet } from '@domternal/core';\n\n/**\n * Resolve and inject an icon's SVG string into a host element.\n *\n * Why innerHTML is safe here: icons come from the `defaultIcons` lookup\n * table (Phosphor SVG strings shipped with core) or from a consumer-provided\n * `IconSet` object. Both are trusted by contract because they are constants in\n * source code, not user input. This matches the React (`dangerouslySetInnerHTML`),\n * Angular (`bypassSecurityTrustHtml`), and Vue (`v-html`) patterns.\n *\n * Consumer responsibility (documented in README): never pass user-controlled\n * strings as icon values in your `IconSet`.\n *\n * @param hostEl - Target element. `innerHTML` is replaced (existing children\n * are removed).\n * @param iconKey - Icon name to look up in `icons` first, then `defaultIcons`.\n * When `undefined`, the host is emptied.\n * @param icons - Optional consumer-provided icon overrides. Falls back to\n * `defaultIcons` if not provided or if the key is missing.\n *\n * @example\n * ```ts\n * import { renderIconInto } from '@domternal/vanilla';\n *\n * const button = document.createElement('button');\n * const iconSpan = document.createElement('span');\n * button.appendChild(iconSpan);\n *\n * renderIconInto(iconSpan, 'textB'); // default Phosphor icon\n * renderIconInto(iconSpan, 'bold', { bold: mySvg }); // custom override\n * renderIconInto(iconSpan, undefined); // clear icon\n * ```\n */\nexport function renderIconInto(\n hostEl: HTMLElement,\n iconKey: string | undefined,\n icons: IconSet | undefined,\n): void {\n if (!iconKey) {\n hostEl.innerHTML = '';\n return;\n }\n const customIcon: string | undefined = icons?.[iconKey];\n const defaultIcon: string | undefined = defaultIcons[iconKey];\n const svg = customIcon ?? defaultIcon ?? '';\n hostEl.innerHTML = svg;\n}\n\n/**\n * Resolve an icon's SVG string without injection. Useful when caller\n * builds the final DOM tree (e.g. via `document.createElement` chain\n * or template literal interpolation).\n *\n * @param iconKey - Icon name to look up. When `undefined`, returns `''`.\n * @param icons - Optional consumer overrides; falls back to `defaultIcons`.\n * @returns Trusted SVG string, or `''` if the icon is unknown.\n *\n * @example\n * ```ts\n * import { resolveIcon } from '@domternal/vanilla';\n *\n * const iconHtml = resolveIcon('textB', undefined);\n * const button = document.createElement('button');\n * button.innerHTML = `<span class=\"icon\">${iconHtml}</span><span>Bold</span>`;\n * ```\n */\nexport function resolveIcon(\n iconKey: string | undefined,\n icons: IconSet | undefined,\n): string {\n if (!iconKey) return '';\n return icons?.[iconKey] ?? defaultIcons[iconKey] ?? '';\n}\n","/**\n * Helpers for typed event subscription over `EventTarget`.\n *\n * Each `@domternal/vanilla` class extends the platform `EventTarget` and\n * dispatches `CustomEvent` instances. Consumers can use the platform\n * `addEventListener('eventName', handler)` directly, OR call `subscribe()`\n * which returns an unsubscribe function and narrows the detail type.\n *\n * Usage:\n * ```ts\n * import { subscribe } from '@domternal/vanilla';\n *\n * const off = subscribe<{ isOpen: boolean }>(picker, 'openchange', (detail) => {\n * console.log(detail.isOpen);\n * });\n * off(); // remove listener\n * ```\n *\n * Each class JSDoc lists the events it emits + the shape of `detail`.\n */\n// TDetail is used once in the signature (intentional - consumer specifies\n// the CustomEvent detail type at call site for type-safe handler). The\n// rule flags this as \"unnecessary\", but it IS necessary for DX.\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\nexport function subscribe<TDetail = unknown>(\n target: EventTarget,\n type: string,\n listener: (detail: TDetail) => void,\n): () => void {\n const wrapper = (event: Event): void => {\n listener((event as CustomEvent<TDetail>).detail);\n };\n target.addEventListener(type, wrapper);\n return (): void => {\n target.removeEventListener(type, wrapper);\n };\n}\n","import {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type {\n Content,\n AnyExtension,\n FocusPosition,\n JSONContent,\n TransactionEventProps,\n FocusEventProps,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n];\n\nexport interface DomternalEditorOptions {\n /** Custom extensions to add. Merged on top of `DEFAULT_EXTENSIONS`. */\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 /**\n * Output format hint for downstream consumers (e.g. host frameworks\n * comparing controlled-mode content). Does not change editor behavior.\n * @default 'html'\n */\n outputFormat?: 'html' | 'json';\n /** Called once when the underlying Editor instance is created. */\n onCreate?: (editor: Editor) => void;\n /** Called when the document content changes. */\n onUpdate?: (ctx: { editor: Editor }) => void;\n /** Called when the selection moves without a content change. */\n onSelectionChange?: (ctx: { editor: Editor }) => void;\n /** Called when the editor gains focus. */\n onFocus?: (ctx: { editor: Editor; event: FocusEvent }) => void;\n /** Called when the editor loses focus. */\n onBlur?: (ctx: { editor: Editor; event: FocusEvent }) => void;\n /** Called before the underlying Editor is destroyed. */\n onDestroy?: () => void;\n}\n\n/**\n * `DomternalEditor` - vanilla DOM wrapper around `@domternal/core`'s `Editor`.\n *\n * Mounts an editor into the host element, wires lifecycle callbacks, exposes\n * reactive-friendly getters via plain properties, and dispatches `CustomEvent`\n * instances for state changes (so framework adapters can bridge).\n *\n * Construction is browser-only - throws in SSR contexts (use Astro\n * `<client:only=\"vanilla\">` or similar gate).\n *\n * Cleanup is automatic via `destroy()` (calls `editor.destroy()` + emits\n * `destroy` event).\n *\n * @example\n * ```ts\n * import { DomternalEditor } from '@domternal/vanilla';\n * import { StarterKit } from '@domternal/core';\n *\n * const host = document.getElementById('editor')!;\n * const wrapper = new DomternalEditor(host, {\n * extensions: [StarterKit],\n * content: '<p>Hello world</p>',\n * onUpdate: ({ editor }) => console.log(editor.getHTML()),\n * });\n *\n * // Reactive access via getters:\n * console.log(wrapper.htmlContent);\n * console.log(wrapper.isEmpty);\n *\n * // Event subscription (CustomEvent):\n * wrapper.addEventListener('update', () => {\n * console.log('content changed');\n * });\n *\n * // Cleanup:\n * wrapper.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `create` - `{ editor: Editor }` - emitted once after Editor instantiation\n * - `update` - `{ editor: Editor }` - emitted on every content change\n * - `selectionchange` - `{ editor: Editor }` - emitted on selection-only updates\n * - `focus` - `{ editor: Editor; event: FocusEvent }`\n * - `blur` - `{ editor: Editor; event: FocusEvent }`\n * - `destroy` - `null` - emitted just before destroy completes\n */\nexport class DomternalEditor extends EventTarget {\n /** The underlying ProseMirror-backed `Editor` instance. */\n readonly editor: Editor;\n /** The host element provided to the constructor. */\n readonly host: HTMLElement;\n\n #destroyed = false;\n #onCreate: DomternalEditorOptions['onCreate'];\n #onUpdate: DomternalEditorOptions['onUpdate'];\n #onSelectionChange: DomternalEditorOptions['onSelectionChange'];\n #onFocus: DomternalEditorOptions['onFocus'];\n #onBlur: DomternalEditorOptions['onBlur'];\n #onDestroy: DomternalEditorOptions['onDestroy'];\n\n #transactionHandler: ((props: TransactionEventProps) => void) | null = null;\n #focusHandler: ((props: FocusEventProps) => void) | null = null;\n #blurHandler: ((props: FocusEventProps) => void) | null = null;\n\n constructor(host: HTMLElement, options: DomternalEditorOptions = {}) {\n super();\n assertBrowser('DomternalEditor');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalEditor] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#editor\")).',\n );\n }\n\n this.host = host;\n this.#onCreate = options.onCreate;\n this.#onUpdate = options.onUpdate;\n this.#onSelectionChange = options.onSelectionChange;\n this.#onFocus = options.onFocus;\n this.#onBlur = options.onBlur;\n this.#onDestroy = options.onDestroy;\n\n this.editor = new Editor({\n element: host,\n extensions: [...DEFAULT_EXTENSIONS, ...(options.extensions ?? [])],\n content: options.content ?? '',\n editable: options.editable ?? true,\n autofocus: options.autofocus ?? false,\n });\n\n this.#wireEditorEvents();\n\n this.#onCreate?.(this.editor);\n this.dispatchEvent(\n new CustomEvent('create', { detail: { editor: this.editor } }),\n );\n }\n\n // === Reactive-friendly getters ===\n\n get htmlContent(): string {\n return this.editor.getHTML();\n }\n\n get jsonContent(): JSONContent {\n return this.editor.getJSON();\n }\n\n get isEmpty(): boolean {\n return this.editor.isEmpty;\n }\n\n get isFocused(): boolean {\n return this.editor.isFocused;\n }\n\n get isEditable(): boolean {\n return this.editor.isEditable;\n }\n\n // === Mutators ===\n\n /**\n * Replace editor content. Does NOT emit `update` event by default\n * (mirrors `Editor.setContent` behavior); pass `emitUpdate=true` to fire.\n *\n * No-op if the wrapper has been destroyed.\n */\n setContent(content: Content, emitUpdate = false): void {\n if (this.#destroyed) return;\n this.editor.setContent(content, emitUpdate);\n }\n\n /**\n * Toggle the editor's editable state (`true` allows input, `false` makes\n * it read-only). No-op if the wrapper has been destroyed.\n */\n setEditable(editable: boolean): void {\n if (this.#destroyed) return;\n this.editor.setEditable(editable);\n }\n\n /**\n * Programmatically focus the editor.\n *\n * @param position - Focus position (`'start' | 'end' | 'all' | number | boolean`).\n * Defaults to current selection. No-op if the wrapper has been destroyed.\n */\n focus(position?: FocusPosition): void {\n if (this.#destroyed) return;\n this.editor.commands.focus(position);\n }\n\n /**\n * Tear down the underlying editor + remove all subscriptions.\n *\n * Idempotent - calling twice is a no-op. Dispatches a `destroy` CustomEvent\n * BEFORE the editor is destroyed, so listeners can read `this.editor` state\n * one last time.\n */\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#onDestroy?.();\n this.dispatchEvent(new CustomEvent('destroy', { detail: null }));\n\n this.#unwireEditorEvents();\n\n if (!this.editor.isDestroyed) {\n this.editor.destroy();\n }\n }\n\n // === Internal ===\n\n #wireEditorEvents(): void {\n this.#transactionHandler = ({ transaction }: TransactionEventProps): void => {\n if (transaction.docChanged) {\n this.#onUpdate?.({ editor: this.editor });\n this.dispatchEvent(\n new CustomEvent('update', { detail: { editor: this.editor } }),\n );\n }\n if (!transaction.docChanged && transaction.selectionSet) {\n this.#onSelectionChange?.({ editor: this.editor });\n this.dispatchEvent(\n new CustomEvent('selectionchange', { detail: { editor: this.editor } }),\n );\n }\n };\n\n this.#focusHandler = ({ event }: FocusEventProps): void => {\n this.#onFocus?.({ editor: this.editor, event });\n this.dispatchEvent(\n new CustomEvent('focus', { detail: { editor: this.editor, event } }),\n );\n };\n\n this.#blurHandler = ({ event }: FocusEventProps): void => {\n this.#onBlur?.({ editor: this.editor, event });\n this.dispatchEvent(\n new CustomEvent('blur', { detail: { editor: this.editor, event } }),\n );\n };\n\n this.editor.on('transaction', this.#transactionHandler as (...args: unknown[]) => void);\n this.editor.on('focus', this.#focusHandler as (...args: unknown[]) => void);\n this.editor.on('blur', this.#blurHandler as (...args: unknown[]) => void);\n }\n\n #unwireEditorEvents(): void {\n if (this.#transactionHandler) {\n this.editor.off('transaction', this.#transactionHandler as (...args: unknown[]) => void);\n this.#transactionHandler = null;\n }\n if (this.#focusHandler) {\n this.editor.off('focus', this.#focusHandler as (...args: unknown[]) => void);\n this.#focusHandler = null;\n }\n if (this.#blurHandler) {\n this.editor.off('blur', this.#blurHandler as (...args: unknown[]) => void);\n this.#blurHandler = null;\n }\n }\n}\n","import type { ToolbarButton } from '@domternal/core';\n\nconst isMac =\n typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\nconst MODIFIER_MAP: Record<string, string> = isMac\n ? { Mod: '⌘', Shift: '⇧', Alt: '⌥' }\n : { Mod: 'Ctrl', Shift: 'Shift', Alt: 'Alt' };\n\n/**\n * Format a toolbar button's tooltip including its keyboard shortcut.\n *\n * On macOS uses Unicode glyphs (⌘ ⇧ ⌥); elsewhere falls back\n * to \"Ctrl+Shift+Alt\" text. Mirrors Vue/React wrapper behavior.\n */\nexport 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","import { defaultIcons } from '@domternal/core';\nimport type { IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const 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 IconCache {\n resolveSvg: (name: string) => string;\n getIcon: (name: string) => string;\n getTriggerLabel: (label: string, isIcon?: boolean) => string;\n getTriggerIcon: (iconName: string) => string;\n getItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n getDropdownTriggerHtml: (dropdown: ToolbarDropdown, activeItem: ToolbarButton | undefined) => string;\n setIcons: (icons: IconSet | undefined) => void;\n}\n\n/**\n * Resolve + cache toolbar icons. Mirrors Vue's `useToolbarIcons` logic\n * verbatim - same cache keys, same fallback order (consumer `IconSet` ->\n * `defaultIcons`), same dropdown trigger HTML composition.\n *\n * Cache is invalidated when consumer swaps `IconSet`.\n */\nexport function createIconCache(initialIcons: IconSet | undefined): IconCache {\n const cache = new Map<string, string>();\n let icons: IconSet | undefined = initialIcons;\n let prevIcons: IconSet | undefined = initialIcons;\n\n function checkInvalidation(): void {\n if (icons !== prevIcons) {\n cache.clear();\n prevIcons = icons;\n }\n }\n\n function resolveSvg(name: string): string {\n if (icons) {\n return icons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }\n\n function getIcon(name: string): string {\n checkInvalidation();\n const key = `i:${name}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n cached = resolveSvg(name);\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getTriggerLabel(label: string, isIcon?: boolean): string {\n checkInvalidation();\n const key = `tl:${label}:${isIcon ? '1' : '0'}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n const content = isIcon ? resolveSvg(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 getTriggerIcon(iconName: string): string {\n checkInvalidation();\n const key = `t:${iconName}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n cached = resolveSvg(iconName) + DROPDOWN_CARET;\n cache.set(key, cached);\n }\n return cached;\n }\n\n function getItemContent(\n iconName: string,\n label: string,\n displayMode?: 'icon-text' | 'text' | 'icon',\n ): string {\n const mode = displayMode ?? 'icon-text';\n checkInvalidation();\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = cache.get(key);\n if (cached === undefined) {\n if (mode === 'text') {\n cached = label;\n } else if (mode === 'icon') {\n cached = resolveSvg(iconName);\n } else {\n cached = resolveSvg(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 checkInvalidation();\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 === undefined) {\n cached = resolveSvg(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 getTriggerLabel(activeItem.label);\n if (dropdown.dynamicLabelFallback) return getTriggerLabel(dropdown.dynamicLabelFallback);\n return getTriggerLabel(dropdown.icon, true);\n }\n\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return getTriggerIcon(icon);\n }\n\n function setIcons(newIcons: IconSet | undefined): void {\n icons = newIcons;\n }\n\n return {\n resolveSvg,\n getIcon,\n getTriggerLabel,\n getTriggerIcon,\n getItemContent,\n getDropdownTriggerHtml,\n setIcons,\n };\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 * Read a CSS property at the current cursor position.\n * Prefers inline style, falls back to computed style. Used by dropdowns\n * with `computedStyleProperty` (e.g. font-size) to show the current value\n * in their trigger label.\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 * Read ONLY inline style at the current cursor position (skips browser-default\n * computed inheritance). Used for `font-family` where computed value includes\n * the document's default fallback that would override any user-set font in the\n * toolbar's \"current font\" indicator.\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 {\n ToolbarController,\n positionFloatingOnce,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport type {\n Editor,\n IconSet,\n ToolbarButton,\n ToolbarControllerEditor,\n ToolbarDropdown,\n ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { getTooltip } from './tooltip.js';\nimport { createIconCache, DROPDOWN_CARET } from './iconCache.js';\nimport type { IconCache } from './iconCache.js';\nimport { getComputedStyleAtCursor, getInlineStyleAtCursor } from './computedStyle.js';\n\nexport interface DomternalToolbarOptions {\n /** Editor instance the toolbar binds to. */\n editor: Editor;\n /** Optional icon set override. Falls back to `defaultIcons` per key. */\n icons?: IconSet;\n /**\n * Optional custom layout (item names + separators + custom dropdowns).\n * When omitted, items are grouped by their declared `group` property and\n * sorted by priority within each group.\n *\n * @example\n * ```ts\n * new DomternalToolbar(host, {\n * editor,\n * layout: ['bold', 'italic', 'underline', '|', 'heading', '|', 'undo', 'redo'],\n * });\n * ```\n */\n layout?: ToolbarLayoutEntry[];\n}\n\n/**\n * `DomternalToolbar` - vanilla DOM toolbar bound to an editor's items.\n *\n * Mounts a `ToolbarController` from `@domternal/core` and renders its state\n * (groups, active map, disabled map, dropdown state) into the host element.\n *\n * Re-renders are batched via `requestAnimationFrame` so transaction-rate\n * updates don't thrash the DOM. Button DOM nodes are reused across renders\n * (only their classes/attrs update) to preserve focus when navigating with\n * the keyboard.\n *\n * @example\n * ```ts\n * import { Editor, StarterKit } from '@domternal/core';\n * import { DomternalToolbar } from '@domternal/vanilla';\n * import '@domternal/theme';\n *\n * const editor = new Editor({\n * element: document.getElementById('editor')!,\n * extensions: [StarterKit],\n * });\n *\n * const toolbar = new DomternalToolbar(document.getElementById('toolbar')!, {\n * editor,\n * // Optional custom layout:\n * // layout: ['bold', 'italic', '|', 'heading'],\n * });\n *\n * // Update later:\n * toolbar.setLayout(['bold', 'italic', 'underline']);\n *\n * // Cleanup:\n * toolbar.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `dropdownopen` - `{ name: string }` - emitted when a dropdown opens\n * - `dropdownclose` - `{ name: string }` - emitted when a dropdown closes\n */\nexport class DomternalToolbar extends EventTarget {\n readonly host: HTMLElement;\n\n /** The editor instance this toolbar is bound to. */\n get editor(): Editor {\n return this.#editor;\n }\n\n /** Underlying controller. Exposed for power-user introspection. */\n get controller(): ToolbarController {\n return this.#controller;\n }\n\n #controller: ToolbarController;\n #editor: Editor;\n #layout: ToolbarLayoutEntry[] | undefined;\n #iconCache: IconCache;\n #abortCtl = new AbortController();\n #destroyed = false;\n\n /** Tracks the groups array reference to detect \"structure changed\" vs \"state changed\". */\n #lastGroupsRef: readonly unknown[] | null = null;\n\n /** Maps top-level button/dropdown name -> rendered trigger element. */\n #buttonEls = new Map<string, HTMLButtonElement>();\n\n /** Rendered dropdown panel elements (created lazily when opened). */\n #dropdownPanelEl: HTMLElement | null = null;\n #cleanupFloating: (() => void) | null = null;\n\n #renderPending = false;\n #renderRaf = 0;\n #editorEl: HTMLElement | null = null;\n\n constructor(host: HTMLElement, options: DomternalToolbarOptions) {\n super();\n assertBrowser('DomternalToolbar');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalToolbar] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#toolbar\")).',\n );\n }\n // Runtime guard for JS users who bypass TS type-checking.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalToolbar] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#layout = options.layout;\n this.#iconCache = createIconCache(options.icons);\n\n // Host setup\n this.host.classList.add('dm-toolbar');\n this.host.setAttribute('role', 'toolbar');\n this.host.setAttribute('aria-label', 'Editor formatting');\n this.host.setAttribute('data-dm-editor-ui', '');\n\n // Controller\n this.#controller = new ToolbarController(\n this.#editor as unknown as ToolbarControllerEditor,\n () => { this.#scheduleRender(); },\n this.#layout,\n );\n this.#controller.subscribe();\n\n // Wire global listeners (AbortController scoped)\n this.#attachListeners();\n\n // Initial paint\n this.#render();\n }\n\n // === Getters ===\n\n get openDropdown(): string | null {\n return this.#controller.openDropdown;\n }\n\n // === Setters ===\n\n setLayout(layout: ToolbarLayoutEntry[] | undefined): void {\n if (this.#destroyed) return;\n this.#layout = layout;\n // ToolbarController doesn't expose a public setLayout, so recreate.\n // Destroy + new is the documented pattern.\n this.#controller.destroy();\n this.#controller = new ToolbarController(\n this.#editor as unknown as ToolbarControllerEditor,\n () => { this.#scheduleRender(); },\n this.#layout,\n );\n this.#controller.subscribe();\n this.#lastGroupsRef = null; // force full rebuild\n this.#scheduleRender();\n }\n\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#iconCache.setIcons(icons);\n this.#lastGroupsRef = null; // force full rebuild (icons baked into innerHTML)\n this.#scheduleRender();\n }\n\n closeDropdown(): void {\n if (this.#destroyed) return;\n this.#controller.closeDropdown();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#abortCtl.abort();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#controller.destroy();\n\n this.#dropdownPanelEl?.remove();\n this.#dropdownPanelEl = null;\n this.host.replaceChildren();\n this.#buttonEls.clear();\n }\n\n // === Lifecycle helpers ===\n\n #attachListeners(): void {\n const { signal } = this.#abortCtl;\n\n // Outside-click closes any open dropdown\n document.addEventListener(\n 'mousedown',\n (e) => {\n if (!this.#controller.openDropdown) return;\n const target = e.target as Node;\n if (this.host.contains(target)) return;\n if (this.#dropdownPanelEl?.contains(target)) return;\n this.closeDropdown();\n },\n { signal },\n );\n\n // Keyboard navigation on toolbar host\n this.host.addEventListener(\n 'keydown',\n (e) => { this.#onKeyDown(e); },\n { signal },\n );\n\n // Cooperative dismissal across editor overlays\n this.#editorEl = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n this.#editorEl?.addEventListener(\n 'dm:dismiss-overlays',\n () => {\n if (this.#controller.openDropdown) {\n this.closeDropdown();\n }\n },\n { signal },\n );\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed) return;\n this.#render();\n });\n }\n\n #render(): void {\n const groups = this.#controller.groups;\n const groupsChanged = groups !== this.#lastGroupsRef;\n if (groupsChanged) {\n this.#renderGroupsStructure(groups);\n this.#lastGroupsRef = groups;\n }\n this.#updateButtonStates();\n this.#renderDropdown();\n }\n\n #renderGroupsStructure(groups: readonly { name: string; items: ToolbarItem[] }[]): void {\n // Wipe and rebuild structure. Button refs are tracked so subsequent\n // state updates target individual DOM nodes (no full rebuild per tx).\n // Also drop any open dropdown panel reference - replaceChildren() removed\n // it from DOM; renderDropdown() will recreate it next pass if still open.\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#dropdownPanelEl = null;\n this.host.replaceChildren();\n this.#buttonEls.clear();\n\n groups.forEach((group, gi) => {\n if (gi > 0) {\n const sep = document.createElement('div');\n sep.className = 'dm-toolbar-separator';\n sep.setAttribute('role', 'separator');\n this.host.appendChild(sep);\n }\n\n const groupEl = document.createElement('div');\n groupEl.className = 'dm-toolbar-group';\n groupEl.setAttribute('role', 'group');\n groupEl.setAttribute('aria-label', group.name || 'Tools');\n\n for (const item of group.items) {\n if (item.type === 'button') {\n const btnEl = this.#createButton(item);\n groupEl.appendChild(btnEl);\n this.#buttonEls.set(item.name, btnEl);\n } else if (item.type === 'dropdown') {\n const wrapper = this.#createDropdownTrigger(item);\n groupEl.appendChild(wrapper);\n }\n }\n\n this.host.appendChild(groupEl);\n });\n }\n\n #createButton(item: ToolbarButton): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n btn.innerHTML = this.#iconCache.getIcon(item.icon);\n btn.setAttribute('aria-label', item.label);\n btn.title = getTooltip(item);\n if (item.style) btn.setAttribute('style', item.style);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onButtonClick(item, e); });\n btn.addEventListener('focus', () => { this.#onButtonFocus(item.name); });\n\n return btn;\n }\n\n #createDropdownTrigger(dd: ToolbarDropdown): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-toolbar-dropdown-wrapper';\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button dm-toolbar-dropdown-trigger';\n btn.setAttribute('aria-haspopup', 'true');\n btn.setAttribute('aria-label', dd.label);\n btn.title = dd.label;\n btn.setAttribute('data-dropdown', dd.name);\n btn.innerHTML = this.#resolveDropdownTriggerHtml(dd);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#onDropdownToggle(dd); });\n btn.addEventListener('focus', () => { this.#onButtonFocus(dd.name); });\n\n wrapper.appendChild(btn);\n this.#buttonEls.set(dd.name, btn);\n return wrapper;\n }\n\n #resolveDropdownTriggerHtml(dd: ToolbarDropdown): string {\n const activeItem = dd.items.find((sub) => this.#controller.activeMap.get(sub.name));\n\n // Dynamic-label dropdown reading computed style at cursor (e.g. font-size)\n if (dd.dynamicLabel && !activeItem && dd.computedStyleProperty) {\n let computed: string | null;\n if (dd.computedStyleProperty === 'font-family') {\n computed = getInlineStyleAtCursor(this.#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(this.#editor, dd.computedStyleProperty);\n }\n if (computed) {\n return `<span class=\"dm-toolbar-trigger-label\">${computed}</span>${DROPDOWN_CARET}`;\n }\n }\n\n return this.#iconCache.getDropdownTriggerHtml(dd, activeItem);\n }\n\n #updateButtonStates(): void {\n const groups = this.#controller.groups;\n const focusedIndex = this.#controller.focusedIndex;\n\n for (const group of groups) {\n for (const item of group.items) {\n if (item.type === 'button') {\n this.#updateButton(item, focusedIndex);\n } else if (item.type === 'dropdown') {\n this.#updateDropdownTrigger(item, focusedIndex);\n }\n }\n }\n }\n\n #updateButton(item: ToolbarButton, focusedIndex: number): void {\n const btn = this.#buttonEls.get(item.name);\n if (!btn) return;\n const isActive = this.#controller.activeMap.get(item.name) ?? false;\n const isDisabled = this.#controller.disabledMap.get(item.name) ?? false;\n const flat = this.#controller.getFlatIndex(item.name);\n\n btn.classList.toggle('dm-toolbar-button--active', isActive);\n btn.disabled = isDisabled;\n btn.setAttribute('aria-pressed', String(isActive));\n btn.tabIndex = flat === focusedIndex ? 0 : -1;\n\n if (item.emitEvent) {\n const expanded = this.#controller.expandedMap.get(item.name) === true;\n if (expanded) {\n btn.setAttribute('aria-expanded', 'true');\n } else {\n btn.removeAttribute('aria-expanded');\n }\n }\n }\n\n #updateDropdownTrigger(dd: ToolbarDropdown, focusedIndex: number): void {\n const btn = this.#buttonEls.get(dd.name);\n if (!btn) return;\n\n const isDisabled = this.#controller.disabledMap.get(dd.name) ?? false;\n const isOpen = this.#controller.openDropdown === dd.name;\n const flat = this.#controller.getFlatIndex(dd.name);\n\n // dropdown trigger active when its currently-active sub-item exists\n const isDropdownActive = dd.layout !== 'grid'\n && !dd.dynamicLabel\n && dd.items.some((sub) => this.#controller.activeMap.get(sub.name) ?? false);\n\n btn.classList.toggle('dm-toolbar-button--active', isDropdownActive);\n btn.disabled = isDisabled;\n btn.setAttribute('aria-expanded', String(isOpen));\n btn.tabIndex = flat === focusedIndex ? 0 : -1;\n\n // Trigger HTML may change with cursor (dynamicLabel/dynamicIcon).\n // Recompute and only swap if different (avoids needless DOM writes).\n const newHtml = this.#resolveDropdownTriggerHtml(dd);\n if (btn.innerHTML !== newHtml) {\n btn.innerHTML = newHtml;\n }\n }\n\n #renderDropdown(): void {\n const openName = this.#controller.openDropdown;\n const currentPanel = this.#dropdownPanelEl;\n\n // Nothing to do\n if (openName === null && currentPanel === null) return;\n\n // Closing: remove panel\n if (openName === null) {\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n currentPanel?.remove();\n this.#dropdownPanelEl = null;\n return;\n }\n\n // Open: find the dropdown definition\n const dd = this.#findDropdown(openName);\n if (!dd) return;\n\n // If panel already shows this dropdown, do nothing\n if (currentPanel?.dataset['dropdownPanel'] === openName) return;\n\n // Replace any prior panel (shouldn't happen but be safe)\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n currentPanel?.remove();\n\n const panel = this.#createDropdownPanel(dd);\n const trigger = this.#buttonEls.get(dd.name);\n if (!trigger) return;\n\n // Append to wrapper so theme styles position relative\n trigger.parentElement?.appendChild(panel);\n this.#dropdownPanelEl = panel;\n\n requestAnimationFrame(() => {\n if (this.#destroyed || !panel.isConnected) return;\n const placement = dd.layout === 'grid' ? 'bottom' : 'bottom-start';\n this.#cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n });\n\n this.dispatchEvent(new CustomEvent('dropdownopen', { detail: { name: openName } }));\n }\n\n #createDropdownPanel(dd: ToolbarDropdown): HTMLElement {\n const panel = document.createElement('div');\n panel.dataset['dropdownPanel'] = dd.name;\n panel.setAttribute('role', 'menu');\n\n if (dd.layout === 'grid') {\n panel.className = 'dm-toolbar-dropdown-panel dm-color-palette';\n panel.style.setProperty('--dm-palette-columns', String(dd.gridColumns ?? 10));\n\n for (const sub of dd.items) {\n if (sub.color) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-color-swatch';\n if (this.#controller.activeMap.get(sub.name)) {\n btn.classList.add('dm-color-swatch--active');\n }\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.title = sub.label;\n btn.style.backgroundColor = sub.color;\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n } else {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-color-palette-reset';\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.innerHTML = this.#iconCache.getItemContent(sub.icon, sub.label);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n }\n }\n return panel;\n }\n\n // Standard list dropdown\n panel.className = 'dm-toolbar-dropdown-panel';\n if (dd.displayMode) panel.setAttribute('data-display-mode', dd.displayMode);\n\n for (const sub of dd.items) {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-dropdown-item';\n if (this.#controller.activeMap.get(sub.name)) {\n btn.classList.add('dm-toolbar-dropdown-item--active');\n }\n btn.setAttribute('role', 'menuitem');\n btn.tabIndex = -1;\n btn.setAttribute('aria-label', sub.label);\n btn.title = sub.label;\n btn.innerHTML = this.#iconCache.getItemContent(sub.icon, sub.label, dd.displayMode);\n if (sub.style) btn.setAttribute('style', sub.style);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onDropdownItemClick(sub, e); });\n panel.appendChild(btn);\n }\n return panel;\n }\n\n #findDropdown(name: string): ToolbarDropdown | null {\n for (const group of this.#controller.groups) {\n for (const item of group.items) {\n if (item.type === 'dropdown' && item.name === name) {\n return item;\n }\n }\n }\n return null;\n }\n\n // === Event handlers ===\n\n #onButtonClick(item: ToolbarButton, event: MouseEvent): void {\n if (this.#controller.openDropdown) {\n this.closeDropdown();\n }\n\n if (item.emitEvent) {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest<HTMLElement>('.dm-toolbar-button') ?? target ?? undefined;\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n return;\n }\n\n this.#controller.executeCommand(item);\n\n // Refocus editor so caret stays visible (mousedown.preventDefault holds\n // focus on mouse path; keyboard activations need explicit refocus).\n refocusEditorAfterCommand(this.#editor.view);\n }\n\n #onDropdownToggle(dd: ToolbarDropdown): void {\n const wasOpen = this.#controller.openDropdown === dd.name;\n if (wasOpen) {\n this.closeDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: dd.name } }));\n return;\n }\n\n // Close any prior dropdown before opening new one (controller does this\n // via toggleDropdown internally too, but emit close event explicitly)\n if (this.#controller.openDropdown) {\n const prev = this.#controller.openDropdown;\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n }\n\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#controller.toggleDropdown(dd.name);\n }\n\n #onDropdownItemClick(item: ToolbarButton, event: MouseEvent): void {\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 this.closeDropdown();\n\n if (item.emitEvent) {\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n } else {\n this.#controller.executeCommand(item);\n }\n\n refocusEditorAfterCommand(this.#editor.view);\n }\n\n #onButtonFocus(name: string): void {\n const index = this.#controller.getFlatIndex(name);\n if (index >= 0) {\n this.#controller.setFocusedIndex(index);\n }\n }\n\n // === Keyboard navigation ===\n\n #onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.#controller.navigateNext();\n this.#focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.#controller.navigatePrev();\n this.#focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (this.#controller.openDropdown) {\n this.#focusDropdownItem(1);\n } else {\n const btn = document.activeElement;\n if (btn instanceof HTMLElement && btn.getAttribute('aria-haspopup') && this.host.contains(btn)) {\n btn.click();\n requestAnimationFrame(() => { this.#focusDropdownItem(0, true); });\n }\n }\n break;\n }\n case 'ArrowUp':\n event.preventDefault();\n if (this.#controller.openDropdown) {\n this.#focusDropdownItem(-1);\n }\n break;\n case 'Home':\n event.preventDefault();\n this.#controller.navigateFirst();\n this.#focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n this.#controller.navigateLast();\n this.#focusCurrentButton();\n break;\n case 'Escape':\n if (this.#controller.openDropdown) {\n event.preventDefault();\n this.closeDropdown();\n this.#focusCurrentButton();\n }\n break;\n }\n }\n\n #focusCurrentButton(): void {\n const buttons = this.host.querySelectorAll<HTMLElement>('.dm-toolbar-button');\n const btn = buttons.item(this.#controller.focusedIndex);\n btn.focus();\n }\n\n #focusDropdownItem(direction: number, first?: boolean): void {\n const panel = this.#dropdownPanelEl;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\n if (!items.length) return;\n if (first) {\n items[0]?.focus();\n return;\n }\n const current = document.activeElement;\n const idx = current instanceof HTMLElement ? items.indexOf(current) : -1;\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","import type { Editor, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\n// --- Duck-typed ProseMirror shapes (avoids instanceof across bundles) ---\n\nexport interface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\nexport interface 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\nexport interface BubbleMenuSeparator {\n type: 'separator';\n name: string;\n}\n\nexport type BubbleMenuItem = ToolbarButton | ToolbarDropdown | BubbleMenuSeparator;\n\nexport interface ItemMaps {\n itemMap: Map<string, ToolbarButton>;\n dropdownMap: Map<string, ToolbarDropdown>;\n /** Bubble defaults indexed by context name (e.g. 'text', 'codeBlock'). */\n bubbleDefaults: Map<string, BubbleMenuItem[]>;\n}\n\n/**\n * Walks `editor.toolbarItems` and indexes them by name. Dropdowns are kept\n * separately so the bubble menu can resolve them by name (e.g. text-align).\n */\nexport function buildItemMaps(editor: Editor): ItemMaps {\n const itemMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\n\n for (const item of editor.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 return {\n itemMap,\n dropdownMap,\n bubbleDefaults: buildBubbleDefaults(editor),\n };\n}\n\n/**\n * Build bubble-menu defaults keyed by `bubbleMenu` context name. Items are\n * sorted by priority (higher first) within each context, with separators\n * inserted between consecutive different `group` runs.\n */\nfunction buildBubbleDefaults(editor: Editor): Map<string, BubbleMenuItem[]> {\n const byCtx = new Map<string, ToolbarButton[]>();\n\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) {\n arr = [];\n byCtx.set(ctx, arr);\n }\n arr.push(btn);\n };\n\n for (const item of editor.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\n const result = new Map<string, BubbleMenuItem[]>();\n for (const [ctx, ctxItems] of byCtx) {\n ctxItems.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const list: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of ctxItems) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n list.push({ type: 'separator', name: `bsep-${String(sepIdx++)}` });\n }\n list.push(item);\n lastGroup = item.group;\n }\n result.set(ctx, list);\n }\n\n return result;\n}\n\n/**\n * Resolve a name array to BubbleMenuItems via the item/dropdown maps.\n * Dropdowns take priority over buttons sharing the same name. Pipe `|`\n * tokens become separator entries.\n */\nexport function resolveNames(\n names: string[],\n itemMap: Map<string, ToolbarButton>,\n dropdownMap: Map<string, ToolbarDropdown>,\n): 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 continue;\n }\n const dropdown = dropdownMap.get(name);\n if (dropdown) {\n result.push(dropdown);\n continue;\n }\n const item = itemMap.get(name);\n if (item) result.push(item);\n }\n return result;\n}\n\n/**\n * All `format`-group buttons sorted by priority (used by `context: true`\n * shorthand to show \"all format marks for this context\").\n */\nexport function getFormatItems(itemMap: Map<string, ToolbarButton>): 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/**\n * Determine the active bubble-menu context based on the selection. Returns\n * `null` when no context matches (menu should not show).\n *\n * Resolution order:\n * 1. CellSelection (`$anchorCell`) - no menu inside table cell selections\n * 2. NodeSelection (image, HR, etc.) - return the node's type name\n * 3. Empty selection - no context (caret-only)\n * 4. Inside a table cell - return 'table' (when from/to share a cell)\n * 5. `$from.parent.type.name` if listed in contexts\n * 6. 'text' if the parent allows marks\n */\nexport function detectContext(\n selection: SelectionShape,\n ctxs: Record<string, string[] | true | null>,\n): 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/**\n * Filter items by what the schema actually allows in the given context.\n * E.g. inside a `codeBlock` node, marks like Bold/Italic aren't permitted.\n *\n * Pass-through for 'text' and 'table' contexts (schema check would be\n * lossy there because marks are allowed but some items still apply).\n */\nexport function filterBySchema(\n editor: Editor,\n contextName: string,\n schemaItems: ToolbarButton[],\n): ToolbarButton[] {\n if (contextName === 'text' || contextName === 'table') return schemaItems;\n const schema = (editor.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/**\n * Detect whether `$pos` is inside a table cell (cell or header).\n */\nexport function 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","import type { Editor } from '@domternal/core';\nimport type { SelectionShape } from './itemResolver.js';\n\n/**\n * Live state for the bubble-menu trailing buttons.\n *\n * Mirrors Angular's `syncTrailingButtonsState` output. Computed per editor\n * transaction and coalesced into a single object so each transaction\n * triggers at most one 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\nexport const 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\ninterface SyncOptions {\n hasNotionColorPicker: boolean;\n hasBlockContextMenu: boolean;\n}\n\n/**\n * Compute trailing-button state for the current editor selection.\n *\n * - `isNodeSelection`: hides trailing buttons during NodeSelection (image, HR)\n * - `blockMenuButtonDisabled`: multi-block disable via `$from.before(1) !== $to.before(1)`\n * - `currentTextColorVar` / `currentBgColorVar` / `hasAnyColor`: read the\n * `textStyle` mark at cursor and project token names to CSS-var refs that\n * the theme resolves at paint time.\n */\nexport function computeTrailingState(\n editor: Editor,\n opts: SyncOptions,\n): BubbleMenuTrailingState {\n const sel = editor.state.selection as unknown as SelectionShape;\n const isNode = !!sel.node;\n\n // Multi-block disable for the \"...\" trigger\n let blockMenuDisabled = false;\n if (opts.hasBlockContextMenu) {\n const { $from, $to } = editor.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\n let textVar: string | null = null;\n let bgVar: string | null = null;\n let hasAny = false;\n if (opts.hasNotionColorPicker) {\n const mark = editor.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 return {\n isNodeSelection: isNode,\n showColorPickerButton: opts.hasNotionColorPicker,\n showBlockMenuButton: opts.hasBlockContextMenu,\n blockMenuButtonDisabled: blockMenuDisabled,\n currentTextColorVar: textVar,\n currentBgColorVar: bgVar,\n hasAnyColor: hasAny,\n };\n}\n","import {\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n positionFloatingOnce,\n refocusEditorAfterCommand,\n} from '@domternal/core';\nimport { resolveIcon } from '../shared/iconRenderer.js';\nimport type {\n Editor,\n BubbleMenuOptions,\n IconSet,\n ToolbarButton,\n ToolbarDropdown,\n PluginKey,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { createPluginKey } from '../shared/pluginKey.js';\nimport type { CustomContentOption } from '../shared/types.js';\nimport {\n buildItemMaps,\n resolveNames,\n getFormatItems,\n detectContext,\n filterBySchema,\n isInsideTableCell,\n type BubbleMenuItem,\n type ItemMaps,\n type SelectionShape,\n} from './itemResolver.js';\nimport {\n computeTrailingState,\n INITIAL_TRAILING_STATE,\n type BubbleMenuTrailingState,\n} from './trailingState.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 DomternalBubbleMenuOptions extends CustomContentOption {\n /** Editor instance the bubble menu binds to. */\n editor: Editor;\n /** Custom visibility predicate. Replaces the default (auto-detect context). */\n shouldShow?: BubbleMenuOptions['shouldShow'];\n /** Placement relative to the selection. @default 'top' */\n placement?: 'top' | 'bottom';\n /** Pixel offset from the selection edge. @default 8 */\n offset?: number;\n /** Debounce delay for position updates (ms). @default 0 */\n updateDelay?: number;\n /** Explicit item list (overrides contexts). E.g. `['bold', 'italic', '|', 'link']`. */\n items?: string[];\n /**\n * Context-aware items. Map from context name (`'text'`, `'codeBlock'`, etc.)\n * to item name list, `true` (show all format items), or `null` (no menu for\n * this context). Defaults to `defaultBubbleContexts(editor)`.\n */\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 type { BubbleMenuItem, BubbleMenuTrailingState };\n\n/**\n * `DomternalBubbleMenu` - vanilla DOM bubble menu bound to an editor.\n *\n * Mounts `createBubbleMenuPlugin` from `@domternal/core` for visibility and\n * positioning, then renders ProseMirror selection-aware buttons + dropdowns\n * inside the host element. Trailing buttons (\"A\" for Notion color picker,\n * \"...\" for block context menu) are rendered automatically when the\n * corresponding extensions are loaded.\n *\n * Re-renders are batched via `requestAnimationFrame`. DOM is rebuilt on every\n * transaction because the item list changes with context (selection moves\n * between text and code-block, for example).\n *\n * **Stable identity convention.** Trigger buttons (including the \"A\" and \"...\"\n * trailing triggers and dropdown triggers) are DESTROYED and RECREATED on\n * every transaction. Consumers that store a reference to a trigger element\n * (e.g. as a popover anchor) should:\n * - Either listen for `selectionUpdate` / `transaction` and re-resolve the\n * anchor via `host.querySelector('.dm-ncp-trigger')` on demand\n * - Or match the trigger by class + container (`closest('.dm-bubble-menu')`)\n * rather than DOM identity for purposes like toggle-on-second-click.\n *\n * @example\n * ```ts\n * import { DomternalBubbleMenu } from '@domternal/vanilla';\n *\n * const bubble = new DomternalBubbleMenu(host, { editor });\n *\n * // Custom item list:\n * new DomternalBubbleMenu(host, {\n * editor,\n * items: ['bold', 'italic', '|', 'link'],\n * });\n *\n * // Listen for state changes:\n * bubble.addEventListener('dropdownopen', (e) => {\n * console.log('opened', (e as CustomEvent<{ name: string }>).detail.name);\n * });\n *\n * bubble.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `dropdownopen` - `{ name: string }`\n * - `dropdownclose` - `{ name: string }`\n */\nexport class DomternalBubbleMenu extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n /** Current trailing-button state snapshot. */\n get trailing(): Readonly<BubbleMenuTrailingState> {\n return this.#trailing;\n }\n\n /** Currently open dropdown name (e.g. text-align), or `null`. */\n get openDropdown(): string | null {\n return this.#openDropdown;\n }\n\n #editor: Editor;\n #pluginKey: PluginKey;\n #destroyed = false;\n /** Optional consumer-provided DOM appended after default items + trailing. */\n #customContent: HTMLElement | undefined;\n\n // Configuration cached from constructor\n #shouldShowOpt: BubbleMenuOptions['shouldShow'] | undefined;\n #placement: 'top' | 'bottom';\n #offset: number;\n #updateDelay: number;\n #explicitItems: string[] | undefined;\n #explicitContexts: Record<string, string[] | true | null> | undefined;\n #icons: IconSet | undefined;\n\n // Editor-derived caches (set once in #init)\n #maps: ItemMaps | null = null;\n #hasNotionColorPicker = false;\n #hasBlockContextMenu = false;\n #effectiveContexts: Record<string, string[] | true | null> | undefined;\n #defaultItemList: BubbleMenuItem[] = [];\n #transactionHandler: (() => void) | null = null;\n\n // Live state\n #resolvedItems: BubbleMenuItem[] = [];\n #activeMap = new Map<string, boolean>();\n #disabledMap = new Map<string, boolean>();\n #trailing: BubbleMenuTrailingState = { ...INITIAL_TRAILING_STATE };\n\n // Dropdown state (text-align dropdown inside bubble menu)\n #openDropdown: string | null = null;\n #dropdownPanelEl: HTMLDivElement | null = null;\n #cleanupDropdownFloating: (() => void) | null = null;\n #dropdownAbortCtl: AbortController | null = null;\n\n #renderPending = false;\n #renderRaf = 0;\n\n constructor(host: HTMLElement, options: DomternalBubbleMenuOptions) {\n super();\n assertBrowser('DomternalBubbleMenu');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalBubbleMenu] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#bubble\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalBubbleMenu] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#shouldShowOpt = options.shouldShow;\n this.#placement = options.placement ?? 'top';\n this.#offset = options.offset ?? 8;\n this.#updateDelay = options.updateDelay ?? 0;\n this.#explicitItems = options.items;\n this.#explicitContexts = options.contexts;\n this.#icons = options.icons;\n this.#customContent = options.customContent;\n this.#pluginKey = createPluginKey('vanillaBubbleMenu');\n\n // Host setup\n this.host.classList.add('dm-bubble-menu');\n this.host.setAttribute('role', 'toolbar');\n this.host.setAttribute('aria-label', 'Text formatting');\n\n this.#init();\n }\n\n // === Public API ===\n\n /**\n * Emit `notionColorOpen` with the given anchor element. Listened to by\n * `DomternalNotionColorPicker` (Phase 4) which positions its panel against\n * the anchor. Typically called by the wrapper's internal \"A\" trigger but\n * exposed publicly for power users with custom UIs.\n */\n openColorPicker(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n (this.#editor.emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n }\n\n /**\n * Open the block context menu against the cursor's containing block.\n * Dispatches `dm:block-context-menu-open` on `.dm-editor`. The\n * `BlockContextMenu` extension listens and positions itself against the\n * provided anchor.\n *\n * Walks one level up when the cursor's textblock is not a direct doc\n * child (e.g. cursor in `listItem > paragraph` targets the `listItem`),\n * so \"Delete\" / \"Turn into\" operate on the visual block.\n */\n openBlockContextMenu(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n const $from = this.#editor.state.selection.$from;\n if ($from.depth < 1) return;\n const depth =\n $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 = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(\n new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }),\n );\n }\n\n /**\n * Replace the explicit item list. When `undefined`, falls back to\n * context-aware resolution (per `contexts` or `defaultBubbleContexts`).\n * Re-renders on next transaction; call manually if needed:\n * `editor.dispatch(editor.state.tr)` to force an immediate re-resolve.\n */\n setItems(items: string[] | undefined): void {\n if (this.#destroyed) return;\n this.#explicitItems = items;\n // Recompute the static default list (used when contexts are disabled).\n if (this.#maps) {\n this.#defaultItemList = items\n ? resolveNames(items, this.#maps.itemMap, this.#maps.dropdownMap)\n : resolveNames(['bold', 'italic', 'underline'], this.#maps.itemMap, this.#maps.dropdownMap);\n }\n this.#updateResolvedItems();\n this.#updateStates();\n this.#scheduleRender();\n }\n\n /**\n * Replace context map. When `undefined`, defaults to\n * `defaultBubbleContexts(editor)`. Note: `shouldShow` is baked into the\n * plugin at construction; this only changes WHICH items render once the\n * menu is visible.\n */\n setContexts(contexts: Record<string, string[] | true | null> | undefined): void {\n if (this.#destroyed) return;\n this.#explicitContexts = contexts;\n this.#effectiveContexts =\n contexts ?? (this.#explicitItems ? undefined : defaultBubbleContexts(this.#editor));\n this.#updateResolvedItems();\n this.#updateStates();\n this.#scheduleRender();\n }\n\n /** Replace the icon set. `undefined` restores default Phosphor icons. */\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#icons = icons;\n this.#scheduleRender();\n }\n\n /** Close any open dropdown (text-align). No-op if nothing is open. */\n closeDropdown(): void {\n if (this.#openDropdown === null) return;\n const prev = this.#openDropdown;\n this.#openDropdown = null;\n this.#detachDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n this.#scheduleRender();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#detachDropdown();\n\n if (this.#transactionHandler) {\n this.#editor.off('transaction', this.#transactionHandler);\n this.#transactionHandler = null;\n }\n if (!this.#editor.isDestroyed) {\n this.#editor.unregisterPlugin(this.#pluginKey);\n }\n\n this.host.replaceChildren();\n }\n\n // === Init ===\n\n #init(): void {\n const ed = this.#editor;\n if (ed.isDestroyed) return;\n\n // Cache extension presence (immutable per editor lifetime)\n const exts = ed.extensionManager.extensions;\n this.#hasNotionColorPicker = exts.some((e) => e.name === 'notionColorPicker');\n this.#hasBlockContextMenu = exts.some((e) => e.name === 'blockContextMenu');\n\n // Build item maps + bubble defaults\n this.#maps = buildItemMaps(ed);\n\n // Resolve effective contexts\n this.#effectiveContexts =\n this.#explicitContexts ?? (this.#explicitItems ? undefined : defaultBubbleContexts(ed));\n\n // Resolve default item list (used when contexts disabled and no NodeSelection match)\n this.#defaultItemList = this.#explicitItems\n ? resolveNames(this.#explicitItems, this.#maps.itemMap, this.#maps.dropdownMap)\n : resolveNames(['bold', 'italic', 'underline'], this.#maps.itemMap, this.#maps.dropdownMap);\n\n // Register the visibility/positioning plugin\n const shouldShow = this.#shouldShowOpt ?? this.#buildDefaultShouldShow();\n const plugin = createBubbleMenuPlugin({\n pluginKey: this.#pluginKey,\n editor: ed,\n element: this.host,\n shouldShow,\n placement: this.#placement,\n offset: this.#offset,\n updateDelay: this.#updateDelay,\n });\n ed.registerPlugin(plugin);\n\n // Initial item resolution + state sync\n this.#updateResolvedItems();\n this.#updateStates();\n this.#trailing = computeTrailingState(ed, {\n hasNotionColorPicker: this.#hasNotionColorPicker,\n hasBlockContextMenu: this.#hasBlockContextMenu,\n });\n\n // Transaction handler - resolves items + recomputes state per change.\n // rAF-batched render below dedups multiple consecutive transactions.\n this.#transactionHandler = (): void => {\n if (this.#destroyed) return;\n this.#updateResolvedItems();\n this.#updateStates();\n this.#trailing = computeTrailingState(ed, {\n hasNotionColorPicker: this.#hasNotionColorPicker,\n hasBlockContextMenu: this.#hasBlockContextMenu,\n });\n this.#scheduleRender();\n };\n ed.on('transaction', this.#transactionHandler);\n\n // Initial paint\n this.#render();\n }\n\n #buildDefaultShouldShow(): BubbleMenuOptions['shouldShow'] {\n const contexts = this.#effectiveContexts;\n const defaults = this.#maps?.bubbleDefaults;\n\n if (contexts) {\n return ({ state }) => {\n const ctx = detectContext(\n state.selection as unknown as SelectionShape,\n contexts,\n );\n if (!ctx) return false;\n if (ctx in contexts) {\n const val = contexts[ctx];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return defaults?.has(ctx) ?? false;\n };\n }\n\n return ({ state }) => {\n const sel = state.selection as unknown as SelectionShape;\n if (sel.empty) return false;\n if (sel.node) return defaults?.has(sel.node.type.name) ?? false;\n if (isInsideTableCell(sel.$from)) return false;\n return (\n sel.$from.parent.type.spec.marks !== '' ||\n sel.$to.parent.type.spec.marks !== ''\n );\n };\n }\n\n // === State updates (called per transaction) ===\n\n #updateResolvedItems(): void {\n if (!this.#maps) return;\n const ed = this.#editor;\n const contexts = this.#effectiveContexts;\n\n if (contexts) {\n const ctx = detectContext(\n ed.state.selection as unknown as SelectionShape,\n contexts,\n );\n if (!ctx) {\n this.#resolvedItems = [];\n return;\n }\n\n if (ctx in contexts) {\n const val = contexts[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n this.#resolvedItems = [];\n return;\n }\n if (val === true) {\n this.#resolvedItems = filterBySchema(ed, ctx, getFormatItems(this.#maps.itemMap));\n return;\n }\n if (Array.isArray(val)) {\n const resolved = resolveNames(val, this.#maps.itemMap, this.#maps.dropdownMap);\n const buttons = resolved.filter(\n (i): i is ToolbarButton => i.type !== 'separator',\n );\n const allowed = new Set(filterBySchema(ed, ctx, buttons).map((b) => b.name));\n this.#resolvedItems = resolved.filter(\n (i) => i.type === 'separator' || allowed.has(i.name),\n );\n return;\n }\n }\n this.#resolvedItems = this.#maps.bubbleDefaults.get(ctx) ?? [];\n return;\n }\n\n // No contexts mode: use NodeSelection defaults OR the static default list.\n const sel = ed.state.selection as unknown as SelectionShape;\n if (sel.node && this.#maps.bubbleDefaults.has(sel.node.type.name)) {\n this.#resolvedItems = this.#maps.bubbleDefaults.get(sel.node.type.name) ?? [];\n } else {\n this.#resolvedItems = this.#defaultItemList;\n }\n }\n\n #updateStates(): void {\n const ed = this.#editor;\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try {\n canProxy = ed.can() as unknown as Record<string, (...args: unknown[]) => boolean>;\n } catch {\n canProxy = null;\n }\n\n const trackButton = (btn: ToolbarButton): void => {\n this.#activeMap.set(btn.name, ToolbarController.resolveActive(ed as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n this.#disabledMap.set(\n btn.name,\n canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false,\n );\n } catch {\n this.#disabledMap.set(btn.name, false);\n }\n };\n\n for (const item of this.#resolvedItems) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed) return;\n this.#render();\n });\n }\n\n #render(): void {\n // Bubble menu items change with selection context, so we rebuild DOM\n // every render. The cost is small (typically <10 buttons) and keeps\n // the logic straightforward vs incremental diff.\n this.host.replaceChildren();\n\n // The dropdown panel was a child of host - replaceChildren() removed it.\n // Detach our floating + AbortController state but KEEP `#openDropdown`\n // name so `#createDropdownTrigger` re-creates the panel when it encounters\n // the matching item below. Without this preservation, clicking a dropdown\n // trigger (which sets openDropdown then calls #render) would immediately\n // see the panel orphaned and close.\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = null;\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = null;\n this.#dropdownPanelEl = null;\n\n // If the open dropdown is no longer in resolvedItems (e.g. selection\n // moved to a context that doesn't show it), clear the flag.\n if (this.#openDropdown !== null) {\n const stillExists = this.#resolvedItems.some(\n (item) => item.type === 'dropdown' && item.name === this.#openDropdown,\n );\n if (!stillExists) this.#openDropdown = null;\n }\n\n for (const item of this.#resolvedItems) {\n if (item.type === 'separator') {\n this.host.appendChild(this.#createSeparator(item.name));\n } else if (item.type === 'dropdown') {\n this.host.appendChild(this.#createDropdownTrigger(item));\n } else {\n this.host.appendChild(this.#createButton(item));\n }\n }\n\n // Trailing buttons (gated on extension presence + not NodeSelection)\n const t = this.#trailing;\n if (t.showColorPickerButton && !t.isNodeSelection) {\n this.host.appendChild(this.#createSeparator('trailing-sep-color'));\n this.host.appendChild(this.#createColorTrigger());\n }\n if (t.showBlockMenuButton && !t.isNodeSelection) {\n this.host.appendChild(this.#createSeparator('trailing-sep-block'));\n this.host.appendChild(this.#createBlockMenuTrigger());\n }\n\n // Consumer-provided customContent: appended LAST so it sits after the\n // default items + trailing. The wrapper does not own its lifecycle - its\n // event listeners survive each render because the same DOM reference is\n // re-appended (DOM listeners attach to nodes, not parents).\n if (this.#customContent) {\n this.host.appendChild(this.#customContent);\n }\n }\n\n #createSeparator(name: string): HTMLSpanElement {\n const sep = document.createElement('span');\n sep.className = 'dm-toolbar-separator';\n sep.setAttribute('role', 'separator');\n sep.dataset['name'] = name;\n return sep;\n }\n\n #createButton(item: ToolbarButton): HTMLButtonElement {\n const isActive = this.#activeMap.get(item.name) ?? false;\n const isDisabled = this.#disabledMap.get(item.name) ?? false;\n\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n if (isActive) btn.classList.add('dm-toolbar-button--active');\n btn.disabled = isDisabled;\n btn.setAttribute('aria-label', item.label);\n btn.setAttribute('aria-pressed', String(isActive));\n btn.title = item.label;\n btn.innerHTML = resolveIcon(item.icon, this.#icons);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', (e) => { this.#onButtonClick(item, e); });\n return btn;\n }\n\n #createDropdownTrigger(dd: ToolbarDropdown): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-toolbar-dropdown-wrapper';\n wrapper.dataset['dropdownWrapper'] = dd.name;\n\n const dropdownActive = dd.items.some((sub) => this.#activeMap.get(sub.name) ?? false);\n const activeChild = dd.dynamicIcon\n ? dd.items.find((sub) => this.#activeMap.get(sub.name) ?? false)\n : undefined;\n const triggerIcon = activeChild?.icon ?? dd.icon;\n const triggerHtml = resolveIcon(triggerIcon, this.#icons) + DROPDOWN_CARET;\n\n const trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.className = 'dm-toolbar-button dm-toolbar-dropdown-trigger';\n if (dropdownActive) trigger.classList.add('dm-toolbar-button--active');\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', String(this.#openDropdown === dd.name));\n trigger.setAttribute('aria-label', dd.label);\n trigger.title = dd.label;\n trigger.dataset['dropdown'] = dd.name;\n trigger.innerHTML = triggerHtml;\n trigger.addEventListener('mousedown', (e) => { e.preventDefault(); });\n trigger.addEventListener('click', () => { this.#onDropdownToggle(dd); });\n\n wrapper.appendChild(trigger);\n\n // If this dropdown was already open (e.g. re-render preserving open state)\n // append its panel too. In practice #render closes open dropdowns first,\n // so this branch is reached only from explicit re-opens.\n if (this.#openDropdown === dd.name) {\n const panel = this.#createDropdownPanel(dd);\n wrapper.appendChild(panel);\n this.#dropdownPanelEl = panel;\n this.#attachDropdownListeners(trigger, panel);\n }\n return wrapper;\n }\n\n #createDropdownPanel(dd: ToolbarDropdown): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-toolbar-dropdown-panel';\n panel.setAttribute('role', 'menu');\n panel.setAttribute('data-dm-editor-ui', '');\n panel.dataset['dropdownPanel'] = dd.name;\n\n for (const sub of dd.items) {\n const subActive = this.#activeMap.get(sub.name) ?? false;\n const subHtml = `${resolveIcon(sub.icon, this.#icons)} ${sub.label}`;\n const subBtn = document.createElement('button');\n subBtn.type = 'button';\n subBtn.className = 'dm-toolbar-dropdown-item';\n if (subActive) subBtn.classList.add('dm-toolbar-dropdown-item--active');\n subBtn.setAttribute('role', 'menuitem');\n subBtn.setAttribute('aria-label', sub.label);\n subBtn.innerHTML = subHtml;\n subBtn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n subBtn.addEventListener('click', () => { this.#onDropdownItemClick(sub); });\n panel.appendChild(subBtn);\n }\n return panel;\n }\n\n #createColorTrigger(): HTMLButtonElement {\n const t = this.#trailing;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button dm-ncp-trigger';\n if (t.hasAnyColor) btn.classList.add('dm-toolbar-button--active');\n btn.title = 'Text and background color';\n btn.setAttribute('aria-label', 'Text and background color');\n btn.setAttribute('aria-haspopup', 'dialog');\n\n const glyph = document.createElement('span');\n glyph.className = 'dm-ncp-trigger-glyph';\n glyph.textContent = 'A';\n if (t.currentTextColorVar) glyph.style.color = t.currentTextColorVar;\n btn.appendChild(glyph);\n\n const underline = document.createElement('span');\n underline.className = 'dm-ncp-trigger-underline';\n if (t.currentBgColorVar) underline.style.backgroundColor = t.currentBgColorVar;\n btn.appendChild(underline);\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.openColorPicker(btn); });\n return btn;\n }\n\n #createBlockMenuTrigger(): HTMLButtonElement {\n const t = this.#trailing;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-toolbar-button';\n btn.disabled = t.blockMenuButtonDisabled;\n btn.title = t.blockMenuButtonDisabled\n ? 'Block actions (select within a single block)'\n : 'More options';\n btn.setAttribute('aria-label', 'More options');\n btn.setAttribute('aria-haspopup', 'menu');\n btn.innerHTML = resolveIcon('dotsThree', this.#icons);\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.openBlockContextMenu(btn); });\n return btn;\n }\n\n // === Event handlers ===\n\n #onButtonClick(item: ToolbarButton, event: MouseEvent): void {\n if (this.#openDropdown) this.closeDropdown();\n\n if (item.emitEvent) {\n const anchor =\n (event.currentTarget as HTMLElement | null) ??\n (event.target as HTMLElement | null);\n (this.#editor.emit as (e: string, d: unknown) => void)(\n item.emitEvent,\n { anchorElement: anchor },\n );\n return;\n }\n ToolbarController.executeItem(this.#editor as never, item);\n }\n\n #onDropdownToggle(dd: ToolbarDropdown): void {\n if (this.#openDropdown === dd.name) {\n this.closeDropdown();\n return;\n }\n\n // Switching from another open dropdown - emit close for the previous one.\n if (this.#openDropdown !== null) {\n const prev = this.#openDropdown;\n this.#detachDropdown();\n this.dispatchEvent(new CustomEvent('dropdownclose', { detail: { name: prev } }));\n }\n\n this.#openDropdown = dd.name;\n this.dispatchEvent(new CustomEvent('dropdownopen', { detail: { name: dd.name } }));\n // Re-render to insert the panel under the new trigger.\n this.#render();\n }\n\n #onDropdownItemClick(sub: ToolbarButton): void {\n this.closeDropdown();\n ToolbarController.executeItem(this.#editor as never, sub);\n refocusEditorAfterCommand(this.#editor.view);\n }\n\n // === Dropdown lifecycle ===\n\n #attachDropdownListeners(trigger: HTMLButtonElement, panel: HTMLDivElement): void {\n // Position the panel relative to its trigger.\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n // Scoped AbortController for outside-click / Escape / cooperative dismissal\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = new AbortController();\n const { signal } = this.#dropdownAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (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 this.closeDropdown();\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n this.closeDropdown();\n }\n },\n { signal },\n );\n\n // Cooperative dismissal - other overlays announce, we listen and close.\n // We do NOT dispatch this ourselves - the bubble menu plugin listens\n // for it and would hide, taking our trigger with it.\n const editorEl = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.addEventListener(\n 'dm:dismiss-overlays',\n () => { this.closeDropdown(); },\n { signal },\n );\n }\n\n #detachDropdown(): void {\n this.#cleanupDropdownFloating?.();\n this.#cleanupDropdownFloating = null;\n this.#dropdownAbortCtl?.abort();\n this.#dropdownAbortCtl = null;\n this.#dropdownPanelEl?.remove();\n this.#dropdownPanelEl = null;\n }\n}\n","import { FloatingMenuController, createFloatingMenuPlugin, refocusEditorAfterCommand } from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n FloatingMenuKeymap,\n FloatingMenuOptions,\n IconSet,\n PluginKey,\n} from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\nimport { createPluginKey } from '../shared/pluginKey.js';\nimport { resolveIcon } from '../shared/iconRenderer.js';\nimport type { CustomContentOption } from '../shared/types.js';\n\nexport interface DomternalFloatingMenuOptions extends CustomContentOption {\n /** Editor instance the floating menu binds to. */\n editor: Editor;\n /** Custom visibility predicate. Defaults to \"cursor at start of empty paragraph\". */\n shouldShow?: FloatingMenuOptions['shouldShow'];\n /** Pixel offset from the anchor. @default 0 */\n offset?: number;\n /** Items override (array replaces defaults; function filters/reorders). */\n items?: FloatingMenuItemsOverride;\n /** Keyboard shortcuts for entering the menu. */\n keymap?: FloatingMenuKeymap;\n /** Icon set override. Falls back to `defaultIcons` per key. */\n icons?: IconSet;\n /**\n * When `true`, the menu opens ONLY via explicit trigger (`showFloatingMenu`\n * call, typically from BlockHandle's `+` button). Pressing Enter to make\n * a new empty paragraph does NOT auto-show the menu. Notion-style behavior.\n * @default false\n */\n requireExplicitTrigger?: boolean;\n}\n\n/**\n * `DomternalFloatingMenu` - vanilla DOM block-insert menu bound to an editor.\n *\n * Renders the editor's `floatingMenuItems` (collected via extensions'\n * `addFloatingMenuItems()` hook) in groups, with roving-tabindex keyboard\n * navigation and `requireExplicitTrigger` support for Notion-style flow.\n *\n * Mounts `createFloatingMenuPlugin` from `@domternal/core`\n * for visibility + positioning. The plugin moves the host element inside\n * `.dm-editor` automatically so it scrolls with the editor.\n *\n * @example\n * ```ts\n * import { DomternalFloatingMenu } from '@domternal/vanilla';\n *\n * // Classic: auto-shows on every empty paragraph\n * new DomternalFloatingMenu(host, { editor });\n *\n * // Notion-style: only opens via \"+\" button or `showFloatingMenu(view)`\n * new DomternalFloatingMenu(host, { editor, requireExplicitTrigger: true });\n * ```\n */\nexport class DomternalFloatingMenu extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n /**\n * Underlying controller. Exposed for power-user introspection.\n *\n * `null` when `customContent` is provided (consumer owns rendering, and\n * therefore the item-state machine). Use the `editor.floatingMenuItems`\n * direct API in that case.\n */\n get controller(): FloatingMenuController | null {\n return this.#controller;\n }\n\n #editor: Editor;\n #pluginKey: PluginKey;\n #controller: FloatingMenuController | null = null;\n #icons: IconSet | undefined;\n #abortCtl = new AbortController();\n #destroyed = false;\n /** When `customContent` is provided, we skip controller + default render. */\n #hasCustomContent = false;\n\n #renderPending = false;\n #renderRaf = 0;\n\n constructor(host: HTMLElement, options: DomternalFloatingMenuOptions) {\n super();\n assertBrowser('DomternalFloatingMenu');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalFloatingMenu] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#floating\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalFloatingMenu] options.editor is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#icons = options.icons;\n this.#pluginKey = createPluginKey('vanillaFloatingMenu');\n\n // Host setup\n this.host.classList.add('dm-floating-menu');\n this.host.setAttribute('role', 'menu');\n this.host.setAttribute('aria-label', 'Insert block');\n this.host.setAttribute('data-dm-editor-ui', '');\n\n // Register the visibility/positioning plugin\n const plugin = createFloatingMenuPlugin({\n pluginKey: this.#pluginKey,\n editor: this.#editor,\n element: this.host,\n ...(options.shouldShow !== undefined && { shouldShow: options.shouldShow }),\n offset: options.offset ?? 0,\n ...(options.keymap !== undefined && { keymap: options.keymap }),\n ...(options.requireExplicitTrigger !== undefined && {\n requireExplicitTrigger: options.requireExplicitTrigger,\n }),\n });\n this.#editor.registerPlugin(plugin);\n\n // customContent path: consumer owns rendering entirely. Plugin handles\n // visibility/positioning; we skip controller + default rendering + key\n // nav (consumer wires their own). Matches Vue's `hasCustomSlot` branch.\n if (options.customContent) {\n this.#hasCustomContent = true;\n this.host.appendChild(options.customContent);\n return;\n }\n\n // Default rendering path: spin up controller + key nav + initial paint.\n this.#controller = new FloatingMenuController(\n this.#editor,\n () => { this.#scheduleRender(); },\n options.items,\n );\n this.#controller.subscribe();\n\n this.host.addEventListener(\n 'keydown',\n (e) => { this.#onKeyDown(e); },\n { signal: this.#abortCtl.signal },\n );\n\n this.#render();\n }\n\n /**\n * Swap the icon set. Re-renders to refresh button SVGs. No-op when\n * `customContent` is in use (consumer renders their own icons).\n */\n setIcons(icons: IconSet | undefined): void {\n if (this.#destroyed) return;\n this.#icons = icons;\n if (!this.#hasCustomContent) this.#scheduleRender();\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n cancelAnimationFrame(this.#renderRaf);\n this.#abortCtl.abort();\n this.#controller?.destroy();\n\n if (!this.#editor.isDestroyed) {\n this.#editor.unregisterPlugin(this.#pluginKey);\n }\n\n this.host.replaceChildren();\n }\n\n // === Render ===\n\n #scheduleRender(): void {\n if (this.#renderPending || this.#hasCustomContent) return;\n this.#renderPending = true;\n this.#renderRaf = requestAnimationFrame(() => {\n this.#renderPending = false;\n if (this.#destroyed || !this.#controller) return;\n this.#render();\n // After paint, focus the active item if the menu has keyboard focus\n const focusedIdx = this.#controller.focusedIndex;\n if (focusedIdx >= 0) {\n queueMicrotask(() => {\n const target = this.host.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(focusedIdx)}\"]`,\n );\n target?.focus();\n });\n }\n });\n }\n\n #render(): void {\n if (!this.#controller) return;\n this.host.replaceChildren();\n const groups = this.#controller.groups;\n const focusedIdx = this.#controller.focusedIndex;\n\n let flatIndex = 0;\n groups.forEach((group, gi) => {\n if (group.name) {\n const label = document.createElement('div');\n label.className = 'dm-floating-menu-group-label';\n label.id = `dm-fm-g${String(gi)}`;\n label.textContent = group.name;\n this.host.appendChild(label);\n }\n\n const groupEl = document.createElement('div');\n groupEl.className = 'dm-floating-menu-group';\n groupEl.setAttribute('role', 'group');\n if (group.name) groupEl.setAttribute('aria-labelledby', `dm-fm-g${String(gi)}`);\n\n for (const item of group.items) {\n const currentFlat = flatIndex;\n flatIndex += 1;\n const btn = this.#createItem(item, currentFlat, focusedIdx);\n groupEl.appendChild(btn);\n }\n\n this.host.appendChild(groupEl);\n });\n }\n\n #createItem(\n item: FloatingMenuItem,\n flatIndex: number,\n focusedIndex: number,\n ): HTMLButtonElement {\n const disabled = this.#controller?.isDisabled(item) ?? false;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-floating-menu-item';\n btn.setAttribute('role', 'menuitem');\n btn.dataset['floatingMenuItem'] = item.name;\n btn.dataset['floatingMenuIndex'] = String(flatIndex);\n btn.tabIndex = this.#tabIndexFor(flatIndex, focusedIndex);\n if (disabled) btn.setAttribute('aria-disabled', 'true');\n if (item.shortcut) btn.setAttribute('aria-keyshortcuts', item.shortcut);\n btn.disabled = disabled;\n\n if (item.icon) {\n const iconHtml = resolveIcon(item.icon, this.#icons);\n if (iconHtml) {\n const iconSpan = document.createElement('span');\n iconSpan.className = 'dm-floating-menu-item-icon';\n iconSpan.setAttribute('aria-hidden', 'true');\n iconSpan.innerHTML = iconHtml;\n btn.appendChild(iconSpan);\n }\n }\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'dm-floating-menu-item-label';\n labelSpan.textContent = item.label;\n btn.appendChild(labelSpan);\n\n if (item.shortcut) {\n const shortcutSpan = document.createElement('span');\n shortcutSpan.className = 'dm-floating-menu-item-shortcut';\n shortcutSpan.setAttribute('aria-hidden', 'true');\n shortcutSpan.textContent = item.shortcut;\n btn.appendChild(shortcutSpan);\n }\n\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#onItemClick(item); });\n return btn;\n }\n\n /**\n * Roving tabindex: focused item gets 0; when no item focused, first item\n * gets 0 (so tab traversal from outside lands naturally on the menu).\n */\n #tabIndexFor(flat: number, focused: number): 0 | -1 {\n if (flat === focused) return 0;\n if (focused < 0 && flat === 0) return 0;\n return -1;\n }\n\n // === Event handlers ===\n\n #onItemClick(item: FloatingMenuItem): void {\n if (this.#destroyed || !this.#controller) return;\n this.#controller.execute(item);\n refocusEditorAfterCommand(this.#editor.view);\n }\n\n #onKeyDown(event: KeyboardEvent): void {\n if (!this.#controller) return;\n const focused = this.#controller.focusedItem();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.#controller.next();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.#controller.prev();\n break;\n case 'Home':\n event.preventDefault();\n this.#controller.first();\n break;\n case 'End':\n event.preventDefault();\n this.#controller.last();\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.#controller.leaveMenu();\n this.#editor.view.focus();\n break;\n case 'Enter':\n case ' ':\n if (focused) {\n event.preventDefault();\n this.#onItemClick(focused);\n }\n break;\n default:\n break;\n }\n }\n}\n","import { positionFloating } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\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 DomternalNotionColorPickerOptions {\n /** The editor instance the picker binds to. */\n editor: Editor;\n}\n\n/**\n * `DomternalNotionColorPicker` - vanilla DOM Notion-style color picker.\n *\n * Listens for the `notionColorOpen` editor event (emitted by the bubble menu's\n * \"A\" trigger) and renders an inline panel positioned against the trigger.\n * Two sections (Text color / Background color), each with a 5-column grid of\n * named-token swatches plus a default reset swatch.\n *\n * The panel is appended into the `.dm-editor` host so CSS variables\n * (`--dm-block-text-{token}`, `--dm-block-bg-{token}`) cascade naturally\n * from the editor's theme scope. **Requires the editor view to be inside a\n * `.dm-editor` host** (matches `@domternal/theme` convention). When that\n * ancestor is missing the picker silently no-ops on open.\n *\n * Unlike other `@domternal/vanilla` components, this class does NOT take a\n * `host` element argument - it auto-resolves the `.dm-editor` parent. The\n * resolved host is exposed via the `host` getter for power-user inspection.\n *\n * @example\n * ```ts\n * import { DomternalNotionColorPicker } from '@domternal/vanilla';\n *\n * const picker = new DomternalNotionColorPicker({ editor });\n *\n * // picker.open(anchor) opens programmatically; usually called by the\n * // bubble menu's \"A\" trigger via the `notionColorOpen` editor event.\n *\n * picker.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `openchange` - `{ isOpen: boolean }`\n * - `apply` - `{ kind: 'text' | 'bg', token: string | null }`\n */\nexport class DomternalNotionColorPicker extends EventTarget {\n /** The picker's panel element (created on first open, persistent for reuse). */\n get panel(): HTMLDivElement | null {\n return this.#panel;\n }\n\n /**\n * The `.dm-editor` host into which the panel mounts. Auto-resolved from\n * `editor.view.dom.closest('.dm-editor')`. Returns `null` when the editor\n * view is not inside a `.dm-editor` ancestor (in which case the picker\n * silently no-ops on `open()`).\n */\n get host(): HTMLElement | null {\n return this.#host;\n }\n\n get editor(): Editor {\n return this.#editor;\n }\n\n get isOpen(): boolean {\n return this.#isOpen;\n }\n\n get currentTextToken(): string | null {\n return this.#currentTextToken;\n }\n\n get currentBgToken(): string | null {\n return this.#currentBgToken;\n }\n\n get palette(): readonly string[] {\n return this.#palette;\n }\n\n #editor: Editor;\n #destroyed = false;\n\n #isOpen = false;\n #anchor: HTMLElement | null = null;\n /**\n * Bubble menu container captured when the picker was opened against an\n * anchor inside the bubble menu. Used by the virtual reference to re-resolve\n * `.dm-ncp-trigger` when the bubble menu rebuilds its DOM on transactions\n * and the original anchor element becomes disconnected. Null when the\n * picker was opened from a custom UI outside the bubble menu.\n */\n #anchorBubbleMenu: HTMLElement | null = null;\n /** Last computed anchor rect; used as a fallback when no live anchor can be resolved. */\n #lastAnchorRect: DOMRect | null = null;\n #host: HTMLElement | null = null;\n #panel: HTMLDivElement | null = null;\n #currentTextToken: string | null = null;\n #currentBgToken: string | null = null;\n #palette: readonly string[] = [];\n\n #onOpen: ((...args: unknown[]) => void) | null = null;\n #onSelectionUpdate: (() => void) | null = null;\n /** Global listeners (mousedown + keydown + selectionUpdate) bound while open. */\n #openAbortCtl: AbortController | null = null;\n #cleanupFloating: (() => void) | null = null;\n #rafIds: number[] = [];\n\n constructor(options: DomternalNotionColorPickerOptions) {\n super();\n assertBrowser('DomternalNotionColorPicker');\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalNotionColorPicker] options.editor is required.');\n }\n\n this.#editor = options.editor;\n this.#host = this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n\n // Read palette from extension options (immutable per editor lifetime)\n const ext = this.#editor.extensionManager.extensions.find(\n (e) => e.name === 'notionColorPicker',\n );\n const extOpts = (ext?.options ?? null) as NotionColorPickerExtensionOptions | null;\n this.#palette = extOpts?.palette ? [...extOpts.palette] : [];\n\n // Subscribe to editor events (not AbortSignal-aware; explicit off in destroy).\n // Toggle logic lives in `open()` so the public API and event handler\n // behave identically for same-anchor re-opens.\n this.#onOpen = (...args: unknown[]): void => {\n const detail = args[0] as NotionColorOpenDetail | undefined;\n const incoming = detail?.anchorElement;\n if (!incoming) return;\n this.open(incoming);\n };\n this.#onSelectionUpdate = (): void => {\n if (!this.#isOpen) return;\n // Anchor vanished (bubble menu hidden by selection change). Close defensively.\n // Matches commit fbef072 which brought this defense to Angular too.\n if (!this.#anchor?.isConnected) {\n this.close();\n return;\n }\n if (this.#editor.state.selection.empty) {\n this.close();\n } else {\n // Selection moved but stays non-empty - refresh active state.\n this.#syncFromSelection();\n this.#updateActiveClasses();\n }\n };\n this.#editor.on('notionColorOpen', this.#onOpen);\n this.#editor.on('selectionUpdate', this.#onSelectionUpdate);\n }\n\n // === Public API ===\n\n /**\n * Open the picker against the given anchor element. Typically called\n * implicitly via the `notionColorOpen` editor event, but exposed publicly\n * for power users who emit the open from custom UI.\n *\n * Toggle semantics: calling `open(anchor)` with the SAME anchor while the\n * picker is already open closes the picker (with refocus). Calling with a\n * different anchor re-anchors against the new element.\n */\n open(anchor: HTMLElement): void {\n if (this.#destroyed) return;\n // Toggle: same-anchor click while open closes (mirrors bubble menu \"A\"\n // button click-to-close behaviour). We accept BOTH exact DOM identity\n // OR class-based identity (`.dm-ncp-trigger`) because the bubble menu\n // rebuilds its trigger button on every transaction - the new instance\n // is a different DOM node but logically the same trigger.\n if (this.#isOpen && this.#isSameTrigger(anchor)) {\n this.close({ refocus: true });\n return;\n }\n // Lazy host resolution - in case editor view wasn't in DOM at construction.\n this.#host ??= this.#editor.view.dom.closest<HTMLElement>('.dm-editor');\n this.#anchor = anchor;\n // Capture bubble menu container if anchor lives inside one. Stored\n // separately because the anchor element itself may get disconnected when\n // the bubble menu rebuilds; the container element is stable.\n this.#anchorBubbleMenu = anchor.closest<HTMLElement>('.dm-bubble-menu');\n this.#lastAnchorRect = anchor.getBoundingClientRect();\n this.#syncFromSelection();\n this.#isOpen = true;\n this.#setStorageOpen(true);\n this.#renderOrUpdatePanel();\n this.#positionAndFocus();\n this.#attachGlobalListeners();\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: true } }));\n }\n\n /**\n * Close the picker. When `refocus` is `true`, returns focus to the editor\n * view (NOT the anchor button - the anchor is on the bubble menu which\n * vanishes on focus return).\n */\n close(opts: { refocus?: boolean } = {}): void {\n if (!this.#isOpen) return;\n this.#isOpen = false;\n this.#setStorageOpen(false);\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#cancelPendingRafs();\n if (this.#panel) {\n this.#panel.remove();\n // Keep `#panel` for reuse on next open; just detach from DOM.\n }\n this.#anchor = null;\n this.#anchorBubbleMenu = null;\n this.#lastAnchorRect = null;\n if (opts.refocus && !this.#editor.isDestroyed) {\n this.#editor.view.focus();\n }\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: false } }));\n }\n\n /** Apply a text color token to the current selection. Picker stays open. */\n applyText(token: string | null): void {\n if (this.#destroyed) return;\n (this.#editor.commands as unknown as {\n setTextColorToken: (t: string | null) => boolean;\n }).setTextColorToken(token);\n this.#syncFromSelection();\n this.#updateActiveClasses();\n this.dispatchEvent(\n new CustomEvent('apply', { detail: { kind: 'text', token } }),\n );\n }\n\n /** Apply a background color token to the current selection. Picker stays open. */\n applyBg(token: string | null): void {\n if (this.#destroyed) return;\n (this.#editor.commands as unknown as {\n setBackgroundColorToken: (t: string | null) => boolean;\n }).setBackgroundColorToken(token);\n this.#syncFromSelection();\n this.#updateActiveClasses();\n this.dispatchEvent(\n new CustomEvent('apply', { detail: { kind: 'bg', token } }),\n );\n }\n\n /** Display label for a palette token (title-case fallback). */\n tokenLabel(token: string): string {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#cancelPendingRafs();\n\n if (this.#onOpen) {\n this.#editor.off('notionColorOpen', this.#onOpen);\n this.#onOpen = null;\n }\n if (this.#onSelectionUpdate) {\n this.#editor.off('selectionUpdate', this.#onSelectionUpdate);\n this.#onSelectionUpdate = null;\n }\n if (this.#isOpen) this.#setStorageOpen(false);\n this.#panel?.remove();\n this.#panel = null;\n this.#isOpen = false;\n this.#anchor = null;\n this.#anchorBubbleMenu = null;\n this.#lastAnchorRect = null;\n }\n\n // === Internal ===\n\n /**\n * Test whether the incoming anchor is functionally the same trigger as\n * the currently stored anchor.\n *\n * - Exact DOM identity is preferred (cheap + unambiguous).\n * - Fallback: both anchors are `.dm-ncp-trigger` buttons inside the SAME\n * `.dm-bubble-menu` host. The bubble menu rebuilds its trigger button\n * on every transaction (new DOM node, same logical trigger), so the\n * ancestor check lets toggle-on-second-click work across rebuilds\n * without conflating with custom triggers in other host elements.\n */\n #isSameTrigger(incoming: HTMLElement): boolean {\n if (this.#anchor === incoming) return true;\n if (!incoming.classList.contains('dm-ncp-trigger')) return false;\n if (!(this.#anchor?.classList.contains('dm-ncp-trigger') ?? false)) return false;\n const currentBubble = this.#anchor?.closest('.dm-bubble-menu') ?? null;\n const incomingBubble = incoming.closest('.dm-bubble-menu');\n return currentBubble !== null && currentBubble === incomingBubble;\n }\n\n /**\n * Inspect the current selection and update the active text/bg tokens.\n * Empty selection: read stored marks. Non-empty: walk text nodes (because\n * `$from.nodeAfter` can land on a block at boundary positions).\n */\n #syncFromSelection(): void {\n const { selection } = this.#editor.state;\n let mark: { attrs: Record<string, unknown> } | null = null;\n\n if (selection.empty) {\n mark =\n selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n this.#editor.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 {\n colorToken?: string | null;\n backgroundColorToken?: string | null;\n };\n this.#currentTextToken = attrs.colorToken ?? null;\n this.#currentBgToken = attrs.backgroundColorToken ?? null;\n }\n\n #setStorageOpen(open: boolean): void {\n const slot = this.#editor.storage['notionColorPicker'];\n if (slot && typeof slot === 'object') {\n (slot as NotionColorPickerStorage).isOpen = open;\n }\n }\n\n #renderOrUpdatePanel(): void {\n if (!this.#host) return;\n if (!this.#panel) {\n this.#panel = this.#createPanel();\n } else {\n // Refresh content (active classes) in case panel was reused.\n this.#panel.replaceChildren(...this.#renderSections());\n }\n // Append (or re-append) panel to host\n this.#host.appendChild(this.#panel);\n }\n\n #createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-notion-color-picker';\n panel.setAttribute('data-show', '');\n panel.setAttribute('data-dm-editor-ui', '');\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Text and background color');\n panel.setAttribute('aria-modal', 'false');\n panel.addEventListener('keydown', (e) => { this.#onPanelKeydown(e); });\n panel.append(...this.#renderSections());\n return panel;\n }\n\n #renderSections(): Node[] {\n return [\n this.#createSection({\n label: 'Text color',\n variant: 'text',\n activeToken: this.#currentTextToken,\n onApply: (t) => { this.applyText(t); },\n }),\n this.#createSection({\n label: 'Background color',\n variant: 'bg',\n activeToken: this.#currentBgToken,\n onApply: (t) => { this.applyBg(t); },\n }),\n ];\n }\n\n #createSection(opts: {\n label: string;\n variant: 'text' | 'bg';\n activeToken: string | null;\n onApply: (token: string | null) => void;\n }): HTMLDivElement {\n const section = document.createElement('div');\n section.className = 'dm-ncp-section';\n\n const heading = document.createElement('div');\n heading.className = 'dm-ncp-label';\n heading.textContent = opts.label;\n section.appendChild(heading);\n\n const grid = document.createElement('div');\n grid.className = 'dm-ncp-grid';\n\n // Default swatch (null token)\n grid.appendChild(\n this.#createSwatch({\n token: null,\n variant: opts.variant,\n label: opts.variant === 'text' ? 'Default text color' : 'Default background',\n activeToken: opts.activeToken,\n onApply: opts.onApply,\n }),\n );\n\n // Named token swatches\n for (const t of this.#palette) {\n const label =\n opts.variant === 'text'\n ? `${this.tokenLabel(t)} text`\n : `${this.tokenLabel(t)} background`;\n grid.appendChild(\n this.#createSwatch({\n token: t,\n variant: opts.variant,\n label,\n activeToken: opts.activeToken,\n onApply: opts.onApply,\n }),\n );\n }\n\n section.appendChild(grid);\n return section;\n }\n\n #createSwatch(opts: {\n token: string | null;\n variant: 'text' | 'bg';\n label: string;\n activeToken: string | null;\n onApply: (token: string | null) => void;\n }): HTMLButtonElement {\n const swatch = document.createElement('button');\n swatch.type = 'button';\n swatch.className = `dm-ncp-swatch dm-ncp-swatch--${opts.variant}`;\n if (opts.activeToken === opts.token) swatch.classList.add('dm-ncp-active');\n swatch.setAttribute('aria-pressed', String(opts.activeToken === opts.token));\n swatch.dataset['color'] = opts.token ?? 'null';\n swatch.title =\n opts.token === null\n ? (opts.variant === 'text' ? 'Default text color' : 'Default background')\n : this.tokenLabel(opts.token);\n swatch.setAttribute('aria-label', opts.label);\n swatch.addEventListener('mousedown', (e) => { e.preventDefault(); });\n swatch.addEventListener('click', () => { opts.onApply(opts.token); });\n return swatch;\n }\n\n /** Update only active-class state without rebuilding DOM. */\n #updateActiveClasses(): void {\n if (!this.#panel) return;\n const textSwatches = Array.from(\n this.#panel.querySelectorAll<HTMLButtonElement>('.dm-ncp-swatch--text'),\n );\n const bgSwatches = Array.from(\n this.#panel.querySelectorAll<HTMLButtonElement>('.dm-ncp-swatch--bg'),\n );\n for (const sw of textSwatches) {\n const token = sw.dataset['color'] === 'null' ? null : (sw.dataset['color'] ?? null);\n const isActive = token === this.#currentTextToken;\n sw.classList.toggle('dm-ncp-active', isActive);\n sw.setAttribute('aria-pressed', String(isActive));\n }\n for (const sw of bgSwatches) {\n const token = sw.dataset['color'] === 'null' ? null : (sw.dataset['color'] ?? null);\n const isActive = token === this.#currentBgToken;\n sw.classList.toggle('dm-ncp-active', isActive);\n sw.setAttribute('aria-pressed', String(isActive));\n }\n }\n\n /**\n * Position + two-rAF focus chain. Floating-UI positions immediately; second\n * rAF waits for paint so focus doesn't race the bubble-menu blur. Focuses\n * the active swatch or falls back to the first default text swatch.\n */\n #positionAndFocus(): void {\n if (!this.#anchor || !this.#panel) return;\n this.#cleanupFloating?.();\n // Virtual reference: re-resolves the live `.dm-ncp-trigger` inside the\n // captured bubble menu container on every position update. The vanilla\n // bubble menu rebuilds its DOM with `replaceChildren` on every editor\n // transaction, which disconnects the original anchor element; without\n // re-resolution `getBoundingClientRect` returns a zero rect and the panel\n // flies to the top-left corner. When opened from a custom UI (no bubble\n // menu container), we fall back to the stored anchor or its last known\n // rect.\n const virtualRef = {\n getBoundingClientRect: (): DOMRect => {\n if (this.#anchor?.isConnected) {\n const rect = this.#anchor.getBoundingClientRect();\n this.#lastAnchorRect = rect;\n return rect;\n }\n if (this.#anchorBubbleMenu?.isConnected) {\n const fresh = this.#anchorBubbleMenu.querySelector<HTMLElement>(\n '.dm-ncp-trigger',\n );\n if (fresh) {\n this.#anchor = fresh;\n const rect = fresh.getBoundingClientRect();\n this.#lastAnchorRect = rect;\n return rect;\n }\n }\n return this.#lastAnchorRect ?? new DOMRect(0, 0, 0, 0);\n },\n };\n this.#cleanupFloating = positionFloating(virtualRef, this.#panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n const id1 = requestAnimationFrame(() => {\n const id2 = requestAnimationFrame(() => {\n if (!this.#panel?.isConnected) return;\n const active = this.#panel.querySelector<HTMLElement>('.dm-ncp-swatch.dm-ncp-active');\n const fallback = this.#panel.querySelector<HTMLElement>(\n '.dm-ncp-swatch--text[data-color=\"null\"]',\n );\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n this.#rafIds.push(id2);\n });\n this.#rafIds.push(id1);\n }\n\n #cancelPendingRafs(): void {\n for (const id of this.#rafIds) cancelAnimationFrame(id);\n this.#rafIds = [];\n }\n\n #attachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = new AbortController();\n const { signal } = this.#openAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (this.#panel?.contains(target)) return;\n if (this.#anchor?.contains(target)) return;\n this.close();\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isOpen) {\n e.preventDefault();\n this.close({ refocus: true });\n }\n },\n { signal },\n );\n }\n\n #detachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = null;\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 #onPanelKeydown(event: KeyboardEvent): void {\n const cols = 5;\n if (!this.#panel) return;\n const swatches = Array.from(\n this.#panel.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) return;\n const idx = swatches.indexOf(active);\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","import { positionFloatingOnce } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\nimport { assertBrowser } from '../shared/isBrowser.js';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\n/** Display glyph for each top-level emoji category (matches Angular wrapper). */\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\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 DomternalEmojiPickerOptions {\n /** The editor instance the picker binds to. */\n editor: Editor;\n /** Full emoji set with `{ emoji, name, group }` entries. Required. */\n emojis: EmojiPickerItem[];\n}\n\n/**\n * `DomternalEmojiPicker` - vanilla DOM emoji picker.\n *\n * Listens for the `insertEmoji` editor event (emitted by the toolbar's emoji\n * trigger or via custom code) and renders a panel with search input, category\n * tabs, and an 8-column grid of swatches. Frequently-used emojis come from\n * the `Emoji` extension's storage if available.\n *\n * @example\n * ```ts\n * import { DomternalEmojiPicker } from '@domternal/vanilla';\n * import { emojis } from '@domternal/extension-emoji';\n *\n * const picker = new DomternalEmojiPicker(host, { editor, emojis });\n *\n * // picker.open(anchor) opens programmatically; usually triggered\n * // implicitly by the `insertEmoji` editor event.\n *\n * picker.destroy();\n * ```\n *\n * **Events dispatched** (CustomEvent, `detail` shape in brackets):\n * - `openchange` - `{ isOpen: boolean }`\n * - `select` - `{ name: string; emoji: string }`\n */\nexport class DomternalEmojiPicker extends EventTarget {\n readonly host: HTMLElement;\n\n get editor(): Editor {\n return this.#editor;\n }\n\n get isOpen(): boolean {\n return this.#isOpen;\n }\n\n get searchQuery(): string {\n return this.#searchQuery;\n }\n\n get activeCategory(): string {\n return this.#activeCategory;\n }\n\n #editor: Editor;\n #emojis: EmojiPickerItem[];\n #categories: Map<string, EmojiPickerItem[]>;\n #categoryNames: string[];\n\n #destroyed = false;\n #isOpen = false;\n #searchQuery = '';\n #activeCategory = '';\n #anchor: HTMLElement | null = null;\n\n #panel: HTMLDivElement | null = null;\n #cleanupFloating: (() => void) | null = null;\n #openAbortCtl: AbortController | null = null;\n #eventHandler: ((...args: unknown[]) => void) | null = null;\n\n constructor(host: HTMLElement, options: DomternalEmojiPickerOptions) {\n super();\n assertBrowser('DomternalEmojiPicker');\n\n if (!(host instanceof HTMLElement)) {\n throw new TypeError(\n '[DomternalEmojiPicker] host must be an HTMLElement. ' +\n 'Pass a DOM node (e.g. document.querySelector(\"#emoji-host\")).',\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.editor) {\n throw new TypeError('[DomternalEmojiPicker] options.editor is required.');\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!options.emojis) {\n throw new TypeError('[DomternalEmojiPicker] options.emojis is required.');\n }\n\n this.host = host;\n this.#editor = options.editor;\n this.#emojis = options.emojis;\n\n // Group emojis by their `group` property (immutable per construction).\n this.#categories = new Map<string, EmojiPickerItem[]>();\n for (const item of this.#emojis) {\n let list = this.#categories.get(item.group);\n if (!list) {\n list = [];\n this.#categories.set(item.group, list);\n }\n list.push(item);\n }\n this.#categoryNames = [...this.#categories.keys()];\n\n this.host.classList.add('dm-emoji-picker-host');\n\n // Subscribe to insertEmoji event (not AbortSignal-aware; explicit off in destroy)\n this.#eventHandler = (...args: unknown[]): void => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n if (this.#isOpen) {\n this.close();\n return;\n }\n this.open(data?.anchorElement ?? null);\n };\n (this.#editor.on as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.#eventHandler,\n );\n }\n\n // === Public API ===\n\n /**\n * Open the picker. If `anchor` is provided, panel positions against it;\n * otherwise the panel renders un-positioned inside the host (consumer's CSS\n * responsibility).\n */\n open(anchor: HTMLElement | null): void {\n if (this.#destroyed || this.#isOpen) return;\n this.#anchor = anchor;\n this.#isOpen = true;\n this.#searchQuery = '';\n if (this.#categoryNames[0]) {\n this.#activeCategory = this.#categoryNames[0];\n }\n this.#setStorageOpen(true);\n\n this.#renderPanel();\n this.#attachGlobalListeners();\n this.#positionAndFocus();\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: true } }));\n }\n\n /**\n * Close the picker. Returns focus to the editor view (so the caret stays\n * visible). Idempotent.\n */\n close(): void {\n if (!this.#isOpen) return;\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n this.#isOpen = false;\n this.#setStorageOpen(false);\n this.#searchQuery = '';\n this.#anchor = null;\n this.#detachGlobalListeners();\n this.#panel?.remove();\n this.#panel = null;\n if (!this.#editor.isDestroyed) {\n this.#editor.view.focus();\n }\n this.dispatchEvent(new CustomEvent('openchange', { detail: { isOpen: false } }));\n }\n\n destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n this.#detachGlobalListeners();\n this.#cleanupFloating?.();\n this.#cleanupFloating = null;\n\n if (this.#eventHandler) {\n (this.#editor.off as (e: string, h: (...args: unknown[]) => void) => void)(\n 'insertEmoji',\n this.#eventHandler,\n );\n this.#eventHandler = null;\n }\n if (this.#isOpen) this.#setStorageOpen(false);\n this.#panel?.remove();\n this.#panel = null;\n this.#isOpen = false;\n }\n\n // === Internal ===\n\n /** Title-cased emoji name for tooltip/aria-label (replaces underscores). */\n #formatName(name: string): string {\n return name.replace(/_/g, ' ');\n }\n\n /** Display glyph for a category tab. Falls back to first character. */\n #categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n }\n\n #getEmojiStorage(): Record<string, unknown> | null {\n const storage = this.#editor.storage;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? null;\n }\n\n #setStorageOpen(open: boolean): void {\n const storage = this.#getEmojiStorage();\n if (storage) storage['isOpen'] = open;\n // No-op transaction so toolbar's transaction handler re-evaluates\n // `isActiveFn` and marks the emoji button as active/inactive.\n if (!this.#editor.isDestroyed) {\n this.#editor.view.dispatch(this.#editor.view.state.tr);\n }\n }\n\n #getFilteredEmojis(): EmojiPickerItem[] {\n const query = this.#searchQuery.toLowerCase();\n if (!query) return [];\n const storage = this.#getEmojiStorage();\n const searchFn = storage?.['searchEmoji'] as\n | ((q: string) => EmojiPickerItem[])\n | undefined;\n if (searchFn) return searchFn(query);\n return this.#emojis.filter(\n (item) =>\n item.name.includes(query) || item.group.toLowerCase().includes(query),\n );\n }\n\n #getFrequentlyUsed(): EmojiPickerItem[] {\n const storage = this.#getEmojiStorage();\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\n | Map<string, EmojiPickerItem>\n | undefined;\n if (!nameMap) return [];\n return names\n .slice(0, 16)\n .map((n) => nameMap.get(n))\n .filter((v): v is EmojiPickerItem => Boolean(v));\n }\n\n /** Render or refresh the picker panel inside `host`. */\n #renderPanel(): void {\n if (!this.#panel) {\n this.#panel = this.#createPanel();\n this.host.appendChild(this.#panel);\n } else {\n this.#panel.replaceChildren(...this.#renderPanelChildren());\n }\n }\n\n #createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'dm-emoji-picker';\n panel.append(...this.#renderPanelChildren());\n return panel;\n }\n\n #renderPanelChildren(): Node[] {\n return [\n this.#renderSearch(),\n this.#renderTabs(),\n this.#renderGrid(),\n ];\n }\n\n #renderSearch(): HTMLDivElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'dm-emoji-picker-search';\n const input = document.createElement('input');\n input.type = 'text';\n input.placeholder = 'Search emoji...';\n input.value = this.#searchQuery;\n input.setAttribute('aria-label', 'Search emoji');\n input.addEventListener('input', (e) => {\n this.#searchQuery = (e.target as HTMLInputElement).value;\n this.#refreshGrid();\n });\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') this.close();\n });\n wrapper.appendChild(input);\n return wrapper;\n }\n\n #renderTabs(): HTMLDivElement {\n const tabs = document.createElement('div');\n tabs.className = 'dm-emoji-picker-tabs';\n tabs.setAttribute('role', 'tablist');\n for (const cat of this.#categoryNames) {\n const tab = document.createElement('button');\n tab.type = 'button';\n tab.className = 'dm-emoji-picker-tab';\n if (this.#activeCategory === cat) {\n tab.classList.add('dm-emoji-picker-tab--active');\n }\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-selected', String(this.#activeCategory === cat));\n tab.title = cat;\n tab.setAttribute('aria-label', cat);\n tab.textContent = this.#categoryIcon(cat);\n tab.addEventListener('mousedown', (e) => { e.preventDefault(); });\n tab.addEventListener('click', () => { this.#scrollToCategory(cat); });\n tabs.appendChild(tab);\n }\n return tabs;\n }\n\n #renderGrid(): HTMLDivElement {\n const grid = document.createElement('div');\n grid.className = 'dm-emoji-picker-grid';\n grid.addEventListener('scroll', () => { this.#onGridScroll(); });\n grid.addEventListener('keydown', (e) => { this.#onGridKeydown(e); });\n\n if (this.#searchQuery) {\n const filtered = this.#getFilteredEmojis();\n if (filtered.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'dm-emoji-picker-empty';\n empty.textContent = 'No emoji found';\n grid.appendChild(empty);\n } else {\n for (const item of filtered) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n return grid;\n }\n\n // Default view: frequently used + categories\n const freq = this.#getFrequentlyUsed();\n if (freq.length) {\n const freqLabel = document.createElement('div');\n freqLabel.className = 'dm-emoji-picker-category-label';\n freqLabel.textContent = 'Frequently Used';\n grid.appendChild(freqLabel);\n for (const item of freq) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n\n for (const cat of this.#categoryNames) {\n const label = document.createElement('div');\n label.className = 'dm-emoji-picker-category-label';\n label.dataset['category'] = cat;\n label.textContent = cat;\n grid.appendChild(label);\n const items = this.#categories.get(cat) ?? [];\n for (const item of items) {\n grid.appendChild(this.#createSwatch(item));\n }\n }\n return grid;\n }\n\n #createSwatch(item: EmojiPickerItem): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'dm-emoji-swatch';\n btn.tabIndex = -1;\n btn.title = this.#formatName(item.name);\n btn.setAttribute('aria-label', this.#formatName(item.name));\n btn.textContent = item.emoji;\n btn.addEventListener('mousedown', (e) => { e.preventDefault(); });\n btn.addEventListener('click', () => { this.#selectEmoji(item); });\n return btn;\n }\n\n /**\n * Update `searchQuery` field AND sync the DOM input value. Centralised\n * so all callers see a consistent state - field is the source of truth\n * but the input element doesn't track it automatically.\n */\n #setSearchQuery(value: string): void {\n this.#searchQuery = value;\n const input = this.#panel?.querySelector<HTMLInputElement>(\n '.dm-emoji-picker-search input',\n );\n if (input && input.value !== value) input.value = value;\n }\n\n /** Replace grid contents only (used when searchQuery changes). */\n #refreshGrid(): void {\n if (!this.#panel) return;\n const oldGrid = this.#panel.querySelector('.dm-emoji-picker-grid');\n const newGrid = this.#renderGrid();\n oldGrid?.replaceWith(newGrid);\n }\n\n #refreshTabs(): void {\n if (!this.#panel) return;\n const oldTabs = this.#panel.querySelector('.dm-emoji-picker-tabs');\n const newTabs = this.#renderTabs();\n oldTabs?.replaceWith(newTabs);\n }\n\n #selectEmoji(item: EmojiPickerItem): void {\n const cmd = this.#editor.commands as Record<string, (...args: unknown[]) => boolean>;\n cmd['insertEmoji']?.(item.name);\n this.dispatchEvent(\n new CustomEvent('select', { detail: { name: item.name, emoji: item.emoji } }),\n );\n this.close();\n }\n\n #scrollToCategory(cat: string): void {\n // Clear search to ensure category view is rendered (not filtered)\n if (cat !== this.#activeCategory) this.#setSearchQuery('');\n this.#activeCategory = cat;\n this.#refreshTabs();\n this.#refreshGrid();\n\n // Wait for grid to be in DOM, then scroll + focus\n requestAnimationFrame(() => {\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\n if (!label) return;\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n setTimeout(() => {\n const first = label.nextElementSibling;\n if (first instanceof HTMLElement && first.classList.contains('dm-emoji-swatch')) {\n first.focus();\n }\n }, SCROLL_SETTLE_MS);\n });\n }\n\n #onGridScroll(): void {\n if (this.#searchQuery) return;\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const labels = Array.from(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'),\n );\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 !== this.#activeCategory) {\n this.#activeCategory = currentCat;\n this.#refreshTabs();\n }\n }\n\n #onGridKeydown(event: KeyboardEvent): void {\n const grid = this.#panel?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const swatches = Array.from(\n grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement;\n const idx = active instanceof HTMLElement ? swatches.indexOf(active) : -1;\n if (idx === -1) {\n // Focus is somewhere else (e.g. grid container) - 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':\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 'Enter':\n case ' ':\n event.preventDefault();\n swatches[idx]?.click();\n return;\n default:\n return;\n }\n swatches[next]?.focus();\n }\n\n #positionAndFocus(): void {\n requestAnimationFrame(() => {\n if (!this.#panel || this.#destroyed) return;\n if (this.#anchor) {\n this.#cleanupFloating?.();\n this.#cleanupFloating = positionFloatingOnce(this.#anchor, this.#panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = this.#panel.querySelector<HTMLInputElement>(\n '.dm-emoji-picker-search input',\n );\n input?.focus({ preventScroll: true });\n });\n }\n\n #attachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = new AbortController();\n const { signal } = this.#openAbortCtl;\n\n document.addEventListener(\n 'mousedown',\n (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target || !this.#isOpen) return;\n if (this.#panel?.contains(target)) return;\n if (target === this.#anchor) return;\n if (this.#anchor?.contains(target)) return;\n // Defer close so the click handler on a panel descendant fires first\n requestAnimationFrame(() => { this.close(); });\n },\n { signal },\n );\n\n document.addEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.#isOpen) {\n e.preventDefault();\n this.close();\n }\n },\n { signal },\n );\n }\n\n #detachGlobalListeners(): void {\n this.#openAbortCtl?.abort();\n this.#openAbortCtl = null;\n }\n}\n"]}