@domternal/react 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -10
- package/dist/Domternal.d.ts +7 -7
- package/dist/Domternal.d.ts.map +1 -1
- package/dist/DomternalFloatingMenu.d.ts +29 -6
- package/dist/DomternalFloatingMenu.d.ts.map +1 -1
- package/dist/EditorContent.d.ts +2 -2
- package/dist/EditorContent.d.ts.map +1 -1
- package/dist/EditorContext.d.ts +2 -4
- package/dist/EditorContext.d.ts.map +1 -1
- package/dist/bubble-menu/DomternalBubbleMenu.d.ts +2 -1
- package/dist/bubble-menu/DomternalBubbleMenu.d.ts.map +1 -1
- package/dist/bubble-menu/useBubbleMenu.d.ts +36 -6
- package/dist/bubble-menu/useBubbleMenu.d.ts.map +1 -1
- package/dist/emoji-picker/DomternalEmojiPicker.d.ts +2 -1
- package/dist/emoji-picker/DomternalEmojiPicker.d.ts.map +1 -1
- package/dist/emoji-picker/useEmojiPicker.d.ts +5 -3
- package/dist/emoji-picker/useEmojiPicker.d.ts.map +1 -1
- package/dist/index.d.ts +121 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +961 -77
- package/dist/index.js.map +1 -1
- package/dist/node-views/NodeViewContent.d.ts +2 -2
- package/dist/node-views/NodeViewContent.d.ts.map +1 -1
- package/dist/node-views/NodeViewWrapper.d.ts +2 -2
- package/dist/node-views/NodeViewWrapper.d.ts.map +1 -1
- package/dist/node-views/ReactNodeViewRenderer.d.ts +1 -1
- package/dist/node-views/ReactNodeViewRenderer.d.ts.map +1 -1
- package/dist/notion-color-picker/DomternalNotionColorPicker.d.ts +25 -0
- package/dist/notion-color-picker/DomternalNotionColorPicker.d.ts.map +1 -0
- package/dist/notion-color-picker/index.d.ts +5 -0
- package/dist/notion-color-picker/index.d.ts.map +1 -0
- package/dist/notion-color-picker/useNotionColorPicker.d.ts +47 -0
- package/dist/notion-color-picker/useNotionColorPicker.d.ts.map +1 -0
- package/dist/toolbar/DomternalToolbar.d.ts +2 -1
- package/dist/toolbar/DomternalToolbar.d.ts.map +1 -1
- package/dist/toolbar/ToolbarButton.d.ts +2 -1
- package/dist/toolbar/ToolbarButton.d.ts.map +1 -1
- package/dist/toolbar/ToolbarDropdown.d.ts +2 -1
- package/dist/toolbar/ToolbarDropdown.d.ts.map +1 -1
- package/dist/toolbar/ToolbarDropdownPanel.d.ts +2 -1
- package/dist/toolbar/ToolbarDropdownPanel.d.ts.map +1 -1
- package/dist/toolbar/useKeyboardNav.d.ts.map +1 -1
- package/dist/toolbar/useToolbarController.d.ts +6 -4
- package/dist/toolbar/useToolbarController.d.ts.map +1 -1
- package/dist/toolbar/useToolbarIcons.d.ts +4 -3
- package/dist/toolbar/useToolbarIcons.d.ts.map +1 -1
- package/dist/toolbar/useTooltip.d.ts.map +1 -1
- package/dist/useEditor.d.ts +4 -3
- package/dist/useEditor.d.ts.map +1 -1
- package/package.json +4 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useEditor.ts","../src/useEditorState.ts","../src/EditorContext.tsx","../src/toolbar/useToolbarController.ts","../src/toolbar/useToolbarIcons.ts","../src/toolbar/useTooltip.ts","../src/toolbar/useKeyboardNav.ts","../src/toolbar/useComputedStyle.ts","../src/toolbar/ToolbarButton.tsx","../src/toolbar/ToolbarDropdownPanel.tsx","../src/toolbar/ToolbarDropdown.tsx","../src/toolbar/DomternalToolbar.tsx","../src/bubble-menu/useBubbleMenu.ts","../src/bubble-menu/DomternalBubbleMenu.tsx","../src/DomternalFloatingMenu.tsx","../src/emoji-picker/useEmojiPicker.ts","../src/emoji-picker/DomternalEmojiPicker.tsx","../src/Domternal.tsx","../src/DomternalEditor.tsx","../src/EditorContent.tsx","../src/node-views/ReactNodeViewContext.tsx","../src/node-views/ReactNodeViewRenderer.ts","../src/node-views/NodeViewWrapper.tsx","../src/node-views/NodeViewContent.tsx"],"names":["useState","useEffect","editable","useRef","useCallback","jsx","jsxs","ToolbarController","defaultIcons","PluginKey","useMemo","positionFloatingOnce","Fragment","DomternalEditor","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["import { type DependencyList, useEffect, useRef, useState } from 'react';\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\nexport interface UseEditorOptions {\n /** Custom extensions to add to the editor. */\n extensions?: AnyExtension[];\n /** Initial editor content (HTML string or JSON). */\n content?: Content;\n /** Whether the editor is editable. @default true */\n editable?: boolean;\n /** Where to autofocus on mount. @default false */\n autofocus?: FocusPosition;\n /** Output format for content comparison. @default 'html' */\n outputFormat?: 'html' | 'json';\n /**\n * Set to false to delay editor creation to useEffect (SSR-safe).\n * When false, the editor will be null during server-side rendering\n * and created only after the component mounts in the browser.\n * @default true\n */\n immediatelyRender?: boolean;\n /** Called when the editor instance is created. */\n onCreate?: (editor: Editor) => void;\n /** Called when the document content changes. */\n onUpdate?: (props: { editor: Editor }) => void;\n /** Called when the selection changes without content change. */\n onSelectionChange?: (props: { editor: Editor }) => void;\n /** Called when the editor gains focus. */\n onFocus?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called when the editor loses focus. */\n onBlur?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called before the editor is destroyed. */\n onDestroy?: () => void;\n}\n\n/**\n * Core hook for creating and managing a Domternal editor instance.\n *\n * @param options - Editor configuration\n * @param deps - Optional dependency array. When any value changes, the editor\n * is destroyed and recreated (content is preserved). Useful for dynamic\n * configuration that requires a full editor rebuild.\n *\n * @example\n * ```tsx\n * const { editor, editorRef } = useEditor({ extensions, content });\n * return <div className=\"dm-editor\"><div ref={editorRef} /></div>;\n * ```\n *\n * @example SSR-safe usage (Next.js)\n * ```tsx\n * const { editor, editorRef } = useEditor({\n * extensions,\n * content,\n * immediatelyRender: false,\n * });\n * ```\n *\n * @example With deps for forced recreation\n * ```tsx\n * const { editor, editorRef } = useEditor({ extensions, content }, [locale]);\n * // Editor is recreated when locale changes\n * ```\n */\nexport function useEditor(options: UseEditorOptions = {}, deps?: DependencyList) {\n const {\n extensions = [],\n content = '',\n editable = true,\n autofocus = false,\n outputFormat = 'html',\n } = options;\n\n const [editor, setEditor] = useState<Editor | null>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n const instanceRef = useRef<Editor | null>(null);\n const pendingContentRef = useRef<Content | null>(null);\n\n // Store latest callbacks in refs to avoid stale closures\n const callbacksRef = useRef(options);\n callbacksRef.current = options;\n\n // Store latest content/format for comparison\n const contentRef = useRef(content);\n contentRef.current = content;\n const formatRef = useRef(outputFormat);\n formatRef.current = outputFormat;\n\n // Track extensions reference for recreation\n const extensionsRef = useRef(extensions);\n\n // Track deps for recreation\n const depsRef = useRef(deps);\n\n /** Wire transaction, focus, blur event handlers to an editor instance. */\n function wireEvents(ed: Editor) {\n ed.on('transaction', ({ transaction }: TransactionEventProps) => {\n const cbs = callbacksRef.current;\n if (transaction.docChanged) {\n cbs.onUpdate?.({ editor: ed });\n }\n if (!transaction.docChanged && transaction.selectionSet) {\n cbs.onSelectionChange?.({ editor: ed });\n }\n });\n\n ed.on('focus', ({ event }: FocusEventProps) => {\n callbacksRef.current.onFocus?.({ editor: ed, event });\n });\n\n ed.on('blur', ({ event }: FocusEventProps) => {\n callbacksRef.current.onBlur?.({ editor: ed, event });\n });\n }\n\n /** Create editor and wire events. Returns the new instance. */\n function createEditorInstance(element: HTMLElement, initialContent: Content, focus: FocusPosition) {\n const ed = new Editor({\n element,\n extensions: [...DEFAULT_EXTENSIONS, ...extensions],\n content: initialContent,\n editable,\n autofocus: focus,\n });\n\n wireEvents(ed);\n instanceRef.current = ed;\n extensionsRef.current = extensions;\n depsRef.current = deps;\n setEditor(ed);\n callbacksRef.current.onCreate?.(ed);\n return ed;\n }\n\n /** Destroy current editor, preserving content for recreation. */\n function destroyCurrentEditor() {\n const current = instanceRef.current;\n if (current && !current.isDestroyed) {\n pendingContentRef.current = current.getJSON();\n callbacksRef.current.onDestroy?.();\n current.destroy();\n }\n instanceRef.current = null;\n setEditor(null);\n }\n\n // Create editor on mount\n useEffect(() => {\n // Use the ref element if available, otherwise create a detached div\n // (composable pattern: Domternal.Content will adopt the DOM later)\n const element = editorRef.current ?? document.createElement('div');\n\n const initialContent = pendingContentRef.current ?? content;\n pendingContentRef.current = null;\n\n createEditorInstance(element, initialContent, autofocus);\n\n return () => {\n destroyCurrentEditor();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync editable\n useEffect(() => {\n if (instanceRef.current && !instanceRef.current.isDestroyed) {\n instanceRef.current.setEditable(editable);\n }\n }, [editable]);\n\n // Recreate editor when extensions change\n useEffect(() => {\n if (!instanceRef.current || instanceRef.current.isDestroyed) return;\n if (extensions === extensionsRef.current) return;\n\n const element = instanceRef.current.view.dom.parentElement ?? document.createElement('div');\n destroyCurrentEditor();\n const initialContent = pendingContentRef.current ?? '';\n pendingContentRef.current = null;\n createEditorInstance(element, initialContent, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [extensions]);\n\n // Recreate editor when deps change\n useEffect(() => {\n if (!deps || !instanceRef.current || instanceRef.current.isDestroyed) return;\n // Skip if deps haven't actually changed (initial render)\n if (depsRef.current === deps) return;\n if (depsRef.current && deps.length === depsRef.current.length &&\n deps.every((d, i) => d === depsRef.current![i])) return;\n\n const element = instanceRef.current.view.dom.parentElement ?? document.createElement('div');\n destroyCurrentEditor();\n const initialContent = pendingContentRef.current ?? '';\n pendingContentRef.current = null;\n createEditorInstance(element, initialContent, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps ?? []);\n\n // Sync content from outside\n useEffect(() => {\n const ed = instanceRef.current;\n if (!ed || ed.isDestroyed) return;\n\n const format = formatRef.current;\n if (format === 'html') {\n if (content !== ed.getHTML()) {\n ed.setContent(content, false);\n }\n } else {\n if (JSON.stringify(content) !== JSON.stringify(ed.getJSON())) {\n ed.setContent(content, false);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [content]);\n\n return { editor, editorRef };\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { Editor, JSONContent } from '@domternal/core';\n\n/**\n * Full editor state returned when no selector is provided.\n */\nexport interface EditorState {\n htmlContent: string;\n jsonContent: JSONContent | null;\n isEmpty: boolean;\n isFocused: boolean;\n isEditable: boolean;\n}\n\n/**\n * Subscribe to editor state changes.\n *\n * **Overload 1 - Full state:**\n * ```tsx\n * const { htmlContent, isEmpty } = useEditorState(editor);\n * ```\n *\n * **Overload 2 - Selector (granular, avoids unnecessary re-renders):**\n * ```tsx\n * const isBold = useEditorState(editor, (ed) => ed.isActive('bold'));\n * ```\n */\nexport function useEditorState(editor: Editor | null): EditorState;\nexport function useEditorState<T>(editor: Editor | null, selector: (editor: Editor) => T): T | undefined;\nexport function useEditorState<T>(\n editor: Editor | null,\n selector?: (editor: Editor) => T,\n): EditorState | T | undefined {\n if (selector) {\n return useEditorStateSelector(editor, selector);\n }\n return useEditorStateFull(editor);\n}\n\n// --- Full state mode ---\n\nfunction useEditorStateFull(editor: Editor | null): EditorState {\n const [state, setState] = useState<EditorState>(() => getFullState(editor));\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) {\n setState(getFullState(null));\n return;\n }\n\n // Set initial state\n setState(getFullState(editor));\n\n const onTransaction = ({ transaction }: { transaction: { docChanged: boolean } }) => {\n setState(prev => {\n if (!transaction.docChanged) {\n const editable = editor.isEditable;\n if (prev.isEditable === editable) return prev;\n return { ...prev, isEditable: editable };\n }\n const html = editor.getHTML();\n const json = editor.getJSON();\n const empty = editor.isEmpty;\n const editable = editor.isEditable;\n if (prev.htmlContent === html && prev.isEmpty === empty && prev.isEditable === editable) return prev;\n return { ...prev, htmlContent: html, jsonContent: json, isEmpty: empty, isEditable: editable };\n });\n };\n\n const onFocus = () => {\n setState(prev => prev.isFocused ? prev : { ...prev, isFocused: true });\n };\n\n const onBlur = () => {\n setState(prev => !prev.isFocused ? prev : { ...prev, isFocused: false });\n };\n\n editor.on('transaction', onTransaction);\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return () => {\n editor.off('transaction', onTransaction);\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n };\n }, [editor]);\n\n return state;\n}\n\nfunction getFullState(editor: Editor | null): EditorState {\n if (!editor || editor.isDestroyed) {\n return { htmlContent: '', jsonContent: null, isEmpty: true, isFocused: false, isEditable: true };\n }\n return {\n htmlContent: editor.getHTML(),\n jsonContent: editor.getJSON(),\n isEmpty: editor.isEmpty,\n isFocused: editor.isFocused,\n isEditable: editor.isEditable,\n };\n}\n\n// --- Selector mode (useSyncExternalStore) ---\n\nfunction useEditorStateSelector<T>(editor: Editor | null, selector: (editor: Editor) => T): T | undefined {\n const selectorRef = useRef(selector);\n selectorRef.current = selector;\n\n const subscribe = useCallback(\n (callback: () => void) => {\n if (!editor || editor.isDestroyed) return () => {};\n\n editor.on('transaction', callback);\n editor.on('focus', callback);\n editor.on('blur', callback);\n\n return () => {\n editor.off('transaction', callback);\n editor.off('focus', callback);\n editor.off('blur', callback);\n };\n },\n [editor],\n );\n\n const getSnapshot = useCallback(() => {\n if (!editor || editor.isDestroyed) return undefined;\n return selectorRef.current(editor);\n }, [editor]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Editor } from '@domternal/core';\n\ninterface EditorContextValue {\n editor: Editor | null;\n}\n\nconst EditorContext = createContext<EditorContextValue>({ editor: null });\n\nexport interface EditorProviderProps {\n /** The editor instance to provide to descendants. */\n editor: Editor | null;\n children: ReactNode;\n}\n\n/**\n * Provides an editor instance to all descendant components via React Context.\n *\n * Components like DomternalToolbar, DomternalBubbleMenu, DomternalFloatingMenu,\n * and DomternalEmojiPicker will automatically use this editor when no explicit\n * `editor` prop is passed.\n *\n * @example\n * ```tsx\n * const { editor } = useEditor({ extensions, content });\n *\n * <EditorProvider editor={editor}>\n * <DomternalToolbar />\n * <EditorContent editor={editor} />\n * <DomternalBubbleMenu contexts={{ text: ['bold', 'italic'] }} />\n * </EditorProvider>\n * ```\n */\nexport function EditorProvider({ editor, children }: EditorProviderProps) {\n const value = useMemo<EditorContextValue>(() => ({ editor }), [editor]);\n return <EditorContext.Provider value={value}>{children}</EditorContext.Provider>;\n}\n\n/**\n * Access the editor instance from the nearest EditorProvider.\n *\n * @returns `{ editor }` where editor may be null if the provider has no editor yet.\n * @throws If used outside of an EditorProvider (optional - returns null editor instead).\n */\nexport function useCurrentEditor(): EditorContextValue {\n return useContext(EditorContext);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n ToolbarController,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n Editor,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\n\nexport function useToolbarController(\n editor: Editor | null,\n layout?: ToolbarLayoutEntry[],\n) {\n const [groups, setGroups] = useState<ToolbarGroup[]>([]);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [openDropdown, setOpenDropdown] = useState<string | null>(null);\n const [activeVersion, setActiveVersion] = useState(0);\n\n const controllerRef = useRef<ToolbarController | null>(null);\n const toolbarRef = useRef<HTMLDivElement>(null);\n const cleanupFloatingRef = useRef<(() => void) | null>(null);\n const clickOutsideRef = useRef<((e: Event) => void) | null>(null);\n const dismissOverlayRef = useRef<(() => void) | null>(null);\n const editorElRef = useRef<HTMLElement | null>(null);\n\n const syncStateRafRef = useRef(0);\n const syncState = useCallback(() => {\n // Defer state update to next animation frame so it doesn't interrupt\n // the current event cycle (e.g. mousedown → click on toolbar buttons).\n // Without this, a no-op transaction between mousedown and click causes\n // React to re-render and replace DOM nodes, swallowing the click event.\n cancelAnimationFrame(syncStateRafRef.current);\n syncStateRafRef.current = requestAnimationFrame(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n const controllerGroups = controller.groups;\n setGroups(prev => prev.length !== controllerGroups.length ? controllerGroups : prev);\n setFocusedIndex(controller.focusedIndex);\n setOpenDropdown(controller.openDropdown);\n setActiveVersion(v => v + 1);\n });\n }, []);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n const controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n syncState,\n layout,\n );\n controller.subscribe();\n controllerRef.current = controller;\n syncState();\n\n // Click outside to close dropdown\n const clickOutside = (e: Event) => {\n if (controller.openDropdown && toolbarRef.current && !toolbarRef.current.contains(e.target as Node)) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.closeDropdown();\n syncState();\n }\n };\n clickOutsideRef.current = clickOutside;\n document.addEventListener('mousedown', clickOutside);\n\n // Dismiss overlays (e.g. table handle clicks)\n const editorEl = editor.view.dom.closest('.dm-editor') as HTMLElement | null;\n editorElRef.current = editorEl;\n if (editorEl) {\n const dismiss = () => {\n if (controller.openDropdown) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.closeDropdown();\n syncState();\n }\n };\n dismissOverlayRef.current = dismiss;\n editorEl.addEventListener('dm:dismiss-overlays', dismiss);\n }\n\n return () => {\n cancelAnimationFrame(syncStateRafRef.current);\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n\n if (clickOutsideRef.current) {\n document.removeEventListener('mousedown', clickOutsideRef.current);\n clickOutsideRef.current = null;\n }\n\n if (dismissOverlayRef.current && editorElRef.current) {\n editorElRef.current.removeEventListener('dm:dismiss-overlays', dismissOverlayRef.current);\n dismissOverlayRef.current = null;\n editorElRef.current = null;\n }\n\n controller.destroy();\n controllerRef.current = null;\n };\n }, [editor, layout, syncState]);\n\n const isActive = useCallback((name: string): boolean => {\n // activeVersion used in component render to subscribe to changes\n return controllerRef.current?.activeMap.get(name) ?? false;\n }, []);\n\n const isDisabled = useCallback((name: string): boolean => {\n return controllerRef.current?.disabledMap.get(name) ?? false;\n }, []);\n\n const isDropdownActive = useCallback((dropdown: ToolbarDropdown): boolean => {\n if (dropdown.layout === 'grid') return false;\n if (dropdown.dynamicLabel) return false;\n const controller = controllerRef.current;\n if (!controller) return false;\n return dropdown.items.some((item: ToolbarButton) => controller.activeMap.get(item.name) ?? false);\n }, []);\n\n const getAriaExpanded = useCallback((item: ToolbarButton): string | null => {\n if (!item.emitEvent) return null;\n return controllerRef.current?.expandedMap.get(item.name) ? 'true' : null;\n }, []);\n\n const getFlatIndex = useCallback((name: string): number => {\n return controllerRef.current?.getFlatIndex(name) ?? -1;\n }, []);\n\n const handleDropdownToggle = useCallback((dropdown: ToolbarDropdown) => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.toggleDropdown(dropdown.name);\n syncState();\n\n if (controller.openDropdown) {\n requestAnimationFrame(() => {\n const trigger = toolbarRef.current?.querySelector('[aria-expanded=\"true\"]') as HTMLElement | null;\n const panel = trigger?.parentElement?.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (trigger && panel) {\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n cleanupFloatingRef.current = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }, [syncState]);\n\n const closeDropdown = useCallback(() => {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controllerRef.current?.closeDropdown();\n syncState();\n }, [syncState]);\n\n return {\n controller: controllerRef,\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n syncState,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { defaultIcons } from '@domternal/core';\nimport type { IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const DROPDOWN_CARET = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\nexport function useToolbarIcons(icons?: IconSet | null) {\n const cacheRef = useRef(new Map<string, string>());\n const prevIconsRef = useRef(icons);\n\n // Clear cache when icons source changes\n if (icons !== prevIconsRef.current) {\n cacheRef.current.clear();\n prevIconsRef.current = icons;\n }\n\n const resolveIconSvg = useCallback((name: string): string => {\n if (icons) {\n return icons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }, [icons]);\n\n const getCachedIcon = useCallback((name: string): string => {\n const cache = cacheRef.current;\n const key = `i:${name}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(name);\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedTriggerLabel = useCallback((label: string, isIcon?: boolean): string => {\n const cache = cacheRef.current;\n const key = `tl:${label}:${isIcon ? '1' : '0'}`;\n let cached = cache.get(key);\n if (!cached) {\n const content = isIcon ? resolveIconSvg(label) : label;\n cached = `<span class=\"dm-toolbar-trigger-label\">${content}</span>${DROPDOWN_CARET}`;\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedTriggerIcon = useCallback((iconName: string): string => {\n const cache = cacheRef.current;\n const key = `t:${iconName}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(iconName) + DROPDOWN_CARET;\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedItemContent = useCallback((\n iconName: string,\n label: string,\n displayMode?: 'icon-text' | 'text' | 'icon',\n ): string => {\n const mode = displayMode ?? 'icon-text';\n const cache = cacheRef.current;\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = cache.get(key);\n if (!cached) {\n if (mode === 'text') {\n cached = label;\n } else if (mode === 'icon') {\n cached = resolveIconSvg(iconName);\n } else {\n cached = resolveIconSvg(iconName) + ' ' + label;\n }\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getDropdownTriggerHtml = useCallback((\n dropdown: ToolbarDropdown,\n activeItem: ToolbarButton | undefined,\n ): string => {\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const cache = cacheRef.current;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(dropdown.icon) + DROPDOWN_CARET;\n if (color) {\n cached += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cache.set(key, cached);\n }\n return cached;\n }\n\n if (dropdown.dynamicLabel) {\n if (activeItem) return getCachedTriggerLabel(activeItem.label);\n if (dropdown.dynamicLabelFallback) return getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n return getCachedTriggerLabel(dropdown.icon, true);\n }\n\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return getCachedTriggerIcon(icon);\n }, [resolveIconSvg, getCachedTriggerLabel, getCachedTriggerIcon]);\n\n return {\n resolveIconSvg,\n getCachedIcon,\n getCachedTriggerLabel,\n getCachedTriggerIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n };\n}\n","import { useCallback } from 'react';\nimport type { ToolbarButton } from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\nexport function useTooltip() {\n const getTooltip = useCallback((item: ToolbarButton): string => {\n if (item.shortcut) {\n const parts = item.shortcut.split('-');\n const mapped = parts.map((p: string) => {\n if (p === 'Mod') return isMac ? '\\u2318' : 'Ctrl';\n if (p === 'Shift') return isMac ? '\\u21E7' : 'Shift';\n if (p === 'Alt') return isMac ? '\\u2325' : 'Alt';\n return p.toUpperCase();\n });\n const shortcut = isMac ? mapped.join('') : mapped.join('+');\n return `${item.label} (${shortcut})`;\n }\n return item.label;\n }, []);\n\n return { getTooltip };\n}\n","import { useCallback } from 'react';\nimport type { ToolbarController } from '@domternal/core';\n\nexport function useKeyboardNav(\n controllerRef: React.RefObject<ToolbarController | null>,\n toolbarRef: React.RefObject<HTMLDivElement | null>,\n closeDropdown: () => void,\n) {\n const focusCurrentButton = useCallback(() => {\n const idx = controllerRef.current?.focusedIndex ?? 0;\n const buttons = toolbarRef.current?.querySelectorAll('.dm-toolbar-button') as NodeListOf<HTMLButtonElement> | undefined;\n buttons?.[idx]?.focus();\n }, []); // controllerRef and toolbarRef are stable refs\n\n const focusDropdownItem = useCallback((direction: number, first?: boolean) => {\n const panel = toolbarRef.current?.querySelector('.dm-toolbar-dropdown-panel') as HTMLElement | null;\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }, []);\n\n const onKeyDown = useCallback((event: React.KeyboardEvent) => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n controller.navigateNext();\n focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n controller.navigatePrev();\n focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(1);\n } else {\n const btn = document.activeElement as HTMLElement | null;\n if (btn?.getAttribute('aria-haspopup') && btn.closest('.dm-toolbar')) {\n btn.click();\n requestAnimationFrame(() => focusDropdownItem(0, true));\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(-1);\n }\n break;\n }\n case 'Home':\n event.preventDefault();\n controller.navigateFirst();\n focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n controller.navigateLast();\n focusCurrentButton();\n break;\n case 'Escape':\n if (controller.openDropdown) {\n event.preventDefault();\n closeDropdown();\n focusCurrentButton();\n }\n break;\n }\n }, [closeDropdown, focusCurrentButton, focusDropdownItem]);\n\n return { onKeyDown, focusCurrentButton };\n}\n","import type { Editor } from '@domternal/core';\n\n/**\n * Read a CSS property value at the current cursor position.\n * Prefers inline style (explicit mark) over computed style (inherited).\n */\nexport function getComputedStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const resolved = editor.view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read only inline style at the current cursor position (no computed fallback).\n * Used for font-family to avoid reading browser default inheritance.\n */\nexport function getInlineStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const resolved = editor.view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n}\n","import type { ToolbarButton as ToolbarButtonType } from '@domternal/core';\n\nexport interface ToolbarButtonProps {\n item: ToolbarButtonType;\n isActive: boolean;\n isDisabled: boolean;\n tabIndex: number;\n tooltip: string;\n iconHtml: string;\n ariaExpanded?: string | null;\n onClick: (item: ToolbarButtonType, event: React.MouseEvent) => void;\n onFocus: (name: string) => void;\n}\n\nexport function ToolbarButton({\n item,\n isActive,\n isDisabled,\n tabIndex,\n tooltip,\n iconHtml,\n ariaExpanded,\n onClick,\n onFocus,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n className={`dm-toolbar-button${isActive ? ' dm-toolbar-button--active' : ''}`}\n aria-pressed={isActive}\n aria-expanded={ariaExpanded === 'true' ? true : undefined}\n aria-label={item.label}\n title={tooltip}\n tabIndex={tabIndex}\n disabled={isDisabled}\n dangerouslySetInnerHTML={{ __html: iconHtml }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => onClick(item, e)}\n onFocus={() => onFocus(item.name)}\n />\n );\n}\n","import type { ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport interface ToolbarDropdownPanelProps {\n dropdown: ToolbarDropdown;\n isActive: (name: string) => boolean;\n getCachedItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n onItemClick: (item: ToolbarButton, event: React.MouseEvent) => void;\n}\n\nexport function ToolbarDropdownPanel({\n dropdown,\n isActive,\n getCachedItemContent,\n onItemClick,\n}: ToolbarDropdownPanelProps) {\n if (dropdown.layout === 'grid') {\n return (\n <div\n className=\"dm-toolbar-dropdown-panel dm-color-palette\"\n role=\"menu\"\n style={{ '--dm-palette-columns': String(dropdown.gridColumns ?? 10) } as React.CSSProperties}\n >\n {dropdown.items.map((sub: ToolbarButton) =>\n sub.color ? (\n <button\n key={sub.name}\n type=\"button\"\n className={`dm-color-swatch${isActive(sub.name) ? ' dm-color-swatch--active' : ''}`}\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n title={sub.label}\n style={{ backgroundColor: sub.color }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => onItemClick(sub, e)}\n />\n ) : (\n <button\n key={sub.name}\n type=\"button\"\n className=\"dm-color-palette-reset\"\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n dangerouslySetInnerHTML={{ __html: getCachedItemContent(sub.icon, sub.label) }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => onItemClick(sub, e)}\n />\n ),\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"dm-toolbar-dropdown-panel\"\n role=\"menu\"\n data-display-mode={dropdown.displayMode ?? null}\n >\n {dropdown.items.map((sub: ToolbarButton) => (\n <button\n key={sub.name}\n type=\"button\"\n className={`dm-toolbar-dropdown-item${isActive(sub.name) ? ' dm-toolbar-dropdown-item--active' : ''}`}\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n ref={(el: HTMLButtonElement | null) => { if (el && sub.style) el.setAttribute('style', sub.style); }}\n dangerouslySetInnerHTML={{ __html: getCachedItemContent(sub.icon, sub.label, dropdown.displayMode) }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => onItemClick(sub, e)}\n />\n ))}\n </div>\n );\n}\n","import type { ToolbarButton, ToolbarDropdown as ToolbarDropdownType } from '@domternal/core';\nimport { ToolbarDropdownPanel } from './ToolbarDropdownPanel.js';\n\nexport interface ToolbarDropdownProps {\n dropdown: ToolbarDropdownType;\n isOpen: boolean;\n isActive: (name: string) => boolean;\n isDropdownActive: boolean;\n isDisabled: boolean;\n tabIndex: number;\n triggerHtml: string;\n getCachedItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n onToggle: (dropdown: ToolbarDropdownType) => void;\n onItemClick: (item: ToolbarButton, event: React.MouseEvent) => void;\n onFocus: (name: string) => void;\n}\n\nexport function ToolbarDropdown({\n dropdown,\n isOpen,\n isActive,\n isDropdownActive,\n isDisabled,\n tabIndex,\n triggerHtml,\n getCachedItemContent,\n onToggle,\n onItemClick,\n onFocus,\n}: ToolbarDropdownProps) {\n return (\n <div className=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n className={`dm-toolbar-button dm-toolbar-dropdown-trigger${isDropdownActive ? ' dm-toolbar-button--active' : ''}`}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={dropdown.label}\n title={dropdown.label}\n tabIndex={tabIndex}\n disabled={isDisabled}\n data-dropdown={dropdown.name}\n dangerouslySetInnerHTML={{ __html: triggerHtml }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => onToggle(dropdown)}\n onFocus={() => onFocus(dropdown.name)}\n />\n {isOpen && (\n <ToolbarDropdownPanel\n dropdown={dropdown}\n isActive={isActive}\n getCachedItemContent={getCachedItemContent}\n onItemClick={onItemClick}\n />\n )}\n </div>\n );\n}\n","import { Fragment, useCallback } from 'react';\nimport type {\n Editor,\n IconSet,\n ToolbarButton as ToolbarButtonType,\n ToolbarDropdown as ToolbarDropdownType,\n ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useToolbarController } from './useToolbarController.js';\nimport { useToolbarIcons, DROPDOWN_CARET } from './useToolbarIcons.js';\nimport { useTooltip } from './useTooltip.js';\nimport { useKeyboardNav } from './useKeyboardNav.js';\nimport { getComputedStyleAtCursor, getInlineStyleAtCursor } from './useComputedStyle.js';\nimport { ToolbarButton } from './ToolbarButton.js';\nimport { ToolbarDropdown } from './ToolbarDropdown.js';\n\nexport interface DomternalToolbarProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom icon set. When provided, only these icons are used (no defaultIcons fallback). */\n icons?: IconSet;\n /** Custom toolbar layout. */\n layout?: ToolbarLayoutEntry[];\n}\n\nexport function DomternalToolbar({ editor: editorProp, icons, layout }: DomternalToolbarProps) {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const {\n controller: controllerRef,\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n } = useToolbarController(editor, layout);\n\n const {\n getCachedIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n } = useToolbarIcons(icons);\n\n const { getTooltip } = useTooltip();\n const { onKeyDown } = useKeyboardNav(controllerRef, toolbarRef, closeDropdown);\n\n const onButtonClick = useCallback((item: ToolbarButtonType, event: React.MouseEvent) => {\n if (!editor) return;\n\n // Close any open dropdown first\n if (controllerRef.current?.openDropdown) {\n closeDropdown();\n }\n\n if (item.emitEvent) {\n const anchor = event.currentTarget as HTMLElement;\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n controllerRef.current?.executeCommand(item);\n\n // Always refocus editor after executing a command via toolbar button.\n // Mouse clicks already keep focus via mousedown.preventDefault();\n // keyboard activations (Enter/Space) need explicit refocus.\n requestAnimationFrame(() => editor.view.focus());\n }, [editor, closeDropdown]);\n\n const onDropdownItemClick = useCallback((item: ToolbarButtonType, event: React.MouseEvent) => {\n if (!editor) return;\n\n let anchor: HTMLElement | undefined;\n if (item.emitEvent) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector('.dm-toolbar-dropdown-trigger') as HTMLElement | undefined;\n }\n\n closeDropdown();\n\n if (item.emitEvent) {\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n controllerRef.current?.executeCommand(item);\n }\n\n // Refocus editor so ::selection highlight stays visible\n requestAnimationFrame(() => editor.view.focus());\n }, [editor, closeDropdown]);\n\n const onButtonFocus = useCallback((name: string) => {\n const index = controllerRef.current?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n controllerRef.current?.setFocusedIndex(index);\n }\n }, []);\n\n // Force re-read of activeVersion in render to subscribe to state changes\n void activeVersion;\n\n if (!editor) return null;\n\n return (\n <div\n ref={toolbarRef}\n className=\"dm-toolbar\"\n role=\"toolbar\"\n aria-label=\"Editor formatting\"\n data-dm-editor-ui=\"\"\n onKeyDown={onKeyDown}\n >\n {groups.map((group, gi) => (\n <Fragment key={group.name}>\n {gi > 0 && <div className=\"dm-toolbar-separator\" role=\"separator\" />}\n <div className=\"dm-toolbar-group\" role=\"group\" aria-label={group.name || 'Tools'}>\n {group.items.map((item: ToolbarItem) => {\n if (item.type === 'button') {\n const btn = item as ToolbarButtonType;\n return (\n <ToolbarButton\n key={btn.name}\n item={btn}\n isActive={isActive(btn.name)}\n isDisabled={isDisabled(btn.name)}\n tabIndex={getFlatIndex(btn.name) === focusedIndex ? 0 : -1}\n tooltip={getTooltip(btn)}\n iconHtml={getCachedIcon(btn.icon)}\n ariaExpanded={getAriaExpanded(btn)}\n onClick={onButtonClick}\n onFocus={onButtonFocus}\n />\n );\n }\n if (item.type === 'dropdown') {\n const dd = item as ToolbarDropdownType;\n const activeItem = dd.items.find((sub: ToolbarButtonType) => controllerRef.current?.activeMap.get(sub.name));\n\n // Handle dynamic label with computed style\n let triggerHtml = getDropdownTriggerHtml(dd, activeItem);\n if (dd.dynamicLabel && !activeItem && dd.computedStyleProperty) {\n let computed: string | null;\n if (dd.computedStyleProperty === 'font-family') {\n computed = getInlineStyleAtCursor(editor, dd.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first || null;\n }\n } else {\n computed = getComputedStyleAtCursor(editor, dd.computedStyleProperty);\n }\n if (computed) {\n // Re-generate trigger with computed value\n triggerHtml = `<span class=\"dm-toolbar-trigger-label\">${computed}</span>${DROPDOWN_CARET}`;\n }\n }\n\n return (\n <ToolbarDropdown\n key={dd.name}\n dropdown={dd}\n isOpen={openDropdown === dd.name}\n isActive={isActive}\n isDropdownActive={isDropdownActive(dd)}\n isDisabled={isDisabled(dd.name)}\n tabIndex={getFlatIndex(dd.name) === focusedIndex ? 0 : -1}\n triggerHtml={triggerHtml}\n getCachedItemContent={getCachedItemContent}\n onToggle={handleDropdownToggle}\n onItemClick={onDropdownItemClick}\n onFocus={onButtonFocus}\n />\n );\n }\n return null;\n })}\n </div>\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultIcons,\n} from '@domternal/core';\nimport type { Editor, ToolbarButton, BubbleMenuOptions } from '@domternal/core';\n\n// --- Duck-typed ProseMirror shapes (avoids instanceof across bundles) ---\n\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\nexport type BubbleMenuItem = ToolbarButton | BubbleMenuSeparator;\n\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\nfunction findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') return node;\n }\n return null;\n}\n\n// --- Hook ---\n\nexport interface UseBubbleMenuOptions {\n editor: Editor | null;\n shouldShow?: BubbleMenuOptions['shouldShow'] | undefined;\n placement?: 'top' | 'bottom' | undefined;\n offset?: number | undefined;\n updateDelay?: number | undefined;\n items?: string[] | undefined;\n contexts?: Record<string, string[] | true | null> | undefined;\n}\n\nexport function useBubbleMenu(options: UseBubbleMenuOptions) {\n const { editor, shouldShow, placement = 'top', offset = 8, updateDelay = 0, items, contexts } = options;\n\n const menuRef = useRef<HTMLDivElement>(null);\n const pluginKeyRef = useRef(new PluginKey('reactBubbleMenu-' + Math.random().toString(36).slice(2, 8)));\n const [resolvedItems, setResolvedItems] = useState<BubbleMenuItem[]>([]);\n const [activeVersion, setActiveVersion] = useState(0);\n\n const activeMapRef = useRef(new Map<string, boolean>());\n const disabledMapRef = useRef(new Map<string, boolean>());\n const itemMapRef = useRef(new Map<string, ToolbarButton>());\n const bubbleDefaultsRef = useRef(new Map<string, BubbleMenuItem[]>());\n const resolvedItemsRef = useRef<BubbleMenuItem[]>([]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed || !menuRef.current) return;\n\n // Build item map\n const itemMap = new Map<string, ToolbarButton>();\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 for (const sub of item.items) {\n itemMap.set(sub.name, sub);\n }\n }\n }\n itemMapRef.current = itemMap;\n\n // Build bubble defaults\n const bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton) => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of 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 for (const [ctx, ctxItems] of byCtx) {\n ctxItems.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of ctxItems) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${sepIdx++}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n bubbleDefaults.set(ctx, result);\n }\n bubbleDefaultsRef.current = bubbleDefaults;\n\n // Resolve names helper\n const resolveNames = (names: string[]): BubbleMenuItem[] => {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${sepIdx++}` });\n } else {\n const item = itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n };\n\n const getFormatItems = (): ToolbarButton[] => {\n return Array.from(itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n };\n\n const detectContext = (selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null => {\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n const fromCell = findCellNode(selection.$from);\n if (fromCell) {\n const toCell = findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n };\n\n const filterBySchema = (contextName: string, schemaItems: ToolbarButton[]): ToolbarButton[] => {\n if (contextName === 'text' || contextName === 'table') return schemaItems;\n const schema = (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 // Generate shouldShow function\n let shouldShowFn = shouldShow;\n if (!shouldShowFn) {\n if (contexts) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = detectContext(state.selection, contexts);\n if (!context) return false;\n if (context in contexts) {\n const val = contexts[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return bubbleDefaults.has(context);\n };\n } else {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty || state.selection.node) return false;\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n // Register plugin\n const plugin = createBubbleMenuPlugin({\n pluginKey: pluginKeyRef.current,\n editor,\n element: menuRef.current,\n shouldShow: shouldShowFn,\n placement,\n offset,\n updateDelay,\n });\n editor.registerPlugin(plugin);\n\n const setItems = (newItems: BubbleMenuItem[]) => {\n resolvedItemsRef.current = newItems;\n setResolvedItems(newItems);\n };\n\n // Set initial items\n if (contexts) {\n updateContextItems(editor, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else if (items) {\n setItems(resolveNames(items));\n } else {\n setItems(resolveNames(['bold', 'italic', 'underline']));\n }\n\n const updateStates = (ed: Editor) => {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = ed.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch {}\n\n for (const item of resolvedItemsRef.current) {\n if (item.type === 'separator') continue;\n activeMapRef.current.set(item.name, ToolbarController.resolveActive(ed as never, item));\n try {\n const canCmd = canProxy?.[item.command];\n disabledMapRef.current.set(item.name, canCmd\n ? !(item.commandArgs?.length ? canCmd(...item.commandArgs) : canCmd())\n : false);\n } catch { disabledMapRef.current.set(item.name, false); }\n }\n };\n\n // Transaction handler\n const transactionHandler = () => {\n if (contexts) {\n updateContextItems(editor, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n }\n updateStates(editor);\n setActiveVersion(v => v + 1);\n };\n editor.on('transaction', transactionHandler);\n updateStates(editor);\n\n return () => {\n editor.off('transaction', transactionHandler);\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(pluginKeyRef.current);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n function updateContextItems(\n ed: Editor,\n ctxs: Record<string, string[] | true | null>,\n detectContext: (sel: SelectionShape, c: Record<string, string[] | true | null>) => string | null,\n resolveNames: (names: string[]) => BubbleMenuItem[],\n getFormatItems: () => ToolbarButton[],\n filterBySchema: (ctx: string, items: ToolbarButton[]) => ToolbarButton[],\n defaults: Map<string, BubbleMenuItem[]>,\n setItems: (items: BubbleMenuItem[]) => void,\n ) {\n const ctx = detectContext(ed.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) { setItems([]); return; }\n\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n setItems([]);\n return;\n }\n if (val === true) {\n setItems(filterBySchema(ctx, getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(filterBySchema(ctx, buttons).map(b => b.name));\n setItems(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n setItems(defaults.get(ctx) ?? []);\n }\n }\n\n const isItemActive = (item: ToolbarButton): boolean => {\n return activeMapRef.current.get(item.name) ?? false;\n };\n\n const isItemDisabled = (item: ToolbarButton): boolean => {\n return disabledMapRef.current.get(item.name) ?? false;\n };\n\n const executeCommand = (item: ToolbarButton) => {\n if (!editor) return;\n if (item.emitEvent) {\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, {});\n return;\n }\n ToolbarController.executeItem(editor as never, item);\n };\n\n return {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon: (name: string) => defaultIcons[name] ?? '',\n };\n}\n","import { useRef } from 'react';\nimport type { Editor, BubbleMenuOptions, ToolbarButton } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useBubbleMenu } from './useBubbleMenu.js';\n\nexport interface DomternalBubbleMenuProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom visibility function. */\n shouldShow?: BubbleMenuOptions['shouldShow'];\n /** Position relative to selection. @default 'top' */\n placement?: 'top' | 'bottom';\n /** Pixel offset from selection. @default 8 */\n offset?: number;\n /** Debounce delay in ms. @default 0 */\n updateDelay?: number;\n /** Fixed item names, e.g. ['bold', 'italic', 'code']. */\n items?: string[];\n /** Context-aware: map context names to item arrays, true for all, or null to disable. */\n contexts?: Record<string, string[] | true | null>;\n /** Additional content rendered after buttons. */\n children?: React.ReactNode;\n}\n\nexport function DomternalBubbleMenu({\n editor: editorProp,\n shouldShow,\n placement,\n offset,\n updateDelay,\n items,\n contexts,\n children,\n}: DomternalBubbleMenuProps) {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const htmlCacheRef = useRef(new Map<string, string>());\n\n const {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n } = useBubbleMenu({\n editor,\n shouldShow,\n placement,\n offset,\n updateDelay,\n items,\n contexts,\n });\n\n // Force re-read of activeVersion in render to subscribe to state changes\n void activeVersion;\n\n const getCachedHtml = (name: string): string => {\n const cache = htmlCacheRef.current;\n const cached = cache.get(name);\n if (cached) return cached;\n const html = getCachedIcon(name);\n cache.set(name, html);\n return html;\n };\n\n return (\n <div ref={menuRef} className=\"dm-bubble-menu\" role=\"toolbar\" aria-label=\"Text formatting\">\n {resolvedItems.map((item) => {\n if (item.type === 'separator') {\n return <span key={item.name} className=\"dm-toolbar-separator\" role=\"separator\" />;\n }\n const btn = item as ToolbarButton;\n const active = isItemActive(btn);\n return (\n <button\n key={btn.name}\n type=\"button\"\n className={`dm-toolbar-button${active ? ' dm-toolbar-button--active' : ''}`}\n disabled={isItemDisabled(btn)}\n title={btn.label}\n aria-label={btn.label}\n aria-pressed={active}\n dangerouslySetInnerHTML={{ __html: getCachedHtml(btn.icon) }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => executeCommand(btn)}\n />\n );\n })}\n {children}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { PluginKey, createFloatingMenuPlugin } from '@domternal/core';\nimport type { Editor, FloatingMenuOptions } from '@domternal/core';\nimport { useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalFloatingMenuProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom visibility function. */\n shouldShow?: FloatingMenuOptions['shouldShow'];\n /** Pixel offset from trigger. @default 0 */\n offset?: number;\n /** Content to render inside the floating menu. */\n children?: React.ReactNode;\n}\n\nexport function DomternalFloatingMenu({\n editor: editorProp,\n shouldShow,\n offset = 0,\n children,\n}: DomternalFloatingMenuProps) {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const menuRef = useRef<HTMLDivElement>(null);\n const pluginKeyRef = useRef(\n new PluginKey('reactFloatingMenu-' + Math.random().toString(36).slice(2, 8)),\n );\n\n const shouldShowRef = useRef(shouldShow);\n shouldShowRef.current = shouldShow;\n const offsetRef = useRef(offset);\n offsetRef.current = offset;\n\n useEffect(() => {\n if (!editor || editor.isDestroyed || !menuRef.current) return;\n\n const plugin = createFloatingMenuPlugin({\n pluginKey: pluginKeyRef.current,\n editor,\n element: menuRef.current,\n ...(shouldShowRef.current && { shouldShow: shouldShowRef.current }),\n offset: offsetRef.current,\n });\n editor.registerPlugin(plugin);\n\n return () => {\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(pluginKeyRef.current);\n }\n };\n }, [editor]);\n\n return (\n <div ref={menuRef} className=\"dm-floating-menu\">\n {children}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { positionFloatingOnce } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nexport function useEmojiPicker(editor: Editor | null, emojis: EmojiPickerItem[]) {\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState('');\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLElement | null>(null);\n const cleanupFloatingRef = useRef<(() => void) | null>(null);\n const clickOutsideRef = useRef<((e: Event) => void) | null>(null);\n const keydownRef = useRef<((e: KeyboardEvent) => void) | null>(null);\n const isOpenRef = useRef(false);\n\n const categories = useMemo(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of emojis) {\n let list = map.get(item.group);\n if (!list) { list = []; map.set(item.group, list); }\n list.push(item);\n }\n return map;\n }, [emojis]);\n\n const categoryNames = useMemo(() => [...categories.keys()], [categories]);\n\n const filteredEmojis = useMemo(() => {\n const query = searchQuery.toLowerCase();\n if (!query) return [];\n const storage = getEmojiStorage(editor);\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) return searchFn(query);\n return emojis.filter(\n (item) => item.name.includes(query) || item.group.toLowerCase().includes(query),\n );\n }, [searchQuery, emojis, editor]);\n\n const frequentlyUsed = useMemo(() => {\n // Re-evaluate when panel opens\n if (!isOpen) return [];\n const storage = getEmojiStorage(editor);\n const getFreq = storage?.['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage!['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n }, [isOpen, editor]);\n\n const removeGlobalListeners = useCallback(() => {\n if (clickOutsideRef.current) {\n document.removeEventListener('mousedown', clickOutsideRef.current);\n clickOutsideRef.current = null;\n }\n if (keydownRef.current) {\n document.removeEventListener('keydown', keydownRef.current);\n keydownRef.current = null;\n }\n }, []);\n\n const close = useCallback(() => {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n isOpenRef.current = false;\n setIsOpen(false);\n setStorageOpen(editor, false);\n setSearchQuery('');\n anchorRef.current = null;\n removeGlobalListeners();\n editor?.view.focus();\n }, [editor, removeGlobalListeners]);\n\n const addGlobalListeners = useCallback(() => {\n clickOutsideRef.current = (e: Event) => {\n const target = e.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n target !== anchorRef.current &&\n !anchorRef.current?.contains(target)\n ) {\n // Defer close to next frame so the current mousedown/click cycle\n // completes without React re-rendering and replacing DOM nodes\n // (which would swallow the click event on toolbar buttons).\n requestAnimationFrame(() => close());\n }\n };\n document.addEventListener('mousedown', clickOutsideRef.current);\n\n keydownRef.current = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n };\n document.addEventListener('keydown', keydownRef.current);\n }, [close]);\n\n // Listen to insertEmoji event\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n const handler = (...args: unknown[]) => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n\n if (isOpenRef.current) {\n close();\n return;\n }\n\n anchorRef.current = data?.anchorElement ?? null;\n isOpenRef.current = true;\n setIsOpen(true);\n setStorageOpen(editor, true);\n setSearchQuery('');\n\n if (categoryNames.length > 0 && categoryNames[0]) {\n setActiveCategory(categoryNames[0]);\n }\n\n addGlobalListeners();\n\n requestAnimationFrame(() => {\n const panel = pickerRef.current?.querySelector('.dm-emoji-picker') as HTMLElement | null;\n if (panel && anchorRef.current) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = positionFloatingOnce(anchorRef.current, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = pickerRef.current?.querySelector('.dm-emoji-picker-search input') as HTMLInputElement | null;\n input?.focus({ preventScroll: true });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n\n return () => {\n removeGlobalListeners();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n const selectEmoji = useCallback((item: EmojiPickerItem) => {\n if (!editor) return;\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n close();\n }, [editor, close]);\n\n const onSearch = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(event.target.value);\n }, []);\n\n const scrollToCategory = useCallback((cat: string) => {\n setSearchQuery('');\n setActiveCategory(cat);\n requestAnimationFrame(() => {\n const grid = pickerRef.current?.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n const label = grid.querySelector(`[data-category=\"${cat}\"]`) as HTMLElement | null;\n if (label) {\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n // Focus first emoji swatch after scroll completes\n setTimeout(() => {\n const firstSwatch = label.nextElementSibling;\n if (firstSwatch instanceof HTMLElement && firstSwatch.classList.contains('dm-emoji-swatch')) {\n firstSwatch.focus();\n }\n }, 50);\n }\n });\n }, []);\n\n const activeCategoryRef = useRef(activeCategory);\n activeCategoryRef.current = activeCategory;\n const searchQueryRef = useRef(searchQuery);\n searchQueryRef.current = searchQuery;\n\n const onGridScroll = useCallback(() => {\n if (searchQueryRef.current) return;\n const grid = pickerRef.current?.querySelector('.dm-emoji-picker-grid') as HTMLElement | null;\n if (!grid) return;\n\n const labels = Array.from(grid.querySelectorAll('.dm-emoji-picker-category-label[data-category]')) as HTMLElement[];\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n if (currentCat && currentCat !== activeCategoryRef.current) {\n setActiveCategory(currentCat);\n }\n }, []);\n\n return {\n isOpen,\n searchQuery,\n activeCategory,\n categories,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n };\n}\n\nfunction getEmojiStorage(editor: Editor | null): Record<string, unknown> | null {\n if (!editor) return null;\n const storage = editor.storage as Record<string, unknown>;\n return (storage['emoji'] as Record<string, unknown>) ?? null;\n}\n\nfunction setStorageOpen(editor: Editor | null, open: boolean): void {\n if (!editor) return;\n const storage = getEmojiStorage(editor);\n if (storage) storage['isOpen'] = open;\n editor.view.dispatch(editor.view.state.tr);\n}\n","import { Fragment, useCallback } from 'react';\nimport type { Editor } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useEmojiPicker, type EmojiPickerItem } from './useEmojiPicker.js';\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\nfunction categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n}\n\nfunction formatName(name: string): string {\n return name.replace(/_/g, ' ');\n}\n\nexport interface DomternalEmojiPickerProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Array of emoji items with emoji, name, and group. */\n emojis: EmojiPickerItem[];\n}\n\nexport function DomternalEmojiPicker({ editor: editorProp, emojis }: DomternalEmojiPickerProps) {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const {\n isOpen,\n searchQuery,\n activeCategory,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n categories,\n } = useEmojiPicker(editor, emojis);\n\n const onGridKeyDown = useCallback((event: React.KeyboardEvent) => {\n const grid = event.currentTarget as HTMLElement;\n const swatches = Array.from(grid.querySelectorAll('.dm-emoji-swatch')) as HTMLElement[];\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n let idx = swatches.indexOf(current);\n if (idx === -1) {\n // Focus is on grid container, not a swatch — enter the grid\n if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n swatches[0]?.focus();\n }\n return;\n }\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }, []);\n\n if (!isOpen) return <div ref={pickerRef} className=\"dm-emoji-picker-host\" />;\n\n return (\n <div ref={pickerRef} className=\"dm-emoji-picker-host\">\n <div className=\"dm-emoji-picker\">\n <div className=\"dm-emoji-picker-search\">\n <input\n type=\"text\"\n placeholder=\"Search emoji...\"\n aria-label=\"Search emoji\"\n value={searchQuery}\n onChange={onSearch}\n onKeyDown={(e) => { if (e.key === 'Escape') close(); }}\n />\n </div>\n\n <div className=\"dm-emoji-picker-tabs\" role=\"tablist\">\n {categoryNames.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n className={`dm-emoji-picker-tab${activeCategory === cat ? ' dm-emoji-picker-tab--active' : ''}`}\n role=\"tab\"\n aria-selected={activeCategory === cat}\n title={cat}\n aria-label={cat}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => scrollToCategory(cat)}\n >\n {categoryIcon(cat)}\n </button>\n ))}\n </div>\n\n <div className=\"dm-emoji-picker-grid\" onScroll={onGridScroll} onKeyDown={onGridKeyDown}>\n {searchQuery ? (\n <>\n {filteredEmojis.length > 0 ? (\n filteredEmojis.map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => selectEmoji(item)}\n >\n {item.emoji}\n </button>\n ))\n ) : (\n <div className=\"dm-emoji-picker-empty\">No emoji found</div>\n )}\n </>\n ) : (\n <>\n {frequentlyUsed.length > 0 && (\n <>\n <div className=\"dm-emoji-picker-category-label\">Frequently Used</div>\n {frequentlyUsed.map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => selectEmoji(item)}\n >\n {item.emoji}\n </button>\n ))}\n </>\n )}\n {categoryNames.map((cat) => (\n <Fragment key={cat}>\n <div className=\"dm-emoji-picker-category-label\" data-category={cat}>\n {cat}\n </div>\n {(categories.get(cat) ?? []).map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => selectEmoji(item)}\n >\n {item.emoji}\n </button>\n ))}\n </Fragment>\n ))}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, type DependencyList, type ReactNode } from 'react';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { EditorProvider, useCurrentEditor } from './EditorContext.js';\nimport { DomternalToolbar, type DomternalToolbarProps } from './toolbar/DomternalToolbar.js';\nimport { DomternalBubbleMenu, type DomternalBubbleMenuProps } from './bubble-menu/DomternalBubbleMenu.js';\nimport { DomternalFloatingMenu, type DomternalFloatingMenuProps } from './DomternalFloatingMenu.js';\nimport { DomternalEmojiPicker, type DomternalEmojiPickerProps } from './emoji-picker/DomternalEmojiPicker.js';\n\n// --- Root component ---\n\nexport interface DomternalProps extends UseEditorOptions {\n /** Optional dependency array for forced editor recreation. */\n deps?: DependencyList;\n children: ReactNode;\n}\n\n/**\n * Composable root component that creates an editor and provides it to all\n * subcomponents via context. No need to pass `editor` prop to children.\n *\n * @example\n * ```tsx\n * <Domternal extensions={[Bold, Italic]} content=\"<p>Hello</p>\">\n * <Domternal.Toolbar />\n * <Domternal.Content />\n * <Domternal.BubbleMenu contexts={{ text: ['bold', 'italic'] }} />\n * <Domternal.EmojiPicker emojis={emojis} />\n * </Domternal>\n * ```\n *\n * @example SSR-safe with loading state\n * ```tsx\n * <Domternal extensions={extensions} immediatelyRender={false}>\n * <Domternal.Loading>Loading editor...</Domternal.Loading>\n * <Domternal.Toolbar />\n * <Domternal.Content />\n * </Domternal>\n * ```\n */\nexport function Domternal({ children, deps, ...options }: DomternalProps) {\n const { editor } = useEditor(options, deps);\n\n return (\n <EditorProvider editor={editor}>\n {children}\n </EditorProvider>\n );\n}\n\n// --- Subcomponents ---\n\n/** Renders the editor content area. Mounts the editor view DOM from context. */\nfunction DomternalContent({ className }: { className?: string }) {\n const { editor } = useCurrentEditor();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !editor || editor.isDestroyed) return;\n\n const editorDom = editor.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n }, [editor]);\n\n const classes = className ? `dm-editor ${className}` : 'dm-editor';\n\n return (\n <div className={classes} data-dm-editor-ui=\"\">\n <div ref={containerRef} />\n </div>\n );\n}\n\n/** Renders children only while editor is not yet ready (SSR loading state). */\nfunction DomternalLoading({ children }: { children: ReactNode }) {\n const { editor } = useCurrentEditor();\n if (editor) return null;\n return <>{children}</>;\n}\n\n/** Toolbar subcomponent. Uses editor from context automatically. */\nfunction DomternalToolbarSub(props: Omit<DomternalToolbarProps, 'editor'>) {\n return <DomternalToolbar {...props} />;\n}\n\n/** BubbleMenu subcomponent. Uses editor from context automatically. */\nfunction DomternalBubbleMenuSub(props: Omit<DomternalBubbleMenuProps, 'editor'>) {\n return <DomternalBubbleMenu {...props} />;\n}\n\n/** FloatingMenu subcomponent. Uses editor from context automatically. */\nfunction DomternalFloatingMenuSub(props: Omit<DomternalFloatingMenuProps, 'editor'>) {\n return <DomternalFloatingMenu {...props} />;\n}\n\n/** EmojiPicker subcomponent. Uses editor from context automatically. */\nfunction DomternalEmojiPickerSub(props: Omit<DomternalEmojiPickerProps, 'editor'>) {\n return <DomternalEmojiPicker {...props} />;\n}\n\n// --- Attach subcomponents ---\n\nDomternalContent.displayName = 'Domternal.Content';\nDomternalLoading.displayName = 'Domternal.Loading';\nDomternalToolbarSub.displayName = 'Domternal.Toolbar';\nDomternalBubbleMenuSub.displayName = 'Domternal.BubbleMenu';\nDomternalFloatingMenuSub.displayName = 'Domternal.FloatingMenu';\nDomternalEmojiPickerSub.displayName = 'Domternal.EmojiPicker';\n\nDomternal.Content = DomternalContent;\nDomternal.Loading = DomternalLoading;\nDomternal.Toolbar = DomternalToolbarSub;\nDomternal.BubbleMenu = DomternalBubbleMenuSub;\nDomternal.FloatingMenu = DomternalFloatingMenuSub;\nDomternal.EmojiPicker = DomternalEmojiPickerSub;\n","import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport type { Content, JSONContent, Editor } from '@domternal/core';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { useEditorState } from './useEditorState.js';\nimport { EditorProvider } from './EditorContext.js';\n\nexport interface DomternalEditorProps extends Omit<UseEditorOptions, 'outputFormat'> {\n /** Additional CSS class for the .dm-editor wrapper. */\n className?: string;\n /** Output format for onChange. @default 'html' */\n outputFormat?: 'html' | 'json';\n /** Controlled value. When provided, editor content syncs to this value. */\n value?: Content;\n /** Called when content changes (controlled mode). */\n onChange?: (value: string | JSONContent) => void;\n /** Additional content rendered inside the dm-editor wrapper. */\n children?: React.ReactNode;\n}\n\nexport interface DomternalEditorRef {\n editor: Editor | null;\n htmlContent: string;\n jsonContent: JSONContent | null;\n isEmpty: boolean;\n isFocused: boolean;\n isEditable: boolean;\n}\n\n/**\n * All-in-one editor component with integrated state management and context.\n *\n * Wraps children with EditorProvider automatically, so toolbar, bubble menu,\n * and emoji picker components can access the editor via context.\n *\n * @example\n * ```tsx\n * const editorRef = useRef<DomternalEditorRef>(null);\n *\n * <DomternalEditor\n * ref={editorRef}\n * extensions={[Bold, Italic, Heading]}\n * content=\"<p>Hello</p>\"\n * onUpdate={({ editor }) => console.log(editor.getHTML())}\n * />\n * ```\n *\n * @example Controlled mode\n * ```tsx\n * const [html, setHtml] = useState('<p>Hello</p>');\n * <DomternalEditor value={html} onChange={setHtml} outputFormat=\"html\" />\n * ```\n */\nexport const DomternalEditor = forwardRef<DomternalEditorRef, DomternalEditorProps>(\n function DomternalEditor(props, ref) {\n const {\n className,\n outputFormat = 'html',\n value,\n onChange,\n content,\n children,\n ...editorOptions\n } = props;\n\n const { editor, editorRef } = useEditor({\n ...editorOptions,\n content: content ?? value ?? '',\n outputFormat,\n });\n\n const state = useEditorState(editor);\n\n // Expose editor + state via ref\n useImperativeHandle(ref, () => ({\n editor,\n htmlContent: state.htmlContent,\n jsonContent: state.jsonContent,\n isEmpty: state.isEmpty,\n isFocused: state.isFocused,\n isEditable: state.isEditable,\n }), [editor, state]);\n\n // Controlled mode: sync value prop to editor\n const prevValueRef = useRef(value);\n useEffect(() => {\n if (value === undefined || !editor || editor.isDestroyed) return;\n if (value === prevValueRef.current) return;\n prevValueRef.current = value;\n\n if (outputFormat === 'html') {\n if (value !== editor.getHTML()) {\n editor.setContent(value, false);\n }\n } else {\n if (JSON.stringify(value) !== JSON.stringify(editor.getJSON())) {\n editor.setContent(value, false);\n }\n }\n }, [value, editor, outputFormat]);\n\n // Controlled mode: call onChange on content changes\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n useEffect(() => {\n if (!editor || editor.isDestroyed || !onChangeRef.current) return;\n\n const handler = () => {\n const cb = onChangeRef.current;\n if (!cb) return;\n const val = outputFormat === 'html' ? editor.getHTML() : editor.getJSON();\n cb(val);\n };\n\n editor.on('update', handler);\n return () => { editor.off('update', handler); };\n }, [editor, outputFormat]);\n\n const classes = className ? `dm-editor ${className}` : 'dm-editor';\n\n return (\n <EditorProvider editor={editor}>\n {children}\n <div className={classes} data-dm-editor-ui=\"\">\n <div ref={editorRef} />\n </div>\n </EditorProvider>\n );\n },\n);\n","import { useEffect, useRef, type HTMLAttributes, type Ref } from 'react';\nimport type { Editor } from '@domternal/core';\n\nexport interface EditorContentProps extends HTMLAttributes<HTMLDivElement> {\n /** The editor instance to render. */\n editor: Editor | null;\n /** Ref to the underlying div element. */\n innerRef?: Ref<HTMLDivElement>;\n}\n\n/**\n * Renders the ProseMirror editor view into a div element.\n *\n * Use this with `useEditor` for a flexible, decoupled pattern where the\n * editor hook and rendering are separated:\n *\n * @example\n * ```tsx\n * const { editor } = useEditor({ extensions, content });\n * return <EditorContent editor={editor} className=\"my-editor\" />;\n * ```\n */\nexport function EditorContent({ editor, innerRef, ...htmlProps }: EditorContentProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !editor || editor.isDestroyed) return;\n\n // If the editor already has a view, move its DOM into this container\n const editorDom = editor.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n\n return () => {\n // Don't remove the DOM on unmount - the editor manages its own DOM lifecycle\n };\n }, [editor]);\n\n return (\n <div\n ref={(node) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n if (typeof innerRef === 'function') innerRef(node);\n else if (innerRef) (innerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n data-dm-editor-ui=\"\"\n {...htmlProps}\n />\n );\n}\n","import { createContext, useContext, type RefCallback } from 'react';\n\nexport interface ReactNodeViewContextValue {\n onDragStart: (event: DragEvent) => void;\n nodeViewContentRef: RefCallback<HTMLElement>;\n}\n\nconst ReactNodeViewContext = createContext<ReactNodeViewContextValue | null>(null);\n\nexport const ReactNodeViewProvider = ReactNodeViewContext.Provider;\n\n/**\n * Access node view internals from within a custom React node view component.\n * Used by NodeViewWrapper and NodeViewContent.\n */\nexport function useReactNodeView(): ReactNodeViewContextValue {\n const context = useContext(ReactNodeViewContext);\n if (!context) {\n throw new Error('useReactNodeView must be used within a ReactNodeViewRenderer component');\n }\n return context;\n}\n","import { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { ReactNodeViewProvider, type ReactNodeViewContextValue } from './ReactNodeViewContext.js';\nimport type { Editor, NodeViewContext } from '@domternal/core';\n\n/** ProseMirror node shape passed to node views. */\ninterface PMNode {\n type: { name: string; spec: { group?: string } };\n attrs: Record<string, unknown>;\n textContent: string;\n nodeSize: number;\n}\n\n/**\n * Props passed to custom React node view components.\n */\nexport interface ReactNodeViewProps {\n /** The editor instance. */\n editor: Editor;\n /** The ProseMirror node being rendered. */\n node: PMNode;\n /** Whether this node is selected via NodeSelection. */\n selected: boolean;\n /** Get the document position of this node. */\n getPos: () => number;\n /** Update the node's attributes. */\n updateAttributes: (attrs: Record<string, unknown>) => void;\n /** Delete this node from the document. */\n deleteNode: () => void;\n /** The extension that created this node view (name, options). Injected by core. */\n extension: { name: string; options: Record<string, unknown> };\n /** ProseMirror decorations applied to this node. */\n decorations: unknown[];\n}\n\nexport interface ReactNodeViewRendererOptions {\n /** Wrapper element tag. @default 'div' for block, 'span' for inline */\n as?: string;\n /** Additional CSS class on the wrapper element. */\n className?: string;\n /** Tag for the content DOM element. Set to null for no editable content. @default 'div' */\n contentDOMElement?: string | null;\n}\n\n/**\n * Converts a React component into a ProseMirror NodeView constructor.\n *\n * Returns a function matching ProseMirror's native `(node, view, getPos, decorations)` signature.\n * The editor and extension context are automatically injected by core via `__domternalContext`.\n *\n * @example\n * ```ts\n * const ImageExtension = Image.extend({\n * addNodeView() {\n * return ReactNodeViewRenderer(ImageComponent);\n * }\n * });\n * ```\n *\n * @example Accessing extension options in the component\n * ```tsx\n * function ImageComponent({ node, extension, decorations }: ReactNodeViewProps) {\n * const maxWidth = extension.options.maxWidth as number;\n * return <NodeViewWrapper><img src={node.attrs.src} style={{ maxWidth }} /></NodeViewWrapper>;\n * }\n * ```\n */\nexport function ReactNodeViewRenderer(\n component: React.ComponentType<ReactNodeViewProps>,\n options: ReactNodeViewRendererOptions = {},\n) {\n // Return ProseMirror-compatible NodeViewConstructor: (node, view, getPos, decorations) => NodeView\n const constructor = (node: PMNode, _view: unknown, getPos: () => number, decorations: unknown[]) => {\n // Read context injected by core's ExtensionManager.collectNodeViews()\n const ctx = (constructor as unknown as { __domternalContext?: NodeViewContext }).__domternalContext;\n const editor = ctx?.editor as Editor;\n const extension = ctx?.extension ?? { name: node.type.name, options: {} };\n\n return new ReactNodeView(component, {\n editor,\n node,\n getPos,\n decorations,\n extension,\n }, options);\n };\n\n return constructor;\n}\n\ninterface ReactNodeViewInit {\n editor: Editor;\n node: PMNode;\n getPos: () => number;\n decorations: unknown[];\n extension: { name: string; options: Record<string, unknown> };\n}\n\nclass ReactNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement | null = null;\n private root: Root;\n private component: React.ComponentType<ReactNodeViewProps>;\n private editor: Editor;\n private node: PMNode;\n private getPos: () => number;\n private decorations: unknown[];\n private extension: { name: string; options: Record<string, unknown> };\n private selected = false;\n\n constructor(\n component: React.ComponentType<ReactNodeViewProps>,\n init: ReactNodeViewInit,\n options: ReactNodeViewRendererOptions,\n ) {\n this.component = component;\n this.editor = init.editor;\n this.node = init.node;\n this.getPos = init.getPos;\n this.decorations = init.decorations;\n this.extension = init.extension;\n\n const isInline = init.node.type.spec.group === 'inline';\n const tag = options.as ?? (isInline ? 'span' : 'div');\n\n this.dom = document.createElement(tag);\n this.dom.setAttribute('data-node-view-wrapper', '');\n if (options.className) {\n this.dom.className = options.className;\n }\n\n // Content DOM for editable nested content\n if (options.contentDOMElement !== null) {\n const contentTag = options.contentDOMElement ?? (isInline ? 'span' : 'div');\n this.contentDOM = document.createElement(contentTag);\n this.contentDOM.setAttribute('data-node-view-content', '');\n this.contentDOM.style.whiteSpace = 'pre-wrap';\n }\n\n this.root = createRoot(this.dom);\n this.render();\n }\n\n private render() {\n const contextValue: ReactNodeViewContextValue = {\n onDragStart: (event: DragEvent) => {\n if (this.editor.view.dragging) {\n event.dataTransfer?.setData('text/plain', this.node.textContent);\n }\n },\n nodeViewContentRef: (el: HTMLElement | null) => {\n if (el && this.contentDOM && !el.contains(this.contentDOM)) {\n el.appendChild(this.contentDOM);\n }\n },\n };\n\n const props: ReactNodeViewProps = {\n editor: this.editor,\n node: this.node,\n selected: this.selected,\n getPos: this.getPos,\n extension: this.extension,\n decorations: this.decorations,\n updateAttributes: (attrs) => {\n const pos = this.getPos();\n const { tr } = this.editor.view.state;\n tr.setNodeMarkup(pos, undefined, { ...this.node.attrs, ...attrs });\n this.editor.view.dispatch(tr);\n },\n deleteNode: () => {\n const pos = this.getPos();\n const { tr } = this.editor.view.state;\n tr.delete(pos, pos + this.node.nodeSize);\n this.editor.view.dispatch(tr);\n },\n };\n\n this.root.render(\n createElement(ReactNodeViewProvider, { value: contextValue },\n createElement(this.component, props),\n ),\n );\n }\n\n update(node: PMNode, decorations: unknown[]): boolean {\n if (node.type.name !== this.node.type.name) return false;\n this.node = node;\n this.decorations = decorations;\n this.render();\n return true;\n }\n\n selectNode() {\n this.selected = true;\n this.render();\n }\n\n deselectNode() {\n this.selected = false;\n this.render();\n }\n\n destroy() {\n // Defer unmount to avoid React warnings about synchronous unmount\n const root = this.root;\n setTimeout(() => root.unmount(), 0);\n }\n\n ignoreMutation(mutation: MutationRecord): boolean {\n if (!this.contentDOM) return true;\n return !this.contentDOM.contains(mutation.target);\n }\n\n stopEvent(): boolean {\n return false;\n }\n}\n","import { type ElementType, type HTMLAttributes } from 'react';\nimport { useReactNodeView } from './ReactNodeViewContext.js';\n\nexport interface NodeViewWrapperProps extends HTMLAttributes<HTMLElement> {\n /** The HTML element type to render. @default 'div' */\n as?: ElementType;\n}\n\n/**\n * Container component for custom React node views.\n * Handles drag events and marks the element as a node view wrapper.\n */\nexport function NodeViewWrapper({ as: Tag = 'div', style, ...props }: NodeViewWrapperProps) {\n const { onDragStart } = useReactNodeView();\n\n return (\n <Tag\n {...props}\n data-node-view-wrapper=\"\"\n style={{ whiteSpace: 'normal', ...style }}\n onDragStart={onDragStart}\n />\n );\n}\n","import { type ElementType, type HTMLAttributes } from 'react';\nimport { useReactNodeView } from './ReactNodeViewContext.js';\n\nexport interface NodeViewContentProps extends HTMLAttributes<HTMLElement> {\n /** The HTML element type to render. @default 'div' */\n as?: ElementType;\n}\n\n/**\n * Placeholder for editable nested content within a custom React node view.\n * ProseMirror manages the content DOM inside this element.\n */\nexport function NodeViewContent({ as: Tag = 'div', style, ...props }: NodeViewContentProps) {\n const { nodeViewContentRef } = useReactNodeView();\n\n return (\n <Tag\n {...props}\n ref={nodeViewContentRef}\n data-node-view-content=\"\"\n style={{ whiteSpace: 'pre-wrap', ...style }}\n />\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useEditor.ts","../src/useEditorState.ts","../src/EditorContext.tsx","../src/toolbar/useToolbarController.ts","../src/toolbar/useToolbarIcons.ts","../src/toolbar/useTooltip.ts","../src/toolbar/useKeyboardNav.ts","../src/toolbar/useComputedStyle.ts","../src/toolbar/ToolbarButton.tsx","../src/toolbar/ToolbarDropdownPanel.tsx","../src/toolbar/ToolbarDropdown.tsx","../src/toolbar/DomternalToolbar.tsx","../src/bubble-menu/useBubbleMenu.ts","../src/bubble-menu/DomternalBubbleMenu.tsx","../src/DomternalFloatingMenu.tsx","../src/emoji-picker/useEmojiPicker.ts","../src/emoji-picker/DomternalEmojiPicker.tsx","../src/Domternal.tsx","../src/DomternalEditor.tsx","../src/EditorContent.tsx","../src/notion-color-picker/useNotionColorPicker.ts","../src/notion-color-picker/DomternalNotionColorPicker.tsx","../src/node-views/ReactNodeViewContext.tsx","../src/node-views/ReactNodeViewRenderer.ts","../src/node-views/NodeViewWrapper.tsx","../src/node-views/NodeViewContent.tsx"],"names":["useRef","useState","useEffect","editable","useCallback","jsx","jsxs","ToolbarController","defaultIcons","DROPDOWN_CARET","useMemo","Fragment","positionFloatingOnce","PluginKey","controller","useLayoutEffect","DomternalEditor","setStorageOpen","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["import { type DependencyList, useEffect, useRef, useState } from 'react';\nimport {\n Editor,\n Document,\n Paragraph,\n Text,\n BaseKeymap,\n History,\n} from '@domternal/core';\nimport type { Content, AnyExtension, FocusPosition, TransactionEventProps, FocusEventProps } from '@domternal/core';\n\nexport const DEFAULT_EXTENSIONS: AnyExtension[] = [Document, Paragraph, Text, BaseKeymap, History];\n\nexport interface UseEditorOptions {\n /** Custom extensions to add to the editor. */\n extensions?: AnyExtension[];\n /** Initial editor content (HTML string or JSON). */\n content?: Content;\n /** Whether the editor is editable. @default true */\n editable?: boolean;\n /** Where to autofocus on mount. @default false */\n autofocus?: FocusPosition;\n /** Output format for content comparison. @default 'html' */\n outputFormat?: 'html' | 'json';\n /**\n * Set to false to delay editor creation to useEffect (SSR-safe).\n * When false, the editor will be null during server-side rendering\n * and created only after the component mounts in the browser.\n * @default true\n */\n immediatelyRender?: boolean;\n /** Called when the editor instance is created. */\n onCreate?: (editor: Editor) => void;\n /** Called when the document content changes. */\n onUpdate?: (props: { editor: Editor }) => void;\n /** Called when the selection changes without content change. */\n onSelectionChange?: (props: { editor: Editor }) => void;\n /** Called when the editor gains focus. */\n onFocus?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called when the editor loses focus. */\n onBlur?: (props: { editor: Editor; event: FocusEvent }) => void;\n /** Called before the editor is destroyed. */\n onDestroy?: () => void;\n}\n\n/**\n * Core hook for creating and managing a Domternal editor instance.\n *\n * @param options - Editor configuration\n * @param deps - Optional dependency array. When any value changes, the editor\n * is destroyed and recreated (content is preserved). Useful for dynamic\n * configuration that requires a full editor rebuild.\n *\n * @example\n * ```tsx\n * const { editor, editorRef } = useEditor({ extensions, content });\n * return <div className=\"dm-editor\"><div ref={editorRef} /></div>;\n * ```\n *\n * @example SSR-safe usage (Next.js)\n * ```tsx\n * const { editor, editorRef } = useEditor({\n * extensions,\n * content,\n * immediatelyRender: false,\n * });\n * ```\n *\n * @example With deps for forced recreation\n * ```tsx\n * const { editor, editorRef } = useEditor({ extensions, content }, [locale]);\n * // Editor is recreated when locale changes\n * ```\n */\nexport interface UseEditorResult {\n editor: Editor | null;\n editorRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function useEditor(options: UseEditorOptions = {}, deps?: DependencyList): UseEditorResult {\n const {\n extensions = [],\n content = '',\n editable = true,\n autofocus = false,\n outputFormat = 'html',\n } = options;\n\n const [editor, setEditor] = useState<Editor | null>(null);\n const editorRef = useRef<HTMLDivElement>(null);\n const instanceRef = useRef<Editor | null>(null);\n const pendingContentRef = useRef<Content | null>(null);\n\n // Store latest callbacks in refs to avoid stale closures\n const callbacksRef = useRef(options);\n callbacksRef.current = options;\n\n // Store latest content/format for comparison\n const contentRef = useRef(content);\n contentRef.current = content;\n const formatRef = useRef(outputFormat);\n formatRef.current = outputFormat;\n\n // Track extensions reference for recreation\n const extensionsRef = useRef(extensions);\n\n // Track deps for recreation\n const depsRef = useRef(deps);\n\n /** Wire transaction, focus, blur event handlers to an editor instance. */\n function wireEvents(ed: Editor): void {\n ed.on('transaction', ({ transaction }: TransactionEventProps) => {\n const cbs = callbacksRef.current;\n if (transaction.docChanged) {\n cbs.onUpdate?.({ editor: ed });\n }\n if (!transaction.docChanged && transaction.selectionSet) {\n cbs.onSelectionChange?.({ editor: ed });\n }\n });\n\n ed.on('focus', ({ event }: FocusEventProps) => {\n callbacksRef.current.onFocus?.({ editor: ed, event });\n });\n\n ed.on('blur', ({ event }: FocusEventProps) => {\n callbacksRef.current.onBlur?.({ editor: ed, event });\n });\n }\n\n /** Create editor and wire events. Returns the new instance. */\n function createEditorInstance(element: HTMLElement, initialContent: Content, focus: FocusPosition): Editor {\n const ed = new Editor({\n element,\n extensions: [...DEFAULT_EXTENSIONS, ...extensions],\n content: initialContent,\n editable,\n autofocus: focus,\n });\n\n wireEvents(ed);\n instanceRef.current = ed;\n extensionsRef.current = extensions;\n depsRef.current = deps;\n setEditor(ed);\n callbacksRef.current.onCreate?.(ed);\n return ed;\n }\n\n /** Destroy current editor, preserving content for recreation. */\n function destroyCurrentEditor(): void {\n const current = instanceRef.current;\n if (current && !current.isDestroyed) {\n pendingContentRef.current = current.getJSON();\n callbacksRef.current.onDestroy?.();\n current.destroy();\n }\n instanceRef.current = null;\n setEditor(null);\n }\n\n // Create editor on mount\n useEffect(() => {\n // Use the ref element if available, otherwise create a detached div\n // (composable pattern: Domternal.Content will adopt the DOM later)\n const element = editorRef.current ?? document.createElement('div');\n\n const initialContent = pendingContentRef.current ?? content;\n pendingContentRef.current = null;\n\n createEditorInstance(element, initialContent, autofocus);\n\n return () => {\n destroyCurrentEditor();\n };\n // Mount-only effect: refs (extensionsRef, depsRef, formatRef) and props are\n // intentionally omitted - separate effects below sync extensions, deps, content.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Sync editable\n useEffect(() => {\n if (instanceRef.current && !instanceRef.current.isDestroyed) {\n instanceRef.current.setEditable(editable);\n }\n }, [editable]);\n\n // Recreate editor when extensions change\n useEffect(() => {\n if (!instanceRef.current || instanceRef.current.isDestroyed) return;\n if (extensions === extensionsRef.current) return;\n\n const element = instanceRef.current.view.dom.parentElement ?? document.createElement('div');\n destroyCurrentEditor();\n const initialContent = pendingContentRef.current ?? '';\n pendingContentRef.current = null;\n createEditorInstance(element, initialContent, false);\n // Recreate only when extensions reference changes. Other refs are stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [extensions]);\n\n // Recreate editor when deps change\n useEffect(() => {\n if (!deps || !instanceRef.current || instanceRef.current.isDestroyed) return;\n // Skip if deps haven't actually changed (initial render)\n if (depsRef.current === deps) return;\n const prevDeps = depsRef.current;\n if (prevDeps?.length === deps.length\n && deps.every((d, i) => d === prevDeps[i])) {\n return;\n }\n\n const element = instanceRef.current.view.dom.parentElement ?? document.createElement('div');\n destroyCurrentEditor();\n const initialContent = pendingContentRef.current ?? '';\n pendingContentRef.current = null;\n createEditorInstance(element, initialContent, false);\n // Effect tracks the user-provided `deps` array directly; identity comparison\n // and shallow equality are handled above to avoid spurious recreations.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps ?? []);\n\n // Sync content from outside\n useEffect(() => {\n const ed = instanceRef.current;\n if (!ed || ed.isDestroyed) return;\n\n const format = formatRef.current;\n if (format === 'html') {\n if (content !== ed.getHTML()) {\n ed.setContent(content, false);\n }\n } else {\n if (JSON.stringify(content) !== JSON.stringify(ed.getJSON())) {\n ed.setContent(content, false);\n }\n }\n }, [content]);\n\n return { editor, editorRef };\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport type { Editor, JSONContent } from '@domternal/core';\n\n/**\n * Full editor state returned when no selector is provided.\n */\nexport interface EditorState {\n htmlContent: string;\n jsonContent: JSONContent | null;\n isEmpty: boolean;\n isFocused: boolean;\n isEditable: boolean;\n}\n\n/**\n * Subscribe to editor state changes.\n *\n * **Overload 1 - Full state:**\n * ```tsx\n * const { htmlContent, isEmpty } = useEditorState(editor);\n * ```\n *\n * **Overload 2 - Selector (granular, avoids unnecessary re-renders):**\n * ```tsx\n * const isBold = useEditorState(editor, (ed) => ed.isActive('bold'));\n * ```\n */\nexport function useEditorState(editor: Editor | null): EditorState;\nexport function useEditorState<T>(editor: Editor | null, selector: (editor: Editor) => T): T | undefined;\nexport function useEditorState<T>(\n editor: Editor | null,\n selector?: (editor: Editor) => T,\n): EditorState | T | undefined {\n // Runtime guard: selector presence must remain stable across renders for a\n // given call site. Switching modes would shift inner hook counts and corrupt\n // React's hook ordering. The guard below throws a clear error before that\n // corruption happens, instead of relying solely on the ESLint comment below.\n const isSelectorMode = typeof selector === 'function';\n const modeRef = useRef<boolean | null>(null);\n modeRef.current ??= isSelectorMode;\n if (modeRef.current !== isSelectorMode) {\n throw new Error('useEditorState selector mode must remain stable for a component instance.');\n }\n\n if (typeof selector === 'function') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useEditorStateSelector(editor, selector);\n }\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useEditorStateFull(editor);\n}\n\n// --- Full state mode ---\n\nfunction useEditorStateFull(editor: Editor | null): EditorState {\n const [state, setState] = useState<EditorState>(() => getFullState(editor));\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) {\n setState(getFullState(null));\n return;\n }\n\n // Set initial state\n setState(getFullState(editor));\n\n const onTransaction = ({ transaction }: { transaction: { docChanged: boolean } }): void => {\n setState(prev => {\n if (!transaction.docChanged) {\n const editable = editor.isEditable;\n if (prev.isEditable === editable) return prev;\n return { ...prev, isEditable: editable };\n }\n const html = editor.getHTML();\n const json = editor.getJSON();\n const empty = editor.isEmpty;\n const editable = editor.isEditable;\n if (prev.htmlContent === html && prev.isEmpty === empty && prev.isEditable === editable) return prev;\n return { ...prev, htmlContent: html, jsonContent: json, isEmpty: empty, isEditable: editable };\n });\n };\n\n const onFocus = (): void => {\n setState(prev => prev.isFocused ? prev : { ...prev, isFocused: true });\n };\n\n const onBlur = (): void => {\n setState(prev => !prev.isFocused ? prev : { ...prev, isFocused: false });\n };\n\n editor.on('transaction', onTransaction);\n editor.on('focus', onFocus);\n editor.on('blur', onBlur);\n\n return () => {\n editor.off('transaction', onTransaction);\n editor.off('focus', onFocus);\n editor.off('blur', onBlur);\n };\n }, [editor]);\n\n return state;\n}\n\nfunction getFullState(editor: Editor | null): EditorState {\n if (!editor || editor.isDestroyed) {\n return { htmlContent: '', jsonContent: null, isEmpty: true, isFocused: false, isEditable: true };\n }\n return {\n htmlContent: editor.getHTML(),\n jsonContent: editor.getJSON(),\n isEmpty: editor.isEmpty,\n isFocused: editor.isFocused,\n isEditable: editor.isEditable,\n };\n}\n\n// --- Selector mode (useSyncExternalStore) ---\n\nfunction useEditorStateSelector<T>(editor: Editor | null, selector: (editor: Editor) => T): T | undefined {\n const selectorRef = useRef(selector);\n selectorRef.current = selector;\n\n const subscribe = useCallback(\n (callback: () => void): (() => void) => {\n if (!editor || editor.isDestroyed) return () => { /* noop */ };\n\n editor.on('transaction', callback);\n editor.on('focus', callback);\n editor.on('blur', callback);\n\n return (): void => {\n editor.off('transaction', callback);\n editor.off('focus', callback);\n editor.off('blur', callback);\n };\n },\n [editor],\n );\n\n const getSnapshot = useCallback((): T | undefined => {\n if (!editor || editor.isDestroyed) return undefined;\n return selectorRef.current(editor);\n }, [editor]);\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Editor } from '@domternal/core';\n\ninterface EditorContextValue {\n editor: Editor | null;\n}\n\nconst EditorContext = createContext<EditorContextValue>({ editor: null });\n\nexport interface EditorProviderProps {\n /** The editor instance to provide to descendants. */\n editor: Editor | null;\n children: ReactNode;\n}\n\n/**\n * Provides an editor instance to all descendant components via React Context.\n *\n * Components like DomternalToolbar, DomternalBubbleMenu, DomternalFloatingMenu,\n * and DomternalEmojiPicker will automatically use this editor when no explicit\n * `editor` prop is passed.\n *\n * @example\n * ```tsx\n * const { editor } = useEditor({ extensions, content });\n *\n * <EditorProvider editor={editor}>\n * <DomternalToolbar />\n * <EditorContent editor={editor} />\n * <DomternalBubbleMenu contexts={{ text: ['bold', 'italic'] }} />\n * </EditorProvider>\n * ```\n */\nexport function EditorProvider({ editor, children }: EditorProviderProps): ReactNode {\n const value = useMemo<EditorContextValue>(() => ({ editor }), [editor]);\n return <EditorContext.Provider value={value}>{children}</EditorContext.Provider>;\n}\n\n/**\n * Access the editor instance from the nearest EditorProvider.\n * Returns `{ editor: null }` when used outside a provider, no throw.\n */\nexport function useCurrentEditor(): EditorContextValue {\n return useContext(EditorContext);\n}\n","import { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n ToolbarController,\n positionFloatingOnce,\n} from '@domternal/core';\nimport type {\n Editor,\n ToolbarButton,\n ToolbarDropdown,\n ToolbarControllerEditor,\n ToolbarGroup,\n ToolbarLayoutEntry,\n} from '@domternal/core';\n\nexport interface UseToolbarControllerResult {\n controller: RefObject<ToolbarController | null>;\n groups: ToolbarGroup[];\n focusedIndex: number;\n openDropdown: string | null;\n activeVersion: number;\n toolbarRef: RefObject<HTMLDivElement | null>;\n isActive: (name: string) => boolean;\n isDisabled: (name: string) => boolean;\n isDropdownActive: (dropdown: ToolbarDropdown) => boolean;\n getAriaExpanded: (item: ToolbarButton) => string | null;\n getFlatIndex: (name: string) => number;\n handleDropdownToggle: (dropdown: ToolbarDropdown) => void;\n closeDropdown: () => void;\n syncState: () => void;\n}\n\nexport function useToolbarController(\n editor: Editor | null,\n layout?: ToolbarLayoutEntry[],\n): UseToolbarControllerResult {\n const [groups, setGroups] = useState<ToolbarGroup[]>([]);\n const [focusedIndex, setFocusedIndex] = useState(0);\n const [openDropdown, setOpenDropdown] = useState<string | null>(null);\n const [activeVersion, setActiveVersion] = useState(0);\n\n const controllerRef = useRef<ToolbarController | null>(null);\n const toolbarRef = useRef<HTMLDivElement>(null);\n const cleanupFloatingRef = useRef<(() => void) | null>(null);\n const clickOutsideRef = useRef<((e: Event) => void) | null>(null);\n const dismissOverlayRef = useRef<(() => void) | null>(null);\n const editorElRef = useRef<HTMLElement | null>(null);\n\n const syncStateRafRef = useRef(0);\n const syncState = useCallback((): void => {\n // Defer state update to next animation frame so it doesn't interrupt\n // the current event cycle (e.g. mousedown → click on toolbar buttons).\n // Without this, a no-op transaction between mousedown and click causes\n // React to re-render and replace DOM nodes, swallowing the click event.\n cancelAnimationFrame(syncStateRafRef.current);\n syncStateRafRef.current = requestAnimationFrame(() => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n const controllerGroups = controller.groups;\n setGroups(prev => prev.length !== controllerGroups.length ? controllerGroups : prev);\n setFocusedIndex(controller.focusedIndex);\n setOpenDropdown(controller.openDropdown);\n setActiveVersion(v => v + 1);\n });\n }, []);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n const controller = new ToolbarController(\n editor as unknown as ToolbarControllerEditor,\n syncState,\n layout,\n );\n controller.subscribe();\n controllerRef.current = controller;\n syncState();\n\n // Click outside to close dropdown\n const clickOutside = (e: Event): void => {\n if (controller.openDropdown && toolbarRef.current && !toolbarRef.current.contains(e.target as Node)) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.closeDropdown();\n syncState();\n }\n };\n clickOutsideRef.current = clickOutside;\n document.addEventListener('mousedown', clickOutside);\n\n // Dismiss overlays (e.g. table handle clicks)\n const editorEl = editor.view.dom.closest<HTMLElement>('.dm-editor');\n editorElRef.current = editorEl;\n if (editorEl) {\n const dismiss = (): void => {\n if (controller.openDropdown) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.closeDropdown();\n syncState();\n }\n };\n dismissOverlayRef.current = dismiss;\n editorEl.addEventListener('dm:dismiss-overlays', dismiss);\n }\n\n return () => {\n cancelAnimationFrame(syncStateRafRef.current);\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n\n if (clickOutsideRef.current) {\n document.removeEventListener('mousedown', clickOutsideRef.current);\n clickOutsideRef.current = null;\n }\n\n if (dismissOverlayRef.current && editorElRef.current) {\n editorElRef.current.removeEventListener('dm:dismiss-overlays', dismissOverlayRef.current);\n dismissOverlayRef.current = null;\n editorElRef.current = null;\n }\n\n controller.destroy();\n controllerRef.current = null;\n };\n }, [editor, layout, syncState]);\n\n const isActive = useCallback((name: string): boolean => {\n // activeVersion used in component render to subscribe to changes\n return controllerRef.current?.activeMap.get(name) ?? false;\n }, []);\n\n const isDisabled = useCallback((name: string): boolean => {\n return controllerRef.current?.disabledMap.get(name) ?? false;\n }, []);\n\n const isDropdownActive = useCallback((dropdown: ToolbarDropdown): boolean => {\n if (dropdown.layout === 'grid') return false;\n if (dropdown.dynamicLabel) return false;\n const controller = controllerRef.current;\n if (!controller) return false;\n return dropdown.items.some((item: ToolbarButton) => controller.activeMap.get(item.name) ?? false);\n }, []);\n\n const getAriaExpanded = useCallback((item: ToolbarButton): string | null => {\n if (!item.emitEvent) return null;\n return controllerRef.current?.expandedMap.get(item.name) ? 'true' : null;\n }, []);\n\n const getFlatIndex = useCallback((name: string): number => {\n return controllerRef.current?.getFlatIndex(name) ?? -1;\n }, []);\n\n const handleDropdownToggle = useCallback((dropdown: ToolbarDropdown): void => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controller.toggleDropdown(dropdown.name);\n syncState();\n\n if (controller.openDropdown) {\n requestAnimationFrame(() => {\n const trigger = toolbarRef.current?.querySelector<HTMLElement>('[aria-expanded=\"true\"]');\n const panel = trigger?.parentElement?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\n if (trigger && panel) {\n const placement = dropdown.layout === 'grid' ? 'bottom' : 'bottom-start';\n cleanupFloatingRef.current = positionFloatingOnce(trigger, panel, {\n placement,\n offsetValue: 4,\n });\n }\n });\n }\n }, [syncState]);\n\n const closeDropdown = useCallback((): void => {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n controllerRef.current?.closeDropdown();\n syncState();\n }, [syncState]);\n\n return {\n controller: controllerRef,\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n syncState,\n };\n}\n","import { useCallback, useRef } from 'react';\nimport { defaultIcons } from '@domternal/core';\nimport type { IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport const DROPDOWN_CARET = '<svg class=\"dm-dropdown-caret\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\"><path d=\"M2 4l3 3 3-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\nexport interface UseToolbarIconsResult {\n resolveIconSvg: (name: string) => string;\n getCachedIcon: (name: string) => string;\n getCachedTriggerLabel: (label: string, isIcon?: boolean) => string;\n getCachedTriggerIcon: (iconName: string) => string;\n getCachedItemContent: (iconName: string, label: string, displayMode?: 'icon-text' | 'text' | 'icon') => string;\n getDropdownTriggerHtml: (dropdown: ToolbarDropdown, activeItem: ToolbarButton | undefined) => string;\n}\n\nexport function useToolbarIcons(icons?: IconSet | null): UseToolbarIconsResult {\n const cacheRef = useRef(new Map<string, string>());\n const prevIconsRef = useRef(icons);\n\n // Clear cache when icons source changes\n if (icons !== prevIconsRef.current) {\n cacheRef.current.clear();\n prevIconsRef.current = icons;\n }\n\n const resolveIconSvg = useCallback((name: string): string => {\n if (icons) {\n return icons[name] ?? '';\n }\n return defaultIcons[name] ?? '';\n }, [icons]);\n\n const getCachedIcon = useCallback((name: string): string => {\n const cache = cacheRef.current;\n const key = `i:${name}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(name);\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedTriggerLabel = useCallback((label: string, isIcon?: boolean): string => {\n const cache = cacheRef.current;\n const key = `tl:${label}:${isIcon ? '1' : '0'}`;\n let cached = cache.get(key);\n if (!cached) {\n const content = isIcon ? resolveIconSvg(label) : label;\n cached = `<span class=\"dm-toolbar-trigger-label\">${content}</span>${DROPDOWN_CARET}`;\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedTriggerIcon = useCallback((iconName: string): string => {\n const cache = cacheRef.current;\n const key = `t:${iconName}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(iconName) + DROPDOWN_CARET;\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getCachedItemContent = useCallback((\n iconName: string,\n label: string,\n displayMode?: 'icon-text' | 'text' | 'icon',\n ): string => {\n const mode = displayMode ?? 'icon-text';\n const cache = cacheRef.current;\n const key = `dc:${iconName}:${label}:${mode}`;\n let cached = cache.get(key);\n if (!cached) {\n if (mode === 'text') {\n cached = label;\n } else if (mode === 'icon') {\n cached = resolveIconSvg(iconName);\n } else {\n cached = resolveIconSvg(iconName) + ' ' + label;\n }\n cache.set(key, cached);\n }\n return cached;\n }, [resolveIconSvg]);\n\n const getDropdownTriggerHtml = useCallback((\n dropdown: ToolbarDropdown,\n activeItem: ToolbarButton | undefined,\n ): string => {\n if (dropdown.layout === 'grid') {\n const color = activeItem?.color ?? dropdown.defaultIndicatorColor ?? null;\n const cache = cacheRef.current;\n const key = `tr:${dropdown.icon}:${color ?? ''}`;\n let cached = cache.get(key);\n if (!cached) {\n cached = resolveIconSvg(dropdown.icon) + DROPDOWN_CARET;\n if (color) {\n cached += `<span class=\"dm-toolbar-color-indicator\" style=\"background-color: ${color}\"></span>`;\n }\n cache.set(key, cached);\n }\n return cached;\n }\n\n if (dropdown.dynamicLabel) {\n if (activeItem) return getCachedTriggerLabel(activeItem.label);\n if (dropdown.dynamicLabelFallback) return getCachedTriggerLabel(dropdown.dynamicLabelFallback);\n return getCachedTriggerLabel(dropdown.icon, true);\n }\n\n const icon = dropdown.dynamicIcon && activeItem ? activeItem.icon : dropdown.icon;\n return getCachedTriggerIcon(icon);\n }, [resolveIconSvg, getCachedTriggerLabel, getCachedTriggerIcon]);\n\n return {\n resolveIconSvg,\n getCachedIcon,\n getCachedTriggerLabel,\n getCachedTriggerIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n };\n}\n","import { useCallback } from 'react';\nimport type { ToolbarButton } from '@domternal/core';\n\nconst isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.userAgent);\n\nexport function useTooltip(): { getTooltip: (item: ToolbarButton) => string } {\n const getTooltip = useCallback((item: ToolbarButton): string => {\n if (item.shortcut) {\n const parts = item.shortcut.split('-');\n const mapped = parts.map((p: string) => {\n if (p === 'Mod') return isMac ? '\\u2318' : 'Ctrl';\n if (p === 'Shift') return isMac ? '\\u21E7' : 'Shift';\n if (p === 'Alt') return isMac ? '\\u2325' : 'Alt';\n return p.toUpperCase();\n });\n const shortcut = isMac ? mapped.join('') : mapped.join('+');\n return `${item.label} (${shortcut})`;\n }\n return item.label;\n }, []);\n\n return { getTooltip };\n}\n","import { useCallback } from 'react';\nimport type { ToolbarController } from '@domternal/core';\n\nexport function useKeyboardNav(\n controllerRef: React.RefObject<ToolbarController | null>,\n toolbarRef: React.RefObject<HTMLDivElement | null>,\n closeDropdown: () => void,\n): {\n onKeyDown: (event: React.KeyboardEvent) => void;\n focusCurrentButton: () => void;\n} {\n const focusCurrentButton = useCallback((): void => {\n const idx = controllerRef.current?.focusedIndex ?? 0;\n const buttons = toolbarRef.current?.querySelectorAll<HTMLButtonElement>('.dm-toolbar-button');\n buttons?.[idx]?.focus();\n }, [controllerRef, toolbarRef]);\n\n const focusDropdownItem = useCallback((direction: number, first?: boolean): void => {\n const panel = toolbarRef.current?.querySelector<HTMLElement>('.dm-toolbar-dropdown-panel');\n if (!panel) return;\n const items = Array.from(panel.querySelectorAll<HTMLElement>('[role=\"menuitem\"]'));\n if (!items.length) return;\n if (first) { items[0]?.focus(); return; }\n const current = document.activeElement as HTMLElement;\n const idx = items.indexOf(current);\n const next = idx === -1\n ? (direction > 0 ? 0 : items.length - 1)\n : (idx + direction + items.length) % items.length;\n items[next]?.focus();\n }, [toolbarRef]);\n\n const onKeyDown = useCallback((event: React.KeyboardEvent): void => {\n const controller = controllerRef.current;\n if (!controller) return;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n controller.navigateNext();\n focusCurrentButton();\n break;\n case 'ArrowLeft':\n event.preventDefault();\n controller.navigatePrev();\n focusCurrentButton();\n break;\n case 'ArrowDown': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(1);\n } else {\n const btn = document.activeElement as HTMLElement | null;\n if (btn?.getAttribute('aria-haspopup') && btn.closest('.dm-toolbar')) {\n btn.click();\n requestAnimationFrame(() => { focusDropdownItem(0, true); });\n }\n }\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n if (controller.openDropdown) {\n focusDropdownItem(-1);\n }\n break;\n }\n case 'Home':\n event.preventDefault();\n controller.navigateFirst();\n focusCurrentButton();\n break;\n case 'End':\n event.preventDefault();\n controller.navigateLast();\n focusCurrentButton();\n break;\n case 'Escape':\n if (controller.openDropdown) {\n event.preventDefault();\n closeDropdown();\n focusCurrentButton();\n }\n break;\n }\n }, [closeDropdown, focusCurrentButton, focusDropdownItem, controllerRef]);\n\n return { onKeyDown, focusCurrentButton };\n}\n","import type { Editor } from '@domternal/core';\n\n/**\n * Read a CSS property value at the current cursor position.\n * Prefers inline style (explicit mark) over computed style (inherited).\n */\nexport function getComputedStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const resolved = editor.view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop)\n || window.getComputedStyle(el).getPropertyValue(prop)\n || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read only inline style at the current cursor position (no computed fallback).\n * Used for font-family to avoid reading browser default inheritance.\n */\nexport function getInlineStyleAtCursor(editor: Editor, prop: string): string | null {\n try {\n const { from } = editor.state.selection;\n const resolved = editor.view.domAtPos(from);\n const el = resolved.node instanceof HTMLElement\n ? resolved.node\n : resolved.node.parentElement;\n if (!el) return null;\n return el.style.getPropertyValue(prop) || null;\n } catch {\n return null;\n }\n}\n","import type { ReactNode } from 'react';\nimport type { ToolbarButton as ToolbarButtonType } from '@domternal/core';\n\nexport interface ToolbarButtonProps {\n item: ToolbarButtonType;\n isActive: boolean;\n isDisabled: boolean;\n tabIndex: number;\n tooltip: string;\n iconHtml: string;\n ariaExpanded?: string | null;\n onClick: (item: ToolbarButtonType, event: React.MouseEvent) => void;\n onFocus: (name: string) => void;\n}\n\nexport function ToolbarButton({\n item,\n isActive,\n isDisabled,\n tabIndex,\n tooltip,\n iconHtml,\n ariaExpanded,\n onClick,\n onFocus,\n}: ToolbarButtonProps): ReactNode {\n return (\n <button\n type=\"button\"\n className={`dm-toolbar-button${isActive ? ' dm-toolbar-button--active' : ''}`}\n aria-pressed={isActive}\n aria-expanded={ariaExpanded === 'true' ? true : undefined}\n aria-label={item.label}\n title={tooltip}\n tabIndex={tabIndex}\n disabled={isDisabled}\n dangerouslySetInnerHTML={{ __html: iconHtml }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={(e) => { onClick(item, e); }}\n onFocus={() => { onFocus(item.name); }}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport type { ToolbarButton, ToolbarDropdown } from '@domternal/core';\n\nexport interface ToolbarDropdownPanelProps {\n dropdown: ToolbarDropdown;\n isActive: (name: string) => boolean;\n getCachedItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n onItemClick: (item: ToolbarButton, event: React.MouseEvent) => void;\n}\n\nexport function ToolbarDropdownPanel({\n dropdown,\n isActive,\n getCachedItemContent,\n onItemClick,\n}: ToolbarDropdownPanelProps): ReactNode {\n if (dropdown.layout === 'grid') {\n return (\n <div\n className=\"dm-toolbar-dropdown-panel dm-color-palette\"\n role=\"menu\"\n style={{ '--dm-palette-columns': String(dropdown.gridColumns ?? 10) } as React.CSSProperties}\n >\n {dropdown.items.map((sub: ToolbarButton) =>\n sub.color ? (\n <button\n key={sub.name}\n type=\"button\"\n className={`dm-color-swatch${isActive(sub.name) ? ' dm-color-swatch--active' : ''}`}\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n title={sub.label}\n style={{ backgroundColor: sub.color }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={(e) => { onItemClick(sub, e); }}\n />\n ) : (\n <button\n key={sub.name}\n type=\"button\"\n className=\"dm-color-palette-reset\"\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n dangerouslySetInnerHTML={{ __html: getCachedItemContent(sub.icon, sub.label) }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={(e) => { onItemClick(sub, e); }}\n />\n ),\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"dm-toolbar-dropdown-panel\"\n role=\"menu\"\n data-display-mode={dropdown.displayMode ?? null}\n >\n {dropdown.items.map((sub: ToolbarButton) => (\n <button\n key={sub.name}\n type=\"button\"\n className={`dm-toolbar-dropdown-item${isActive(sub.name) ? ' dm-toolbar-dropdown-item--active' : ''}`}\n role=\"menuitem\"\n tabIndex={-1}\n aria-label={sub.label}\n ref={(el: HTMLButtonElement | null) => { if (el && sub.style) el.setAttribute('style', sub.style); }}\n dangerouslySetInnerHTML={{ __html: getCachedItemContent(sub.icon, sub.label, dropdown.displayMode) }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={(e) => { onItemClick(sub, e); }}\n />\n ))}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { ToolbarButton, ToolbarDropdown as ToolbarDropdownType } from '@domternal/core';\nimport { ToolbarDropdownPanel } from './ToolbarDropdownPanel.js';\n\nexport interface ToolbarDropdownProps {\n dropdown: ToolbarDropdownType;\n isOpen: boolean;\n isActive: (name: string) => boolean;\n isDropdownActive: boolean;\n isDisabled: boolean;\n tabIndex: number;\n triggerHtml: string;\n getCachedItemContent: (icon: string, label: string, mode?: 'icon-text' | 'text' | 'icon') => string;\n onToggle: (dropdown: ToolbarDropdownType) => void;\n onItemClick: (item: ToolbarButton, event: React.MouseEvent) => void;\n onFocus: (name: string) => void;\n}\n\nexport function ToolbarDropdown({\n dropdown,\n isOpen,\n isActive,\n isDropdownActive,\n isDisabled,\n tabIndex,\n triggerHtml,\n getCachedItemContent,\n onToggle,\n onItemClick,\n onFocus,\n}: ToolbarDropdownProps): ReactNode {\n return (\n <div className=\"dm-toolbar-dropdown-wrapper\">\n <button\n type=\"button\"\n className={`dm-toolbar-button dm-toolbar-dropdown-trigger${isDropdownActive ? ' dm-toolbar-button--active' : ''}`}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={dropdown.label}\n title={dropdown.label}\n tabIndex={tabIndex}\n disabled={isDisabled}\n data-dropdown={dropdown.name}\n dangerouslySetInnerHTML={{ __html: triggerHtml }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { onToggle(dropdown); }}\n onFocus={() => { onFocus(dropdown.name); }}\n />\n {isOpen && (\n <ToolbarDropdownPanel\n dropdown={dropdown}\n isActive={isActive}\n getCachedItemContent={getCachedItemContent}\n onItemClick={onItemClick}\n />\n )}\n </div>\n );\n}\n","import { Fragment, useCallback, type ReactNode } from 'react';\nimport type {\n Editor,\n IconSet,\n ToolbarButton as ToolbarButtonType,\n ToolbarItem,\n ToolbarLayoutEntry,\n} from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useToolbarController } from './useToolbarController.js';\nimport { useToolbarIcons, DROPDOWN_CARET } from './useToolbarIcons.js';\nimport { useTooltip } from './useTooltip.js';\nimport { useKeyboardNav } from './useKeyboardNav.js';\nimport { getComputedStyleAtCursor, getInlineStyleAtCursor } from './useComputedStyle.js';\nimport { ToolbarButton } from './ToolbarButton.js';\nimport { ToolbarDropdown } from './ToolbarDropdown.js';\n\nexport interface DomternalToolbarProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom icon set. When provided, only these icons are used (no defaultIcons fallback). */\n icons?: IconSet;\n /** Custom toolbar layout. */\n layout?: ToolbarLayoutEntry[];\n}\n\nexport function DomternalToolbar({ editor: editorProp, icons, layout }: DomternalToolbarProps): ReactNode {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const {\n controller: controllerRef,\n groups,\n focusedIndex,\n openDropdown,\n activeVersion,\n toolbarRef,\n isActive,\n isDisabled,\n isDropdownActive,\n getAriaExpanded,\n getFlatIndex,\n handleDropdownToggle,\n closeDropdown,\n } = useToolbarController(editor, layout);\n\n const {\n getCachedIcon,\n getCachedItemContent,\n getDropdownTriggerHtml,\n } = useToolbarIcons(icons);\n\n const { getTooltip } = useTooltip();\n const { onKeyDown } = useKeyboardNav(controllerRef, toolbarRef, closeDropdown);\n\n const onButtonClick = useCallback((item: ToolbarButtonType, event: React.MouseEvent): void => {\n if (!editor) return;\n\n // Close any open dropdown first\n if (controllerRef.current?.openDropdown) {\n closeDropdown();\n }\n\n if (item.emitEvent) {\n const anchor = event.currentTarget as HTMLElement;\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n controllerRef.current?.executeCommand(item);\n\n // Always refocus editor after executing a command via toolbar button.\n // Mouse clicks already keep focus via mousedown.preventDefault();\n // keyboard activations (Enter/Space) need explicit refocus.\n requestAnimationFrame(() => { editor.view.focus(); });\n }, [editor, closeDropdown, controllerRef]);\n\n const onDropdownItemClick = useCallback((item: ToolbarButtonType, event: React.MouseEvent): void => {\n if (!editor) return;\n\n let anchor: HTMLElement | undefined;\n if (item.emitEvent) {\n const wrapper = (event.currentTarget as HTMLElement).closest('.dm-toolbar-dropdown-wrapper');\n anchor = wrapper?.querySelector<HTMLElement>('.dm-toolbar-dropdown-trigger') ?? undefined;\n }\n\n closeDropdown();\n\n if (item.emitEvent) {\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n } else {\n controllerRef.current?.executeCommand(item);\n }\n\n // Refocus editor so ::selection highlight stays visible\n requestAnimationFrame(() => { editor.view.focus(); });\n }, [editor, closeDropdown, controllerRef]);\n\n const onButtonFocus = useCallback((name: string): void => {\n const index = controllerRef.current?.getFlatIndex(name) ?? -1;\n if (index >= 0) {\n controllerRef.current?.setFocusedIndex(index);\n }\n }, [controllerRef]);\n\n // Force re-read of activeVersion in render to subscribe to state changes\n void activeVersion;\n\n if (!editor) return null;\n\n return (\n <div\n ref={toolbarRef}\n className=\"dm-toolbar\"\n role=\"toolbar\"\n aria-label=\"Editor formatting\"\n data-dm-editor-ui=\"\"\n onKeyDown={onKeyDown}\n >\n {groups.map((group, gi) => (\n <Fragment key={group.name}>\n {gi > 0 && <div className=\"dm-toolbar-separator\" role=\"separator\" />}\n <div className=\"dm-toolbar-group\" role=\"group\" aria-label={group.name || 'Tools'}>\n {group.items.map((item: ToolbarItem) => {\n if (item.type === 'button') {\n const btn = item;\n return (\n <ToolbarButton\n key={btn.name}\n item={btn}\n isActive={isActive(btn.name)}\n isDisabled={isDisabled(btn.name)}\n tabIndex={getFlatIndex(btn.name) === focusedIndex ? 0 : -1}\n tooltip={getTooltip(btn)}\n iconHtml={getCachedIcon(btn.icon)}\n ariaExpanded={getAriaExpanded(btn)}\n onClick={onButtonClick}\n onFocus={onButtonFocus}\n />\n );\n }\n if (item.type === 'dropdown') {\n const dd = item;\n const activeItem = dd.items.find((sub: ToolbarButtonType) => controllerRef.current?.activeMap.get(sub.name));\n\n // Handle dynamic label with computed style\n let triggerHtml = getDropdownTriggerHtml(dd, activeItem);\n if (dd.dynamicLabel && !activeItem && dd.computedStyleProperty) {\n let computed: string | null;\n if (dd.computedStyleProperty === 'font-family') {\n computed = getInlineStyleAtCursor(editor, dd.computedStyleProperty);\n if (computed) {\n const first = computed.split(',')[0]?.replace(/['\"]+/g, '').trim();\n computed = first ?? null;\n }\n } else {\n computed = getComputedStyleAtCursor(editor, dd.computedStyleProperty);\n }\n if (computed) {\n // Re-generate trigger with computed value\n triggerHtml = `<span class=\"dm-toolbar-trigger-label\">${computed}</span>${DROPDOWN_CARET}`;\n }\n }\n\n return (\n <ToolbarDropdown\n key={dd.name}\n dropdown={dd}\n isOpen={openDropdown === dd.name}\n isActive={isActive}\n isDropdownActive={isDropdownActive(dd)}\n isDisabled={isDisabled(dd.name)}\n tabIndex={getFlatIndex(dd.name) === focusedIndex ? 0 : -1}\n triggerHtml={triggerHtml}\n getCachedItemContent={getCachedItemContent}\n onToggle={handleDropdownToggle}\n onItemClick={onDropdownItemClick}\n onFocus={onButtonFocus}\n />\n );\n }\n return null;\n })}\n </div>\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type MouseEvent as ReactMouseEvent, type RefObject } from 'react';\nimport {\n PluginKey,\n ToolbarController,\n createBubbleMenuPlugin,\n defaultBubbleContexts,\n defaultIcons,\n} from '@domternal/core';\nimport type { Editor, IconSet, ToolbarButton, ToolbarDropdown, BubbleMenuOptions } from '@domternal/core';\n\n// --- Duck-typed ProseMirror shapes (avoids instanceof across bundles) ---\n\ninterface ResolvedPosShape {\n parent: { type: { name: string; spec: { marks?: string } } };\n depth: number;\n node: (depth: number) => { type: { name: string } };\n}\n\ninterface SelectionShape {\n empty: boolean;\n $from: ResolvedPosShape;\n $to: ResolvedPosShape;\n node?: { type: { name: string } };\n}\n\ninterface SchemaShape {\n nodes: Record<string, { allowsMarkType: (mt: unknown) => boolean }>;\n marks: Record<string, unknown>;\n}\n\ninterface BubbleMenuSeparator { type: 'separator'; name: string }\nexport type BubbleMenuItem = ToolbarButton | ToolbarDropdown | BubbleMenuSeparator;\n\n/**\n * Live state for the bubble-menu trailing buttons. Mirrors Angular's\n * `syncTrailingButtonsState` output. Computed per editor transaction and\n * coalesced into a single object so each transaction triggers at most one\n * re-render.\n */\nexport interface BubbleMenuTrailingState {\n /** True when current selection is a NodeSelection (image, HR, ...). Trailing buttons hide in that case. */\n isNodeSelection: boolean;\n /** True when the `notionColorPicker` extension is loaded on this editor (cached once per editor). */\n showColorPickerButton: boolean;\n /** True when the `blockContextMenu` extension is loaded on this editor (cached once per editor). */\n showBlockMenuButton: boolean;\n /** True when the selection spans more than one top-level block (multi-block \"...\" disable). */\n blockMenuButtonDisabled: boolean;\n /** CSS color value for the \"A\" trigger glyph (e.g. `var(--dm-block-text-yellow)`), or null. */\n currentTextColorVar: string | null;\n /** CSS color value for the \"A\" trigger underline, or null. */\n currentBgColorVar: string | null;\n /** True when any token-based text or background color is applied at the cursor. */\n hasAnyColor: boolean;\n}\n\nconst INITIAL_TRAILING_STATE: BubbleMenuTrailingState = {\n isNodeSelection: false,\n showColorPickerButton: false,\n showBlockMenuButton: false,\n blockMenuButtonDisabled: false,\n currentTextColorVar: null,\n currentBgColorVar: null,\n hasAnyColor: false,\n};\n\nfunction isInsideTableCell($pos: ResolvedPosShape): boolean {\n for (let d = $pos.depth; d > 0; d--) {\n const name = $pos.node(d).type.name;\n if (name === 'tableCell' || name === 'tableHeader') return true;\n }\n return false;\n}\n\nfunction findCellNode(pos: ResolvedPosShape): { type: { name: string } } | null {\n for (let d = pos.depth; d > 0; d--) {\n const node = pos.node(d);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') return node;\n }\n return null;\n}\n\n// --- Hook ---\n\nexport interface UseBubbleMenuOptions {\n editor: Editor | null;\n shouldShow?: BubbleMenuOptions['shouldShow'] | undefined;\n placement?: 'top' | 'bottom' | undefined;\n offset?: number | undefined;\n updateDelay?: number | undefined;\n items?: string[] | undefined;\n contexts?: Record<string, string[] | true | null> | undefined;\n icons?: IconSet | undefined;\n}\n\nexport interface UseBubbleMenuResult {\n menuRef: RefObject<HTMLDivElement | null>;\n resolvedItems: BubbleMenuItem[];\n isItemActive: (item: ToolbarButton) => boolean;\n isItemDisabled: (item: ToolbarButton) => boolean;\n executeCommand: (item: ToolbarButton, event?: ReactMouseEvent | MouseEvent) => void;\n activeVersion: number;\n getCachedIcon: (name: string) => string;\n /** Live trailing-button state (color preview, node-selection gate, multi-block disable). */\n trailing: BubbleMenuTrailingState;\n /** Open the Notion color picker by emitting `notionColorOpen` with the trigger as anchor. */\n openColorPicker: (anchor: HTMLElement) => void;\n /** Open the block context menu by dispatching `dm:block-context-menu-open` on `.dm-editor`. */\n openBlockContextMenu: (anchor: HTMLElement) => void;\n}\n\nexport function useBubbleMenu(options: UseBubbleMenuOptions): UseBubbleMenuResult {\n const { editor, shouldShow, placement = 'top', offset = 8, updateDelay = 0, items, contexts: explicitContexts, icons } = options;\n // Synthesise default contexts when the consumer hasn't supplied either\n // `contexts` or `items`. The default depends on the `.dm-notion-mode`\n // ancestor class so Notion-style hosts get a richer toolbar without\n // having to repeat the same `contexts` object in every <BubbleMenu>.\n const contexts = explicitContexts ?? (items ? undefined : (editor ? defaultBubbleContexts(editor) : undefined));\n\n const menuRef = useRef<HTMLDivElement>(null);\n const pluginKeyRef = useRef(new PluginKey('reactBubbleMenu-' + (\n (globalThis as { crypto?: { randomUUID?: () => string } }).crypto?.randomUUID?.().slice(0, 8)\n ?? Math.random().toString(36).slice(2, 8)\n )));\n const [resolvedItems, setResolvedItems] = useState<BubbleMenuItem[]>([]);\n const [activeVersion, setActiveVersion] = useState(0);\n const [trailing, setTrailing] = useState<BubbleMenuTrailingState>(INITIAL_TRAILING_STATE);\n\n const activeMapRef = useRef(new Map<string, boolean>());\n const disabledMapRef = useRef(new Map<string, boolean>());\n const itemMapRef = useRef(new Map<string, ToolbarButton>());\n const bubbleDefaultsRef = useRef(new Map<string, BubbleMenuItem[]>());\n const resolvedItemsRef = useRef<BubbleMenuItem[]>([]);\n // Cached \"live\" editor used by the hook's callbacks. The hook only re-runs\n // its big effect on editor changes, but the returned callbacks need to read\n // the current editor on each invocation - stash it in a ref to avoid stale\n // closures when the consumer holds the callback across re-renders.\n const editorRef = useRef<Editor | null>(editor);\n editorRef.current = editor;\n\n useEffect(() => {\n if (!editor || editor.isDestroyed || !menuRef.current) return;\n\n // Extension presence is immutable after editor construction (D4 in\n // _planning/react_notion.md): cache once instead of walking the\n // extension list on every transaction.\n const exts = editor.extensionManager.extensions;\n const hasNotionColorPicker = exts.some((e) => e.name === 'notionColorPicker');\n const hasBlockContextMenu = exts.some((e) => e.name === 'blockContextMenu');\n\n // Build item map. Dropdowns are kept separately so we can resolve them\n // by name (text-align dropdown in the bubble menu).\n const itemMap = new Map<string, ToolbarButton>();\n const dropdownMap = new Map<string, ToolbarDropdown>();\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 itemMapRef.current = itemMap;\n\n // Build bubble defaults\n const bubbleDefaults = new Map<string, BubbleMenuItem[]>();\n const byCtx = new Map<string, ToolbarButton[]>();\n const addItem = (btn: ToolbarButton): void => {\n const ctx = (btn as unknown as Record<string, unknown>)['bubbleMenu'] as string | undefined;\n if (!ctx) return;\n let arr = byCtx.get(ctx);\n if (!arr) { arr = []; byCtx.set(ctx, arr); }\n arr.push(btn);\n };\n for (const item of 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 for (const [ctx, ctxItems] of byCtx) {\n ctxItems.sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n const result: BubbleMenuItem[] = [];\n let lastGroup: string | undefined;\n let sepIdx = 0;\n for (const item of ctxItems) {\n if (lastGroup !== undefined && item.group !== lastGroup) {\n result.push({ type: 'separator', name: `bsep-${String(sepIdx++)}` });\n }\n result.push(item);\n lastGroup = item.group;\n }\n bubbleDefaults.set(ctx, result);\n }\n bubbleDefaultsRef.current = bubbleDefaults;\n\n // Resolve names helper. Dropdowns take priority over buttons sharing the\n // same name (mirrors the Angular wrapper). Pipe `|` is a separator marker.\n const resolveNames = (names: string[]): BubbleMenuItem[] => {\n const result: BubbleMenuItem[] = [];\n let sepIdx = 0;\n for (const name of names) {\n if (name === '|') {\n result.push({ type: 'separator', name: `sep-${String(sepIdx++)}` });\n } else {\n const dropdown = dropdownMap.get(name);\n if (dropdown) { result.push(dropdown); continue; }\n const item = itemMap.get(name);\n if (item) result.push(item);\n }\n }\n return result;\n };\n\n const getFormatItems = (): ToolbarButton[] => {\n return Array.from(itemMap.values())\n .filter(item => item.group === 'format')\n .sort((a, b) => (b.priority ?? 100) - (a.priority ?? 100));\n };\n\n const detectContext = (selection: SelectionShape, ctxs: Record<string, string[] | true | null>): string | null => {\n if ('$anchorCell' in selection) return null;\n if (selection.node) return selection.node.type.name;\n if (selection.empty) return null;\n\n const fromCell = findCellNode(selection.$from);\n if (fromCell) {\n const toCell = findCellNode(selection.$to);\n if (toCell && fromCell !== toCell) return null;\n return 'table';\n }\n\n const fromName = selection.$from.parent.type.name;\n if (fromName in ctxs) return fromName;\n if ('text' in ctxs && selection.$from.parent.type.spec.marks !== '') return 'text';\n const toName = selection.$to.parent.type.name;\n if (toName in ctxs) return toName;\n if ('text' in ctxs && selection.$to.parent.type.spec.marks !== '') return 'text';\n return null;\n };\n\n const filterBySchema = (contextName: string, schemaItems: ToolbarButton[]): ToolbarButton[] => {\n if (contextName === 'text' || contextName === 'table') return schemaItems;\n const schema = (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 // Generate shouldShow function\n let shouldShowFn = shouldShow;\n if (!shouldShowFn) {\n if (contexts) {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n const context = detectContext(state.selection, contexts);\n if (!context) return false;\n if (context in contexts) {\n const val = contexts[context];\n if (val === null) return false;\n return val === true || (Array.isArray(val) && val.length > 0);\n }\n return bubbleDefaults.has(context);\n };\n } else {\n shouldShowFn = ({ state }: { state: { selection: SelectionShape } }) => {\n if (state.selection.empty) return false;\n if (state.selection.node) return bubbleDefaults.has(state.selection.node.type.name);\n if (isInsideTableCell(state.selection.$from)) return false;\n return state.selection.$from.parent.type.spec.marks !== ''\n || state.selection.$to.parent.type.spec.marks !== '';\n };\n }\n }\n\n // Register plugin\n const pluginKey = pluginKeyRef.current;\n const plugin = createBubbleMenuPlugin({\n pluginKey,\n editor,\n element: menuRef.current,\n shouldShow: shouldShowFn,\n placement,\n offset,\n updateDelay,\n });\n editor.registerPlugin(plugin);\n\n const setItems = (newItems: BubbleMenuItem[]): void => {\n resolvedItemsRef.current = newItems;\n setResolvedItems(newItems);\n };\n\n // Set initial items\n if (contexts) {\n updateContextItems(editor, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else if (items) {\n setItems(resolveNames(items));\n } else {\n setItems(resolveNames(['bold', 'italic', 'underline']));\n }\n\n const updateStates = (ed: Editor): void => {\n let canProxy: Record<string, (...args: unknown[]) => boolean> | null = null;\n try { canProxy = ed.can() as unknown as Record<string, (...args: unknown[]) => boolean>; } catch { /* ignore */ }\n\n const trackButton = (btn: ToolbarButton): void => {\n activeMapRef.current.set(btn.name, ToolbarController.resolveActive(ed as never, btn));\n try {\n const canCmd = typeof btn.command === 'string' ? canProxy?.[btn.command] : undefined;\n disabledMapRef.current.set(btn.name, canCmd\n ? !(btn.commandArgs?.length ? canCmd(...btn.commandArgs) : canCmd())\n : false);\n } catch { disabledMapRef.current.set(btn.name, false); }\n };\n\n for (const item of resolvedItemsRef.current) {\n if (item.type === 'separator') continue;\n if (item.type === 'dropdown') {\n // Track each child so dynamicIcon + isActive lookups work.\n for (const sub of item.items) trackButton(sub);\n continue;\n }\n trackButton(item);\n }\n };\n\n const defaultItems = items ? resolveNames(items) : resolveNames(['bold', 'italic', 'underline']);\n\n /**\n * Coalesce all trailing-button derivations into a single `setTrailing`\n * call per transaction. Returning the same object shape (via referential\n * equality of every field) is fine - React's `Object.is` comparison only\n * skips re-render when the parent state value is the same reference, and\n * we always pass a new object, so the component renders once per tick.\n */\n const syncTrailingState = (ed: Editor): void => {\n const sel = ed.state.selection as unknown as SelectionShape;\n const isNode = !!sel.node;\n\n // Multi-block disable for the \"...\" trigger: when $from and $to live\n // under different top-level blocks the context menu has no unambiguous\n // target. Cheap O(1) check via $.before(1).\n let blockMenuDisabled = false;\n if (hasBlockContextMenu) {\n const { $from, $to } = ed.state.selection;\n if ($from.depth < 1 || $to.depth < 1) {\n blockMenuDisabled = true;\n } else {\n blockMenuDisabled = $from.before(1) !== $to.before(1);\n }\n }\n\n // Color preview for the \"A\" trigger glyph + underline. Read the\n // textStyle mark at $from; null tokens render as transparent.\n let textVar: string | null = null;\n let bgVar: string | null = null;\n let hasAny = false;\n if (hasNotionColorPicker) {\n const mark = ed.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 setTrailing({\n isNodeSelection: isNode,\n showColorPickerButton: hasNotionColorPicker,\n showBlockMenuButton: hasBlockContextMenu,\n blockMenuButtonDisabled: blockMenuDisabled,\n currentTextColorVar: textVar,\n currentBgColorVar: bgVar,\n hasAnyColor: hasAny,\n });\n };\n\n // Transaction handler\n const transactionHandler = (): void => {\n if (contexts) {\n updateContextItems(editor, contexts, detectContext, resolveNames, getFormatItems, filterBySchema, bubbleDefaults, setItems);\n } else {\n const sel = editor.state.selection as unknown as SelectionShape;\n if (sel.node && bubbleDefaults.has(sel.node.type.name)) {\n setItems(bubbleDefaults.get(sel.node.type.name) ?? []);\n } else {\n setItems(defaultItems);\n }\n }\n updateStates(editor);\n syncTrailingState(editor);\n setActiveVersion(v => v + 1);\n };\n editor.on('transaction', transactionHandler);\n updateStates(editor);\n syncTrailingState(editor);\n\n return () => {\n editor.off('transaction', transactionHandler);\n if (!editor.isDestroyed) {\n editor.unregisterPlugin(pluginKey);\n }\n };\n // Effect runs only when the editor instance changes. Other deps (items,\n // options, callbacks) are intentionally captured by closure on each render\n // through ref updates, not by re-running this effect.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n function updateContextItems(\n ed: Editor,\n ctxs: Record<string, string[] | true | null>,\n detectContext: (sel: SelectionShape, c: Record<string, string[] | true | null>) => string | null,\n resolveNames: (names: string[]) => BubbleMenuItem[],\n getFormatItems: () => ToolbarButton[],\n filterBySchema: (ctx: string, items: ToolbarButton[]) => ToolbarButton[],\n defaults: Map<string, BubbleMenuItem[]>,\n setItems: (items: BubbleMenuItem[]) => void,\n ): void {\n const ctx = detectContext(ed.state.selection as unknown as SelectionShape, ctxs);\n if (!ctx) { setItems([]); return; }\n\n if (ctx in ctxs) {\n const val = ctxs[ctx];\n if (val === null || (Array.isArray(val) && val.length === 0)) {\n setItems([]);\n return;\n }\n if (val === true) {\n setItems(filterBySchema(ctx, getFormatItems()));\n } else if (Array.isArray(val)) {\n const resolved = resolveNames(val);\n const buttons = resolved.filter((i): i is ToolbarButton => i.type !== 'separator');\n const filtered = new Set(filterBySchema(ctx, buttons).map(b => b.name));\n setItems(resolved.filter(i => i.type === 'separator' || filtered.has(i.name)));\n }\n } else {\n setItems(defaults.get(ctx) ?? []);\n }\n }\n\n const isItemActive = (item: ToolbarButton): boolean => {\n return activeMapRef.current.get(item.name) ?? false;\n };\n\n const isItemDisabled = (item: ToolbarButton): boolean => {\n return disabledMapRef.current.get(item.name) ?? false;\n };\n\n const executeCommand = (item: ToolbarButton, event?: ReactMouseEvent | MouseEvent): void => {\n if (!editor) return;\n if (item.emitEvent) {\n // Forward the clicked button as the anchor so listeners (LinkPopover,\n // image popover, emoji picker, NotionColorPicker) can position their\n // panels against it. Matches Angular wrapper behaviour.\n const anchor =\n (event?.currentTarget as HTMLElement | undefined) ??\n (event?.target as HTMLElement | undefined) ?? null;\n (editor.emit as (e: string, d: unknown) => void)(item.emitEvent, { anchorElement: anchor });\n return;\n }\n ToolbarController.executeItem(editor as never, item);\n };\n\n /**\n * Emit `notionColorOpen` with the trigger as anchor. The wrapper\n * `DomternalNotionColorPicker` listens and positions itself against the\n * anchor element.\n */\n const openColorPicker = (anchor: HTMLElement): void => {\n const ed = editorRef.current;\n if (!ed) return;\n (ed.emit as (e: string, d: unknown) => void)(\n 'notionColorOpen',\n { anchorElement: anchor },\n );\n };\n\n /**\n * Open the BlockContextMenu against the cursor's containing block. Walk one\n * level up when the cursor's textblock is not a direct doc child (e.g.\n * cursor in `listItem > paragraph` targets the listItem) so Delete /\n * Turn into operate on the visual block the user is editing.\n */\n const openBlockContextMenu = (anchor: HTMLElement): void => {\n const ed = editorRef.current;\n if (!ed) return;\n const $from = ed.state.selection.$from;\n if ($from.depth < 1) return;\n const depth = $from.depth > 1 && $from.node($from.depth - 1).type.name !== 'doc'\n ? $from.depth - 1\n : $from.depth;\n const blockPos = $from.before(depth);\n const editorEl = ed.view.dom.closest<HTMLElement>('.dm-editor');\n editorEl?.dispatchEvent(new CustomEvent('dm:block-context-menu-open', {\n bubbles: false,\n detail: { blockPos, anchorElement: anchor },\n }));\n };\n\n return {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon: (name: string) => icons?.[name] ?? defaultIcons[name] ?? '',\n trailing,\n openColorPicker,\n openBlockContextMenu,\n };\n}\n","import {\n useCallback,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport type { Editor, BubbleMenuOptions, IconSet, ToolbarButton, ToolbarDropdown } from '@domternal/core';\nimport { positionFloatingOnce } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useBubbleMenu } from './useBubbleMenu.js';\n\nexport interface DomternalBubbleMenuProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom visibility function. */\n shouldShow?: BubbleMenuOptions['shouldShow'];\n /** Position relative to selection. @default 'top' */\n placement?: 'top' | 'bottom';\n /** Pixel offset from selection. @default 8 */\n offset?: number;\n /** Debounce delay in ms. @default 0 */\n updateDelay?: number;\n /** Fixed item names, e.g. ['bold', 'italic', 'code']. */\n items?: string[];\n /** Context-aware: map context names to item arrays, true for all, or null to disable. */\n contexts?: Record<string, string[] | true | null>;\n /** Custom icon overrides. Falls back to default Phosphor icons for unmapped keys. */\n icons?: IconSet;\n /** Additional content rendered after buttons. */\n children?: React.ReactNode;\n}\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 function DomternalBubbleMenu({\n editor: editorProp,\n shouldShow,\n placement,\n offset,\n updateDelay,\n items,\n contexts,\n icons,\n children,\n}: DomternalBubbleMenuProps): ReactNode {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const {\n menuRef,\n resolvedItems,\n isItemActive,\n isItemDisabled,\n executeCommand,\n activeVersion,\n getCachedIcon,\n trailing,\n openColorPicker,\n openBlockContextMenu,\n } = useBubbleMenu({\n editor,\n shouldShow,\n placement,\n offset,\n updateDelay,\n items,\n contexts,\n icons,\n });\n\n // Force re-read of activeVersion in render to subscribe to state changes.\n void activeVersion;\n\n // Fresh cache on getCachedIcon identity change, so an icons prop swap evicts old SVGs.\n const getCachedHtml = useMemo(() => {\n const cache = new Map<string, string>();\n return (name: string): string => {\n const cached = cache.get(name);\n if (cached !== undefined) return cached;\n const html = getCachedIcon(name);\n cache.set(name, html);\n return html;\n };\n }, [getCachedIcon]);\n\n // Only one dropdown is open at a time across the entire bubble menu - the\n // Angular component enforces the same constraint via `openDropdown` signal.\n const [openDropdown, setOpenDropdown] = useState<string | null>(null);\n const closeDropdown = useCallback(() => { setOpenDropdown(null); }, []);\n\n // Refs to the trailing trigger buttons so we can pass the element as anchor\n // to the color picker and block context menu (positioning targets).\n const colorBtnRef = useRef<HTMLButtonElement>(null);\n const blockMenuBtnRef = useRef<HTMLButtonElement>(null);\n\n return (\n <div ref={menuRef} className=\"dm-bubble-menu\" role=\"toolbar\" aria-label=\"Text formatting\">\n {resolvedItems.map((item) => {\n if (item.type === 'separator') {\n return <span key={item.name} className=\"dm-toolbar-separator\" role=\"separator\" />;\n }\n if (item.type === 'dropdown') {\n return (\n <BubbleDropdown\n key={item.name}\n dropdown={item}\n isOpen={openDropdown === item.name}\n onToggle={() => { setOpenDropdown(openDropdown === item.name ? null : item.name); }}\n onClose={closeDropdown}\n isItemActive={isItemActive}\n getCachedHtml={getCachedHtml}\n activeVersion={activeVersion}\n executeSubItem={(sub) => {\n closeDropdown();\n executeCommand(sub);\n requestAnimationFrame(() => { editor?.view.focus(); });\n }}\n />\n );\n }\n const btn = item;\n const active = isItemActive(btn);\n return (\n <button\n key={btn.name}\n type=\"button\"\n className={`dm-toolbar-button${active ? ' dm-toolbar-button--active' : ''}`}\n disabled={isItemDisabled(btn)}\n title={btn.label}\n aria-label={btn.label}\n aria-pressed={active}\n dangerouslySetInnerHTML={{ __html: getCachedHtml(btn.icon) }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={(e) => { executeCommand(btn, e); }}\n />\n );\n })}\n {trailing.showColorPickerButton && !trailing.isNodeSelection && (\n <>\n <span className=\"dm-toolbar-separator\" role=\"separator\" />\n <button\n ref={colorBtnRef}\n type=\"button\"\n className={`dm-toolbar-button dm-ncp-trigger${trailing.hasAnyColor ? ' dm-toolbar-button--active' : ''}`}\n title=\"Text and background color\"\n aria-label=\"Text and background color\"\n aria-haspopup=\"dialog\"\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { if (colorBtnRef.current) openColorPicker(colorBtnRef.current); }}\n >\n <span\n className=\"dm-ncp-trigger-glyph\"\n style={trailing.currentTextColorVar ? { color: trailing.currentTextColorVar } : undefined}\n >A</span>\n <span\n className=\"dm-ncp-trigger-underline\"\n style={trailing.currentBgColorVar ? { backgroundColor: trailing.currentBgColorVar } : undefined}\n />\n </button>\n </>\n )}\n {trailing.showBlockMenuButton && !trailing.isNodeSelection && (\n <>\n <span className=\"dm-toolbar-separator\" role=\"separator\" />\n <button\n ref={blockMenuBtnRef}\n type=\"button\"\n className=\"dm-toolbar-button\"\n disabled={trailing.blockMenuButtonDisabled}\n title={trailing.blockMenuButtonDisabled\n ? 'Block actions (select within a single block)'\n : 'More options'}\n aria-label=\"More options\"\n aria-haspopup=\"menu\"\n dangerouslySetInnerHTML={{ __html: getCachedHtml('dotsThree') }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { if (blockMenuBtnRef.current) openBlockContextMenu(blockMenuBtnRef.current); }}\n />\n </>\n )}\n {children}\n </div>\n );\n}\n\n// ===== Bubble-menu-embedded dropdown =====\n\ninterface BubbleDropdownProps {\n dropdown: ToolbarDropdown;\n isOpen: boolean;\n onToggle: () => void;\n onClose: () => void;\n isItemActive: (item: ToolbarButton) => boolean;\n getCachedHtml: (name: string) => string;\n activeVersion: number;\n executeSubItem: (sub: ToolbarButton) => void;\n}\n\n/**\n * Bubble-menu-embedded dropdown (e.g. text-align). Manages its own outside-\n * click / Escape / `dm:dismiss-overlays` lifecycle. Panel stays INSIDE\n * `.dm-bubble-menu` so it inherits bubble-scoped active-state tokens.\n */\nfunction BubbleDropdown({\n dropdown,\n isOpen,\n onToggle,\n onClose,\n isItemActive,\n getCachedHtml,\n activeVersion,\n executeSubItem,\n}: BubbleDropdownProps): ReactNode {\n void activeVersion;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n\n const dropdownActive = dropdown.items.some((sub) => isItemActive(sub));\n const activeChild = dropdown.dynamicIcon\n ? dropdown.items.find((sub) => isItemActive(sub))\n : undefined;\n const triggerIcon = activeChild?.icon ?? dropdown.icon;\n const triggerHtml = getCachedHtml(triggerIcon) + DROPDOWN_CARET;\n\n // Position dropdown + outside-close / Escape / cooperative dismissal via\n // a single AbortController.\n useLayoutEffect(() => {\n if (!isOpen) return;\n const trigger = triggerRef.current;\n const panel = panelRef.current;\n if (!trigger || !panel) return;\n\n const cleanupFloating = positionFloatingOnce(trigger, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n const target = e.target as Node | null;\n if (!target) return;\n if (panel.contains(target)) return;\n if (trigger.contains(target)) return;\n onClose();\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n }, { signal });\n\n // Cooperative dismissal: other overlays (color picker, link popover)\n // broadcast this event when opening; our dropdown closes in response.\n const editorEl = trigger.closest<HTMLElement>('.dm-editor');\n if (editorEl) {\n editorEl.addEventListener('dm:dismiss-overlays', () => { onClose(); }, { signal });\n }\n\n return () => {\n controller.abort();\n cleanupFloating();\n };\n }, [isOpen, onClose]);\n\n return (\n <div className=\"dm-toolbar-dropdown-wrapper\" data-dropdown-wrapper={dropdown.name}>\n <button\n ref={triggerRef}\n type=\"button\"\n className={`dm-toolbar-button dm-toolbar-dropdown-trigger${dropdownActive ? ' dm-toolbar-button--active' : ''}`}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-label={dropdown.label}\n title={dropdown.label}\n data-dropdown={dropdown.name}\n dangerouslySetInnerHTML={{ __html: triggerHtml }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={onToggle}\n />\n {isOpen && (\n <div\n ref={panelRef}\n className=\"dm-toolbar-dropdown-panel\"\n role=\"menu\"\n data-dm-editor-ui\n data-dropdown-panel={dropdown.name}\n >\n {dropdown.items.map((sub) => {\n const subActive = isItemActive(sub);\n const subHtml = `${getCachedHtml(sub.icon)} ${sub.label}`;\n return (\n <button\n key={sub.name}\n type=\"button\"\n className={`dm-toolbar-dropdown-item${subActive ? ' dm-toolbar-dropdown-item--active' : ''}`}\n role=\"menuitem\"\n aria-label={sub.label}\n dangerouslySetInnerHTML={{ __html: subHtml }}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { executeSubItem(sub); }}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport {\n PluginKey,\n FloatingMenuController,\n defaultIcons,\n} from '@domternal/core';\nimport type {\n Editor,\n FloatingMenuItem,\n FloatingMenuItemsOverride,\n IconSet,\n} from '@domternal/core';\nimport { createFloatingMenuPlugin } from '@domternal/extension-block-menu';\nimport type {\n FloatingMenuKeymap,\n FloatingMenuOptions,\n} from '@domternal/extension-block-menu';\nimport { useCurrentEditor } from './EditorContext.js';\n\nexport interface DomternalFloatingMenuProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom visibility predicate. */\n shouldShow?: FloatingMenuOptions['shouldShow'];\n /** Pixel offset from trigger anchor. @default 0 */\n offset?: number;\n /** Items override (array replaces defaults; function transforms them). */\n items?: FloatingMenuItemsOverride;\n /** Keyboard shortcuts for entering the menu via keyboard. */\n keymap?: FloatingMenuKeymap;\n /** Custom icon set (falls back to `@domternal/core`'s `defaultIcons`). */\n icons?: IconSet;\n /**\n * When true, the menu does NOT auto-show on every empty paragraph;\n * it only opens when the BlockHandle `+` button (or any caller of\n * `showFloatingMenu`) explicitly triggers it. Notion-style behaviour.\n * @default false\n */\n requireExplicitTrigger?: boolean;\n /**\n * Optional custom content. When provided, the default grouped-item\n * rendering is skipped and children are rendered inside the menu element.\n */\n children?: ReactNode;\n}\n\n/**\n * Block-insert floating menu. Renders defaults collected from the editor's\n * extensions via `addFloatingMenuItems()`; pass `items` to override or\n * `children` to render a fully custom UI.\n */\nexport function DomternalFloatingMenu({\n editor: editorProp,\n shouldShow,\n offset = 0,\n items,\n keymap,\n icons,\n requireExplicitTrigger = false,\n children,\n}: DomternalFloatingMenuProps): ReactNode {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const menuRef = useRef<HTMLDivElement>(null);\n const pluginKeyRef = useRef(\n new PluginKey('reactFloatingMenu-' + (\n (globalThis as { crypto?: { randomUUID?: () => string } }).crypto?.randomUUID?.().slice(0, 8)\n ?? Math.random().toString(36).slice(2, 8)\n )),\n );\n\n // Refs so the effect below can read current prop values without re-running.\n const shouldShowRef = useRef(shouldShow);\n shouldShowRef.current = shouldShow;\n const offsetRef = useRef(offset);\n offsetRef.current = offset;\n const keymapRef = useRef(keymap);\n keymapRef.current = keymap;\n const requireExplicitTriggerRef = useRef(requireExplicitTrigger);\n requireExplicitTriggerRef.current = requireExplicitTrigger;\n\n // Register the ProseMirror plugin (visibility + positioning + dismiss).\n useEffect(() => {\n if (!editor || editor.isDestroyed || !menuRef.current) return;\n const pluginKey = pluginKeyRef.current;\n const plugin = createFloatingMenuPlugin({\n pluginKey,\n editor,\n element: menuRef.current,\n ...(shouldShowRef.current && { shouldShow: shouldShowRef.current }),\n offset: offsetRef.current,\n ...(keymapRef.current && { keymap: keymapRef.current }),\n requireExplicitTrigger: requireExplicitTriggerRef.current,\n });\n editor.registerPlugin(plugin);\n return () => {\n if (!editor.isDestroyed) editor.unregisterPlugin(pluginKey);\n };\n }, [editor]);\n\n // === Default rendering mode ===\n // When consumer provides children we skip the controller entirely and\n // render whatever they passed. Otherwise we collect items via the\n // controller and render a WAI-ARIA menu with roving-tabindex keyboard nav.\n const useDefaultRender = !children;\n\n // Subscribe to controller state changes via a version counter. Using\n // useState bump (instead of useSyncExternalStore) keeps this compatible\n // with React concurrent mode while avoiding extra adapter code.\n const [, bump] = useState(0);\n const forceRender = useCallback((): void => { bump((v) => v + 1); }, []);\n\n const controllerRef = useRef<FloatingMenuController | null>(null);\n\n useEffect(() => {\n if (!useDefaultRender || !editor || editor.isDestroyed) {\n controllerRef.current = null;\n return;\n }\n const controller = new FloatingMenuController(editor, forceRender, items);\n controller.subscribe();\n controllerRef.current = controller;\n // Controller is stored on a ref (not state) - React won't re-render on\n // that assignment, so trigger a bump so the next render reads the newly\n // available groups/focusedIndex.\n forceRender();\n return () => {\n controller.destroy();\n controllerRef.current = null;\n };\n }, [editor, useDefaultRender, items, forceRender]);\n\n const controller = controllerRef.current;\n const groups = useMemo(() => controller?.groups ?? [], [controller]);\n const focusedIndex = controller?.focusedIndex ?? -1;\n\n // Imperative focus management: whenever focusedIndex changes and is in\n // range, focus the matching DOM button. This is the roving-tabindex\n // \"accessible focus\" pattern used by the WAI-ARIA menu spec.\n useLayoutEffect(() => {\n if (focusedIndex < 0 || !menuRef.current) return;\n const target = menuRef.current.querySelector<HTMLElement>(\n `[data-floating-menu-index=\"${String(focusedIndex)}\"]`,\n );\n target?.focus();\n }, [focusedIndex]);\n\n // Resolve an icon name to SVG string; consumer-provided icon set wins.\n const resolveIcon = useCallback((name?: string): string => {\n if (!name) return '';\n return icons?.[name] ?? defaultIcons[name] ?? '';\n }, [icons]);\n\n const onItemClick = useCallback((item: FloatingMenuItem): void => {\n if (!editor || !controllerRef.current) return;\n controllerRef.current.execute(item);\n // Return focus to the editor so selection/cursor remain where expected.\n requestAnimationFrame(() => { editor.view.focus(); });\n }, [editor]);\n\n const onMenuKeyDown = useCallback((e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const ctl = controllerRef.current;\n if (!ctl) return;\n const focused = ctl.focusedItem();\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n ctl.next();\n return;\n case 'ArrowUp':\n e.preventDefault();\n ctl.prev();\n return;\n case 'Home':\n e.preventDefault();\n ctl.first();\n return;\n case 'End':\n e.preventDefault();\n ctl.last();\n return;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n ctl.leaveMenu();\n if (editor) editor.view.focus();\n return;\n case 'Enter':\n case ' ':\n if (focused) {\n e.preventDefault();\n onItemClick(focused);\n }\n return;\n default:\n return;\n }\n }, [editor, onItemClick]);\n\n // Flatten once per render so child item renders can derive their flat index.\n const flatNames = useMemo(\n () => groups.flatMap((g) => g.items.map((i) => i.name)),\n [groups],\n );\n\n if (!editor && !useDefaultRender) return null;\n\n return (\n <div\n ref={menuRef}\n className=\"dm-floating-menu\"\n role=\"menu\"\n aria-label=\"Insert block\"\n data-dm-editor-ui=\"\"\n onKeyDown={useDefaultRender ? onMenuKeyDown : undefined}\n >\n {useDefaultRender\n ? groups.map((group, gi) => (\n <Fragment key={group.name || `__group-${String(gi)}`}>\n {group.name && (\n <div className=\"dm-floating-menu-group-label\" id={`dm-fm-g${String(gi)}`}>\n {group.name}\n </div>\n )}\n <div\n className=\"dm-floating-menu-group\"\n role=\"group\"\n {...(group.name && { 'aria-labelledby': `dm-fm-g${String(gi)}` })}\n >\n {group.items.map((item) => {\n const flatIndex = flatNames.indexOf(item.name);\n const isFocused = flatIndex === focusedIndex;\n const disabled = controller?.isDisabled(item) ?? false;\n return (\n <FloatingMenuItemButton\n key={item.name}\n item={item}\n flatIndex={flatIndex}\n tabIndex={isFocused || (focusedIndex < 0 && flatIndex === 0) ? 0 : -1}\n disabled={disabled}\n iconHtml={resolveIcon(item.icon)}\n onClick={onItemClick}\n />\n );\n })}\n </div>\n </Fragment>\n ))\n : children}\n </div>\n );\n}\n\ninterface ItemButtonProps {\n item: FloatingMenuItem;\n flatIndex: number;\n tabIndex: 0 | -1;\n disabled: boolean;\n iconHtml: string;\n onClick: (item: FloatingMenuItem) => void;\n}\n\nfunction FloatingMenuItemButton({\n item,\n flatIndex,\n tabIndex,\n disabled,\n iconHtml,\n onClick,\n}: ItemButtonProps): ReactNode {\n const handleClick = useCallback((): void => { onClick(item); }, [item, onClick]);\n // Prevent mousedown from stealing editor focus before we run the command.\n const onMouseDown = useCallback((e: ReactMouseEvent): void => {\n e.preventDefault();\n }, []);\n\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"dm-floating-menu-item\"\n data-floating-menu-item={item.name}\n data-floating-menu-index={String(flatIndex)}\n tabIndex={tabIndex}\n aria-disabled={disabled || undefined}\n aria-keyshortcuts={item.shortcut}\n disabled={disabled}\n onClick={handleClick}\n onMouseDown={onMouseDown}\n >\n {iconHtml && (\n <span\n className=\"dm-floating-menu-item-icon\"\n aria-hidden=\"true\"\n dangerouslySetInnerHTML={{ __html: iconHtml }}\n />\n )}\n <span className=\"dm-floating-menu-item-label\">{item.label}</span>\n {item.shortcut && (\n <span className=\"dm-floating-menu-item-shortcut\" aria-hidden=\"true\">\n {item.shortcut}\n </span>\n )}\n </button>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type RefObject } from 'react';\nimport { positionFloatingOnce } from '@domternal/core';\nimport type { Editor } from '@domternal/core';\n\nexport interface EmojiPickerItem {\n emoji: string;\n name: string;\n group: string;\n}\n\nexport interface UseEmojiPickerResult {\n isOpen: boolean;\n searchQuery: string;\n activeCategory: string;\n categories: Map<string, EmojiPickerItem[]>;\n categoryNames: string[];\n filteredEmojis: EmojiPickerItem[];\n frequentlyUsed: EmojiPickerItem[];\n pickerRef: RefObject<HTMLDivElement | null>;\n selectEmoji: (item: EmojiPickerItem) => void;\n onSearch: (event: React.ChangeEvent<HTMLInputElement>) => void;\n scrollToCategory: (cat: string) => void;\n onGridScroll: () => void;\n close: () => void;\n}\n\nexport function useEmojiPicker(editor: Editor | null, emojis: EmojiPickerItem[]): UseEmojiPickerResult {\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [activeCategory, setActiveCategory] = useState('');\n\n const pickerRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLElement | null>(null);\n const cleanupFloatingRef = useRef<(() => void) | null>(null);\n const clickOutsideRef = useRef<((e: Event) => void) | null>(null);\n const keydownRef = useRef<((e: KeyboardEvent) => void) | null>(null);\n const isOpenRef = useRef(false);\n\n const categories = useMemo(() => {\n const map = new Map<string, EmojiPickerItem[]>();\n for (const item of emojis) {\n let list = map.get(item.group);\n if (!list) { list = []; map.set(item.group, list); }\n list.push(item);\n }\n return map;\n }, [emojis]);\n\n const categoryNames = useMemo(() => [...categories.keys()], [categories]);\n\n const filteredEmojis = useMemo(() => {\n const query = searchQuery.toLowerCase();\n if (!query) return [];\n const storage = getEmojiStorage(editor);\n const searchFn = storage?.['searchEmoji'] as ((q: string) => EmojiPickerItem[]) | undefined;\n if (searchFn) return searchFn(query);\n return emojis.filter(\n (item) => item.name.includes(query) || item.group.toLowerCase().includes(query),\n );\n }, [searchQuery, emojis, editor]);\n\n const frequentlyUsed = useMemo(() => {\n // Re-evaluate when panel opens\n if (!isOpen) return [];\n const storage = getEmojiStorage(editor);\n if (!storage) return [];\n const getFreq = storage['getFrequentlyUsed'] as (() => string[]) | undefined;\n if (!getFreq) return [];\n const names = getFreq();\n if (!names.length) return [];\n const nameMap = storage['_nameMap'] as Map<string, EmojiPickerItem> | undefined;\n if (!nameMap) return [];\n return names.slice(0, 16).map((n) => nameMap.get(n)).filter(Boolean) as EmojiPickerItem[];\n }, [isOpen, editor]);\n\n const removeGlobalListeners = useCallback((): void => {\n if (clickOutsideRef.current) {\n document.removeEventListener('mousedown', clickOutsideRef.current);\n clickOutsideRef.current = null;\n }\n if (keydownRef.current) {\n document.removeEventListener('keydown', keydownRef.current);\n keydownRef.current = null;\n }\n }, []);\n\n const close = useCallback((): void => {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = null;\n isOpenRef.current = false;\n setIsOpen(false);\n setStorageOpen(editor, false);\n setSearchQuery('');\n anchorRef.current = null;\n removeGlobalListeners();\n editor?.view.focus();\n }, [editor, removeGlobalListeners]);\n\n const addGlobalListeners = useCallback((): void => {\n clickOutsideRef.current = (e: Event): void => {\n const target = e.target as Node;\n if (\n pickerRef.current &&\n !pickerRef.current.contains(target) &&\n target !== anchorRef.current &&\n !anchorRef.current?.contains(target)\n ) {\n // Defer close to next frame so the current mousedown/click cycle\n // completes without React re-rendering and replacing DOM nodes\n // (which would swallow the click event on toolbar buttons).\n requestAnimationFrame(() => { close(); });\n }\n };\n document.addEventListener('mousedown', clickOutsideRef.current);\n\n keydownRef.current = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n };\n document.addEventListener('keydown', keydownRef.current);\n }, [close]);\n\n // Listen to insertEmoji event\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n const handler = (...args: unknown[]): void => {\n const data = args[0] as { anchorElement?: HTMLElement } | undefined;\n\n if (isOpenRef.current) {\n close();\n return;\n }\n\n anchorRef.current = data?.anchorElement ?? null;\n isOpenRef.current = true;\n setIsOpen(true);\n setStorageOpen(editor, true);\n setSearchQuery('');\n\n if (categoryNames.length > 0 && categoryNames[0]) {\n setActiveCategory(categoryNames[0]);\n }\n\n addGlobalListeners();\n\n requestAnimationFrame(() => {\n const panel = pickerRef.current?.querySelector<HTMLElement>('.dm-emoji-picker');\n if (panel && anchorRef.current) {\n cleanupFloatingRef.current?.();\n cleanupFloatingRef.current = positionFloatingOnce(anchorRef.current, panel, {\n placement: 'bottom',\n offsetValue: 4,\n });\n }\n const input = pickerRef.current?.querySelector<HTMLInputElement>('.dm-emoji-picker-search input');\n input?.focus({ preventScroll: true });\n });\n };\n\n (editor.on as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n\n return () => {\n removeGlobalListeners();\n (editor.off as (e: string, h: (...args: unknown[]) => void) => void)('insertEmoji', handler);\n };\n // Effect re-runs only when the editor instance changes. Picker state\n // (open/closed, items) is held in refs read by the handler closure.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor]);\n\n const selectEmoji = useCallback((item: EmojiPickerItem): void => {\n if (!editor) return;\n const cmd = editor.commands as Record<string, (...args: unknown[]) => boolean>;\n if (cmd['insertEmoji']) {\n cmd['insertEmoji'](item.name);\n }\n close();\n }, [editor, close]);\n\n const onSearch = useCallback((event: React.ChangeEvent<HTMLInputElement>): void => {\n setSearchQuery(event.target.value);\n }, []);\n\n const scrollToCategory = useCallback((cat: string): void => {\n setSearchQuery('');\n setActiveCategory(cat);\n requestAnimationFrame(() => {\n const grid = pickerRef.current?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n const label = grid.querySelector<HTMLElement>(`[data-category=\"${cat}\"]`);\n if (label) {\n grid.scrollTo({ top: label.offsetTop - grid.offsetTop });\n // Focus first emoji swatch after scroll completes\n setTimeout(() => {\n const firstSwatch = label.nextElementSibling;\n if (firstSwatch instanceof HTMLElement && firstSwatch.classList.contains('dm-emoji-swatch')) {\n firstSwatch.focus();\n }\n }, 50);\n }\n });\n }, []);\n\n const activeCategoryRef = useRef(activeCategory);\n activeCategoryRef.current = activeCategory;\n const searchQueryRef = useRef(searchQuery);\n searchQueryRef.current = searchQuery;\n\n const onGridScroll = useCallback((): void => {\n if (searchQueryRef.current) return;\n const grid = pickerRef.current?.querySelector<HTMLElement>('.dm-emoji-picker-grid');\n if (!grid) return;\n\n const labels = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-picker-category-label[data-category]'));\n let currentCat = '';\n for (const label of labels) {\n if (label.offsetTop - grid.offsetTop <= grid.scrollTop + 20) {\n currentCat = label.getAttribute('data-category') ?? '';\n }\n }\n if (currentCat && currentCat !== activeCategoryRef.current) {\n setActiveCategory(currentCat);\n }\n }, []);\n\n return {\n isOpen,\n searchQuery,\n activeCategory,\n categories,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n };\n}\n\nfunction getEmojiStorage(editor: Editor | null): Record<string, unknown> | null {\n if (!editor) return null;\n const storage = editor.storage;\n return (storage['emoji'] as Record<string, unknown> | undefined) ?? null;\n}\n\nfunction setStorageOpen(editor: Editor | null, open: boolean): void {\n if (!editor) return;\n const storage = getEmojiStorage(editor);\n if (storage) storage['isOpen'] = open;\n editor.view.dispatch(editor.view.state.tr);\n}\n","import { Fragment, useCallback, type ReactNode } from 'react';\nimport type { Editor } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useEmojiPicker, type EmojiPickerItem } from './useEmojiPicker.js';\n\nconst CATEGORY_ICONS: Record<string, string> = {\n 'Smileys & Emotion': '\\u{1F600}',\n 'People & Body': '\\u{1F44B}',\n 'Animals & Nature': '\\u{1F431}',\n 'Food & Drink': '\\u{1F355}',\n 'Travel & Places': '\\u{1F697}',\n 'Activities': '\\u{26BD}',\n 'Objects': '\\u{1F4A1}',\n 'Symbols': '\\u{1F523}',\n 'Flags': '\\u{1F3C1}',\n};\n\nfunction categoryIcon(cat: string): string {\n return CATEGORY_ICONS[cat] ?? cat.charAt(0);\n}\n\nfunction formatName(name: string): string {\n return name.replace(/_/g, ' ');\n}\n\nexport interface DomternalEmojiPickerProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Array of emoji items with emoji, name, and group. */\n emojis: EmojiPickerItem[];\n}\n\nexport function DomternalEmojiPicker({ editor: editorProp, emojis }: DomternalEmojiPickerProps): ReactNode {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const {\n isOpen,\n searchQuery,\n activeCategory,\n categoryNames,\n filteredEmojis,\n frequentlyUsed,\n pickerRef,\n selectEmoji,\n onSearch,\n scrollToCategory,\n onGridScroll,\n close,\n categories,\n } = useEmojiPicker(editor, emojis);\n\n const onGridKeyDown = useCallback((event: React.KeyboardEvent): void => {\n const grid = event.currentTarget as HTMLElement;\n const swatches = Array.from(grid.querySelectorAll<HTMLElement>('.dm-emoji-swatch'));\n if (!swatches.length) return;\n const current = document.activeElement as HTMLElement;\n const idx = swatches.indexOf(current);\n if (idx === -1) {\n // Focus is on grid container, not a swatch - enter the grid\n if (['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) {\n event.preventDefault();\n swatches[0]?.focus();\n }\n return;\n }\n const cols = 8;\n let next = idx;\n switch (event.key) {\n case 'ArrowRight': event.preventDefault(); next = Math.min(idx + 1, swatches.length - 1); break;\n case 'ArrowLeft': event.preventDefault(); next = Math.max(idx - 1, 0); break;\n case 'ArrowDown': event.preventDefault(); next = Math.min(idx + cols, swatches.length - 1); break;\n case 'ArrowUp': event.preventDefault(); next = Math.max(idx - cols, 0); break;\n case 'Enter': case ' ': event.preventDefault(); swatches[idx]?.click(); return;\n default: return;\n }\n swatches[next]?.focus();\n }, []);\n\n if (!isOpen) return <div ref={pickerRef} className=\"dm-emoji-picker-host\" />;\n\n return (\n <div ref={pickerRef} className=\"dm-emoji-picker-host\">\n <div className=\"dm-emoji-picker\">\n <div className=\"dm-emoji-picker-search\">\n <input\n type=\"text\"\n placeholder=\"Search emoji...\"\n aria-label=\"Search emoji\"\n value={searchQuery}\n onChange={onSearch}\n onKeyDown={(e) => { if (e.key === 'Escape') close(); }}\n />\n </div>\n\n <div className=\"dm-emoji-picker-tabs\" role=\"tablist\">\n {categoryNames.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n className={`dm-emoji-picker-tab${activeCategory === cat ? ' dm-emoji-picker-tab--active' : ''}`}\n role=\"tab\"\n aria-selected={activeCategory === cat}\n title={cat}\n aria-label={cat}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { scrollToCategory(cat); }}\n >\n {categoryIcon(cat)}\n </button>\n ))}\n </div>\n\n <div className=\"dm-emoji-picker-grid\" onScroll={onGridScroll} onKeyDown={onGridKeyDown}>\n {searchQuery ? (\n <>\n {filteredEmojis.length > 0 ? (\n filteredEmojis.map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { selectEmoji(item); }}\n >\n {item.emoji}\n </button>\n ))\n ) : (\n <div className=\"dm-emoji-picker-empty\">No emoji found</div>\n )}\n </>\n ) : (\n <>\n {frequentlyUsed.length > 0 && (\n <>\n <div className=\"dm-emoji-picker-category-label\">Frequently Used</div>\n {frequentlyUsed.map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { selectEmoji(item); }}\n >\n {item.emoji}\n </button>\n ))}\n </>\n )}\n {categoryNames.map((cat) => (\n <Fragment key={cat}>\n <div className=\"dm-emoji-picker-category-label\" data-category={cat}>\n {cat}\n </div>\n {(categories.get(cat) ?? []).map((item) => (\n <button\n key={item.name}\n type=\"button\"\n className=\"dm-emoji-swatch\"\n tabIndex={-1}\n title={formatName(item.name)}\n aria-label={formatName(item.name)}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { selectEmoji(item); }}\n >\n {item.emoji}\n </button>\n ))}\n </Fragment>\n ))}\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef, type DependencyList, type ReactNode } from 'react';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { EditorProvider, useCurrentEditor } from './EditorContext.js';\nimport { DomternalToolbar, type DomternalToolbarProps } from './toolbar/DomternalToolbar.js';\nimport { DomternalBubbleMenu, type DomternalBubbleMenuProps } from './bubble-menu/DomternalBubbleMenu.js';\nimport { DomternalFloatingMenu, type DomternalFloatingMenuProps } from './DomternalFloatingMenu.js';\nimport { DomternalEmojiPicker, type DomternalEmojiPickerProps } from './emoji-picker/DomternalEmojiPicker.js';\n\n// --- Root component ---\n\nexport interface DomternalProps extends UseEditorOptions {\n /** Optional dependency array for forced editor recreation. */\n deps?: DependencyList;\n children: ReactNode;\n}\n\n/**\n * Composable root component that creates an editor and provides it to all\n * subcomponents via context. No need to pass `editor` prop to children.\n *\n * @example\n * ```tsx\n * <Domternal extensions={[Bold, Italic]} content=\"<p>Hello</p>\">\n * <Domternal.Toolbar />\n * <Domternal.Content />\n * <Domternal.BubbleMenu contexts={{ text: ['bold', 'italic'] }} />\n * <Domternal.EmojiPicker emojis={emojis} />\n * </Domternal>\n * ```\n *\n * @example SSR-safe with loading state\n * ```tsx\n * <Domternal extensions={extensions} immediatelyRender={false}>\n * <Domternal.Loading>Loading editor...</Domternal.Loading>\n * <Domternal.Toolbar />\n * <Domternal.Content />\n * </Domternal>\n * ```\n */\nexport function Domternal({ children, deps, ...options }: DomternalProps): ReactNode {\n const { editor } = useEditor(options, deps);\n\n return (\n <EditorProvider editor={editor}>\n {children}\n </EditorProvider>\n );\n}\n\n// --- Subcomponents ---\n\n/** Renders the editor content area. Mounts the editor view DOM from context. */\nfunction DomternalContent({ className }: { className?: string }): ReactNode {\n const { editor } = useCurrentEditor();\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !editor || editor.isDestroyed) return;\n\n const editorDom = editor.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n }, [editor]);\n\n const classes = className ? `dm-editor ${className}` : 'dm-editor';\n\n return (\n <div className={classes} data-dm-editor-ui=\"\">\n <div ref={containerRef} />\n </div>\n );\n}\n\n/** Renders children only while editor is not yet ready (SSR loading state). */\nfunction DomternalLoading({ children }: { children: ReactNode }): ReactNode {\n const { editor } = useCurrentEditor();\n if (editor) return null;\n return <>{children}</>;\n}\n\n/** Toolbar subcomponent. Uses editor from context automatically. */\nfunction DomternalToolbarSub(props: Omit<DomternalToolbarProps, 'editor'>): ReactNode {\n return <DomternalToolbar {...props} />;\n}\n\n/** BubbleMenu subcomponent. Uses editor from context automatically. */\nfunction DomternalBubbleMenuSub(props: Omit<DomternalBubbleMenuProps, 'editor'>): ReactNode {\n return <DomternalBubbleMenu {...props} />;\n}\n\n/** FloatingMenu subcomponent. Uses editor from context automatically. */\nfunction DomternalFloatingMenuSub(props: Omit<DomternalFloatingMenuProps, 'editor'>): ReactNode {\n return <DomternalFloatingMenu {...props} />;\n}\n\n/** EmojiPicker subcomponent. Uses editor from context automatically. */\nfunction DomternalEmojiPickerSub(props: Omit<DomternalEmojiPickerProps, 'editor'>): ReactNode {\n return <DomternalEmojiPicker {...props} />;\n}\n\n// --- Attach subcomponents ---\n\nDomternalContent.displayName = 'Domternal.Content';\nDomternalLoading.displayName = 'Domternal.Loading';\nDomternalToolbarSub.displayName = 'Domternal.Toolbar';\nDomternalBubbleMenuSub.displayName = 'Domternal.BubbleMenu';\nDomternalFloatingMenuSub.displayName = 'Domternal.FloatingMenu';\nDomternalEmojiPickerSub.displayName = 'Domternal.EmojiPicker';\n\nDomternal.Content = DomternalContent;\nDomternal.Loading = DomternalLoading;\nDomternal.Toolbar = DomternalToolbarSub;\nDomternal.BubbleMenu = DomternalBubbleMenuSub;\nDomternal.FloatingMenu = DomternalFloatingMenuSub;\nDomternal.EmojiPicker = DomternalEmojiPickerSub;\n","import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';\nimport type { Content, JSONContent, Editor } from '@domternal/core';\nimport { useEditor, type UseEditorOptions } from './useEditor.js';\nimport { useEditorState } from './useEditorState.js';\nimport { EditorProvider } from './EditorContext.js';\n\nexport interface DomternalEditorProps extends Omit<UseEditorOptions, 'outputFormat'> {\n /** Additional CSS class for the .dm-editor wrapper. */\n className?: string;\n /** Output format for onChange. @default 'html' */\n outputFormat?: 'html' | 'json';\n /** Controlled value. When provided, editor content syncs to this value. */\n value?: Content;\n /** Called when content changes (controlled mode). */\n onChange?: (value: string | JSONContent) => void;\n /** Additional content rendered inside the dm-editor wrapper. */\n children?: React.ReactNode;\n}\n\nexport interface DomternalEditorRef {\n editor: Editor | null;\n htmlContent: string;\n jsonContent: JSONContent | null;\n isEmpty: boolean;\n isFocused: boolean;\n isEditable: boolean;\n}\n\n/**\n * All-in-one editor component with integrated state management and context.\n *\n * Wraps children with EditorProvider automatically, so toolbar, bubble menu,\n * and emoji picker components can access the editor via context.\n *\n * @example\n * ```tsx\n * const editorRef = useRef<DomternalEditorRef>(null);\n *\n * <DomternalEditor\n * ref={editorRef}\n * extensions={[Bold, Italic, Heading]}\n * content=\"<p>Hello</p>\"\n * onUpdate={({ editor }) => console.log(editor.getHTML())}\n * />\n * ```\n *\n * @example Controlled mode\n * ```tsx\n * const [html, setHtml] = useState('<p>Hello</p>');\n * <DomternalEditor value={html} onChange={setHtml} outputFormat=\"html\" />\n * ```\n */\nexport const DomternalEditor = forwardRef<DomternalEditorRef, DomternalEditorProps>(\n function DomternalEditor(props, ref) {\n const {\n className,\n outputFormat = 'html',\n value,\n onChange,\n content,\n children,\n ...editorOptions\n } = props;\n\n const { editor, editorRef } = useEditor({\n ...editorOptions,\n content: content ?? value ?? '',\n outputFormat,\n });\n\n const state = useEditorState(editor);\n\n // Expose editor + state via ref\n useImperativeHandle(ref, () => ({\n editor,\n htmlContent: state.htmlContent,\n jsonContent: state.jsonContent,\n isEmpty: state.isEmpty,\n isFocused: state.isFocused,\n isEditable: state.isEditable,\n }), [editor, state]);\n\n // Controlled mode: sync value prop to editor\n const prevValueRef = useRef(value);\n useEffect(() => {\n if (value === undefined || !editor || editor.isDestroyed) return;\n if (value === prevValueRef.current) return;\n prevValueRef.current = value;\n\n if (outputFormat === 'html') {\n if (value !== editor.getHTML()) {\n editor.setContent(value, false);\n }\n } else {\n if (JSON.stringify(value) !== JSON.stringify(editor.getJSON())) {\n editor.setContent(value, false);\n }\n }\n }, [value, editor, outputFormat]);\n\n // Controlled mode: call onChange on content changes\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n useEffect(() => {\n if (!editor || editor.isDestroyed || !onChangeRef.current) return;\n\n const handler = (): void => {\n const cb = onChangeRef.current;\n if (!cb) return;\n const val = outputFormat === 'html' ? editor.getHTML() : editor.getJSON();\n cb(val);\n };\n\n editor.on('update', handler);\n return () => { editor.off('update', handler); };\n }, [editor, outputFormat]);\n\n const classes = className ? `dm-editor ${className}` : 'dm-editor';\n\n return (\n <EditorProvider editor={editor}>\n {children}\n <div className={classes} data-dm-editor-ui=\"\">\n <div ref={editorRef} />\n </div>\n </EditorProvider>\n );\n },\n);\n","import { useEffect, useRef, type HTMLAttributes, type Ref, type ReactNode } from 'react';\nimport type { Editor } from '@domternal/core';\n\nexport interface EditorContentProps extends HTMLAttributes<HTMLDivElement> {\n /** The editor instance to render. */\n editor: Editor | null;\n /** Ref to the underlying div element. */\n innerRef?: Ref<HTMLDivElement>;\n}\n\n/**\n * Renders the ProseMirror editor view into a div element.\n *\n * Use this with `useEditor` for a flexible, decoupled pattern where the\n * editor hook and rendering are separated:\n *\n * @example\n * ```tsx\n * const { editor } = useEditor({ extensions, content });\n * return <EditorContent editor={editor} className=\"my-editor\" />;\n * ```\n */\nexport function EditorContent({ editor, innerRef, ...htmlProps }: EditorContentProps): ReactNode {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || !editor || editor.isDestroyed) return;\n\n // If the editor already has a view, move its DOM into this container\n const editorDom = editor.view.dom;\n if (editorDom.parentElement !== container) {\n container.appendChild(editorDom);\n }\n\n return () => {\n // Don't remove the DOM on unmount - the editor manages its own DOM lifecycle\n };\n }, [editor]);\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node;\n if (typeof innerRef === 'function') innerRef(node);\n else if (innerRef) innerRef.current = node;\n }}\n data-dm-editor-ui=\"\"\n {...htmlProps}\n />\n );\n}\n","/**\n * useNotionColorPicker\n *\n * State and effect plumbing for the Notion-style inline color picker. Listens\n * for the `notionColorOpen` event emitted by the bubble menu's \"A\" trigger,\n * tracks the active text/background tokens, and exposes the imperative\n * commands consumers need (`applyText`, `applyBg`, `close`).\n *\n * The default component (`DomternalNotionColorPicker`) consumes this hook and\n * renders the panel via `createPortal`. Consumers building custom UIs can\n * call this hook directly.\n */\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type RefObject,\n} from 'react';\nimport type { Editor } from '@domternal/core';\n\ninterface NotionColorPickerStorage {\n isOpen: boolean;\n}\n\ninterface NotionColorPickerExtensionOptions {\n palette?: readonly string[];\n}\n\ninterface NotionColorOpenDetail {\n anchorElement?: HTMLElement;\n}\n\n/**\n * Display labels for the named-token palette. Used in tooltips / aria labels;\n * unknown tokens fall back to a title-cased version of the raw key.\n */\nconst TOKEN_LABELS: Record<string, string> = {\n gray: 'Gray',\n brown: 'Brown',\n orange: 'Orange',\n yellow: 'Yellow',\n green: 'Green',\n blue: 'Blue',\n purple: 'Purple',\n pink: 'Pink',\n red: 'Red',\n};\n\nexport interface UseNotionColorPickerOptions {\n editor: Editor | null;\n}\n\nexport interface UseNotionColorPickerResult {\n /** Whether the picker panel is currently open. */\n isOpen: boolean;\n /** Editor host element (`.dm-editor`) used as the portal target. Null until the editor is ready. */\n hostEl: HTMLElement | null;\n /** Anchor element the picker positions against (the bubble-menu \"A\" trigger button). */\n anchorEl: HTMLElement | null;\n /** Ref to the panel root, used by the picker UI for positioning + focus management. */\n panelRef: RefObject<HTMLDivElement | null>;\n /** Currently applied text token at the cursor, or null when default. */\n currentTextToken: string | null;\n /** Currently applied background token at the cursor, or null when default. */\n currentBgToken: string | null;\n /** Named-token palette (read from the NotionColorPicker extension options). */\n palette: readonly string[];\n /** Apply a text color token to the current selection. Picker stays open. */\n applyText: (token: string | null) => void;\n /** Apply a background color token to the current selection. Picker stays open. */\n applyBg: (token: string | null) => void;\n /** Close the picker. When `refocus` is true, returns focus to the anchor button. */\n close: (opts?: { refocus?: boolean }) => void;\n /** Display label for a palette token (defaults to title-case fallback). */\n tokenLabel: (token: string) => string;\n /** Arrow / Home / End keyboard navigation across the 5-column swatch grid. */\n onPanelKeydown: (event: ReactKeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function useNotionColorPicker(\n options: UseNotionColorPickerOptions,\n): UseNotionColorPickerResult {\n const { editor } = options;\n\n const [isOpen, setIsOpen] = useState(false);\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const [hostEl, setHostEl] = useState<HTMLElement | null>(null);\n const [currentTextToken, setCurrentTextToken] = useState<string | null>(null);\n const [currentBgToken, setCurrentBgToken] = useState<string | null>(null);\n const [palette, setPalette] = useState<readonly string[]>([]);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const isOpenRef = useRef(false);\n isOpenRef.current = isOpen;\n // Avoid stale-closure reads of the editor inside long-lived callbacks\n // returned to the consumer. The big `[editor]` effect already handles\n // listener re-attachment; this ref is for the apply/close commands.\n // The mutation lives in an effect so React concurrent rendering can\n // discard a render without leaking ref state.\n const editorRef = useRef<Editor | null>(editor);\n useEffect(() => { editorRef.current = editor; }, [editor]);\n const anchorRef = useRef<HTMLElement | null>(null);\n anchorRef.current = anchorEl;\n\n const setStorageOpen = useCallback((open: boolean): void => {\n const ed = editorRef.current;\n if (!ed) return;\n const slot = ed.storage['notionColorPicker'];\n if (slot && typeof slot === 'object') {\n (slot as NotionColorPickerStorage).isOpen = open;\n }\n }, []);\n\n /**\n * Inspect the current selection and update active-state indicators. Reads\n * stored marks at empty cursor; walks text nodes for non-empty selections\n * (since `$from.nodeAfter` can land on a block at boundary positions).\n */\n const syncFromSelection = useCallback((): void => {\n const ed = editorRef.current;\n if (!ed) return;\n const { selection } = ed.state;\n\n let mark: { attrs: Record<string, unknown> } | null = null;\n if (selection.empty) {\n mark = selection.$from.marks().find((m) => m.type.name === 'textStyle') ?? null;\n } else {\n ed.state.doc.nodesBetween(selection.from, selection.to, (node) => {\n if (mark) return false;\n if (node.isText) {\n const found = node.marks.find((m) => m.type.name === 'textStyle');\n if (found) mark = found;\n }\n return true;\n });\n }\n\n const attrs = (mark?.attrs ?? {}) as { colorToken?: string | null; backgroundColorToken?: string | null };\n setCurrentTextToken(attrs.colorToken ?? null);\n setCurrentBgToken(attrs.backgroundColorToken ?? null);\n }, []);\n\n const close = useCallback((opts: { refocus?: boolean } = {}): void => {\n if (!isOpenRef.current) return;\n setIsOpen(false);\n setStorageOpen(false);\n if (opts.refocus) {\n // Focus the editor view, not the trigger button: trigger focus would\n // leave the user without a caret.\n editorRef.current?.view.focus();\n }\n setAnchorEl(null);\n }, [setStorageOpen]);\n\n // Editor-scoped subscription: open event + selection updates. Re-attaches\n // when the editor reference changes (i.e. HMR / route remount).\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n\n // Cache the `.dm-editor` host once per editor instance (it doesn't move).\n const host = editor.view.dom.closest<HTMLElement>('.dm-editor') ?? null;\n setHostEl(host);\n\n // Read palette from the extension options. Extension list is immutable\n // after editor construction, so this only runs once per editor.\n const ext = editor.extensionManager.extensions.find((e) => e.name === 'notionColorPicker');\n const extOptions = (ext?.options ?? null) as NotionColorPickerExtensionOptions | null;\n setPalette(extOptions?.palette ? [...extOptions.palette] : []);\n\n const onOpen = (...args: unknown[]): void => {\n const detail = args[0] as NotionColorOpenDetail | undefined;\n const incomingAnchor = detail?.anchorElement;\n if (!incomingAnchor) return;\n // Toggle: clicking the same anchor while open closes the picker.\n if (isOpenRef.current && anchorRef.current === incomingAnchor) {\n close({ refocus: true });\n return;\n }\n setAnchorEl(incomingAnchor);\n syncFromSelection();\n setIsOpen(true);\n setStorageOpen(true);\n };\n\n const onSelectionUpdate = (): void => {\n if (!isOpenRef.current) return;\n // Anchor vanished (bubble menu hidden by selection becoming empty,\n // or by any other reason). Close defensively.\n if (!anchorRef.current?.isConnected) {\n close();\n return;\n }\n if (editor.state.selection.empty) {\n close();\n } else {\n // Selection changed but stays non-empty (e.g. shift+arrow). Refresh\n // active-state indicators against the new mark set.\n syncFromSelection();\n }\n };\n\n // Editor event API is not AbortSignal-aware; explicit off in cleanup.\n editor.on('notionColorOpen', onOpen);\n editor.on('selectionUpdate', onSelectionUpdate);\n\n return () => {\n editor.off('notionColorOpen', onOpen);\n editor.off('selectionUpdate', onSelectionUpdate);\n // Only flip storage when the picker was actually open. Unconditional\n // reset would race a StrictMode double-mount: the first mount's\n // cleanup would clobber an `isOpen=true` set by the second mount's\n // open handler that landed between teardown and re-mount.\n if (isOpenRef.current) setStorageOpen(false);\n };\n }, [editor, close, syncFromSelection, setStorageOpen]);\n\n // Document-level listeners (outside-click + Escape) scoped to the open\n // window via a single AbortController.\n useEffect(() => {\n if (!isOpen) return;\n const controller = new AbortController();\n const { signal } = controller;\n\n document.addEventListener('mousedown', (e: MouseEvent) => {\n // No redundant `isOpen` guard: this effect only runs when `isOpen === true`\n // and the AbortController detaches the listener as soon as it flips false.\n const target = e.target as Node | null;\n if (!target) return;\n if (panelRef.current?.contains(target)) return;\n if (anchorRef.current?.contains(target)) return;\n close({ refocus: false });\n }, { signal });\n\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpenRef.current) {\n e.preventDefault();\n close({ refocus: true });\n }\n }, { signal });\n\n return () => { controller.abort(); };\n }, [isOpen, close]);\n\n const applyText = useCallback((token: string | null): void => {\n const ed = editorRef.current;\n if (!ed) return;\n (ed.commands as unknown as { setTextColorToken: (t: string | null) => boolean })\n .setTextColorToken(token);\n syncFromSelection();\n }, [syncFromSelection]);\n\n const applyBg = useCallback((token: string | null): void => {\n const ed = editorRef.current;\n if (!ed) return;\n (ed.commands as unknown as { setBackgroundColorToken: (t: string | null) => boolean })\n .setBackgroundColorToken(token);\n syncFromSelection();\n }, [syncFromSelection]);\n\n const tokenLabel = useCallback((token: string): string => {\n return TOKEN_LABELS[token] ?? token.charAt(0).toUpperCase() + token.slice(1);\n }, []);\n\n /**\n * Arrow / Home / End nav across the 5-column swatch grid. Sequential focus\n * walks both Text and Background sections so keyboard users can reach any\n * swatch without re-grabbing Tab.\n */\n const onPanelKeydown = useCallback((event: ReactKeyboardEvent<HTMLDivElement>): void => {\n const cols = 5;\n const root = panelRef.current;\n if (!root) return;\n const swatches = Array.from(\n root.querySelectorAll<HTMLElement>('.dm-ncp-swatch'),\n );\n if (!swatches.length) return;\n\n const active = document.activeElement as HTMLElement | null;\n const idx = active ? swatches.indexOf(active) : -1;\n if (idx === -1) return;\n\n let next = idx;\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n next = Math.min(idx + 1, swatches.length - 1);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n next = Math.max(idx - 1, 0);\n break;\n case 'ArrowDown':\n event.preventDefault();\n next = Math.min(idx + cols, swatches.length - 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n next = Math.max(idx - cols, 0);\n break;\n case 'Home':\n event.preventDefault();\n next = 0;\n break;\n case 'End':\n event.preventDefault();\n next = swatches.length - 1;\n break;\n default:\n return;\n }\n swatches[next]?.focus();\n }, []);\n\n return {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n close,\n tokenLabel,\n onPanelKeydown,\n };\n}\n","/**\n * DomternalNotionColorPicker\n *\n * Notion-style inline color picker rendered via `createPortal` into the\n * `.dm-editor` host. The portal target keeps the panel inside the editor's\n * CSS-variable scope (theme tokens cascade) without imperative DOM moves.\n *\n * Opens in response to the `notionColorOpen` event emitted by the bubble\n * menu's \"A\" trigger. Two sections: text color (top), background color\n * (bottom). Each section is a default-swatch plus the named-token palette.\n *\n * The default UI is rendered when no `children` prop is provided. Pass\n * `children` to take over rendering while keeping the hook's lifecycle.\n */\nimport {\n useLayoutEffect,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Editor } from '@domternal/core';\nimport { positionFloating } from '@domternal/core';\nimport { useCurrentEditor } from '../EditorContext.js';\nimport { useNotionColorPicker, type UseNotionColorPickerResult } from './useNotionColorPicker.js';\n\nexport interface DomternalNotionColorPickerProps {\n /** The editor instance. If omitted, uses EditorProvider context. */\n editor?: Editor;\n /** Custom panel content. When provided, replaces the default swatch grid. */\n children?: ReactNode | ((api: UseNotionColorPickerResult) => ReactNode);\n}\n\nexport function DomternalNotionColorPicker({\n editor: editorProp,\n children,\n}: DomternalNotionColorPickerProps): ReactNode {\n const { editor: contextEditor } = useCurrentEditor();\n const editor = editorProp ?? contextEditor;\n\n const api = useNotionColorPicker({ editor });\n const {\n isOpen,\n hostEl,\n anchorEl,\n panelRef,\n currentTextToken,\n currentBgToken,\n palette,\n applyText,\n applyBg,\n tokenLabel,\n onPanelKeydown,\n } = api;\n\n // Position + two-rAF focus chain. `palette` excluded from deps: the swatch\n // list changing must not steal focus.\n useLayoutEffect(() => {\n if (!isOpen || !anchorEl || !panelRef.current) return;\n const panel = panelRef.current;\n\n const cleanupFloating = positionFloating(anchorEl, panel, {\n placement: 'bottom-start',\n offsetValue: 4,\n });\n\n // Second rAF waits for paint so focus doesn't race the bubble-menu blur.\n let id2 = 0;\n const id1 = requestAnimationFrame(() => {\n id2 = requestAnimationFrame(() => {\n if (!panel.isConnected) return;\n const active = panel.querySelector<HTMLElement>('.dm-ncp-swatch.dm-ncp-active');\n const fallback = panel.querySelector<HTMLElement>('.dm-ncp-swatch--text[data-color=\"null\"]');\n (active ?? fallback)?.focus({ preventScroll: true });\n });\n });\n\n return () => {\n cancelAnimationFrame(id1);\n if (id2) cancelAnimationFrame(id2);\n cleanupFloating();\n };\n }, [isOpen, anchorEl, panelRef]);\n\n if (!isOpen || !hostEl) return null;\n\n const defaultContent = (\n <>\n <div className=\"dm-ncp-section\">\n <div className=\"dm-ncp-label\">Text color</div>\n <div className=\"dm-ncp-grid\">\n <button\n type=\"button\"\n className={`dm-ncp-swatch dm-ncp-swatch--text${currentTextToken === null ? ' dm-ncp-active' : ''}`}\n aria-pressed={currentTextToken === null}\n data-color=\"null\"\n title=\"Default text color\"\n aria-label=\"Default text color\"\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { applyText(null); }}\n />\n {palette.map((t) => (\n <button\n key={t}\n type=\"button\"\n className={`dm-ncp-swatch dm-ncp-swatch--text${currentTextToken === t ? ' dm-ncp-active' : ''}`}\n aria-pressed={currentTextToken === t}\n data-color={t}\n title={tokenLabel(t)}\n aria-label={`${tokenLabel(t)} text`}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { applyText(t); }}\n />\n ))}\n </div>\n </div>\n <div className=\"dm-ncp-section\">\n <div className=\"dm-ncp-label\">Background color</div>\n <div className=\"dm-ncp-grid\">\n <button\n type=\"button\"\n className={`dm-ncp-swatch dm-ncp-swatch--bg${currentBgToken === null ? ' dm-ncp-active' : ''}`}\n aria-pressed={currentBgToken === null}\n data-color=\"null\"\n title=\"Default background\"\n aria-label=\"Default background\"\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { applyBg(null); }}\n />\n {palette.map((t) => (\n <button\n key={t}\n type=\"button\"\n className={`dm-ncp-swatch dm-ncp-swatch--bg${currentBgToken === t ? ' dm-ncp-active' : ''}`}\n aria-pressed={currentBgToken === t}\n data-color={t}\n title={`${tokenLabel(t)} background`}\n aria-label={`${tokenLabel(t)} background`}\n onMouseDown={(e) => { e.preventDefault(); }}\n onClick={() => { applyBg(t); }}\n />\n ))}\n </div>\n </div>\n </>\n );\n\n const content = typeof children === 'function'\n ? (children as (api: UseNotionColorPickerResult) => ReactNode)(api)\n : (children ?? defaultContent);\n\n return createPortal(\n <div\n ref={panelRef}\n className=\"dm-notion-color-picker\"\n data-show\n data-dm-editor-ui\n role=\"dialog\"\n aria-label=\"Text and background color\"\n aria-modal=\"false\"\n onKeyDown={onPanelKeydown}\n >\n {content}\n </div>,\n hostEl,\n );\n}\n","import { createContext, useContext, type RefCallback } from 'react';\n\nexport interface ReactNodeViewContextValue {\n onDragStart: (event: DragEvent) => void;\n nodeViewContentRef: RefCallback<HTMLElement>;\n}\n\nconst ReactNodeViewContext = createContext<ReactNodeViewContextValue | null>(null);\n\nexport const ReactNodeViewProvider = ReactNodeViewContext.Provider;\n\n/**\n * Access node view internals from within a custom React node view component.\n * Used by NodeViewWrapper and NodeViewContent.\n */\nexport function useReactNodeView(): ReactNodeViewContextValue {\n const context = useContext(ReactNodeViewContext);\n if (!context) {\n throw new Error('useReactNodeView must be used within a ReactNodeViewRenderer component');\n }\n return context;\n}\n","import { createElement } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { ReactNodeViewProvider, type ReactNodeViewContextValue } from './ReactNodeViewContext.js';\nimport type { Editor, NodeViewContext } from '@domternal/core';\n\n/** ProseMirror node shape passed to node views. */\ninterface PMNode {\n type: { name: string; spec: { group?: string } };\n attrs: Record<string, unknown>;\n textContent: string;\n nodeSize: number;\n}\n\n/**\n * Props passed to custom React node view components.\n */\nexport interface ReactNodeViewProps {\n /** The editor instance. */\n editor: Editor;\n /** The ProseMirror node being rendered. */\n node: PMNode;\n /** Whether this node is selected via NodeSelection. */\n selected: boolean;\n /** Get the document position of this node. */\n getPos: () => number;\n /** Update the node's attributes. */\n updateAttributes: (attrs: Record<string, unknown>) => void;\n /** Delete this node from the document. */\n deleteNode: () => void;\n /** The extension that created this node view (name, options). Injected by core. */\n extension: { name: string; options: Record<string, unknown> };\n /** ProseMirror decorations applied to this node. */\n decorations: unknown[];\n}\n\nexport interface ReactNodeViewRendererOptions {\n /** Wrapper element tag. @default 'div' for block, 'span' for inline */\n as?: string;\n /** Additional CSS class on the wrapper element. */\n className?: string;\n /** Tag for the content DOM element. Set to null for no editable content. @default 'div' */\n contentDOMElement?: string | null;\n}\n\n/**\n * Converts a React component into a ProseMirror NodeView constructor.\n *\n * Returns a function matching ProseMirror's native `(node, view, getPos, decorations)` signature.\n * The editor and extension context are automatically injected by core via `__domternalContext`.\n *\n * @example\n * ```ts\n * const ImageExtension = Image.extend({\n * addNodeView() {\n * return ReactNodeViewRenderer(ImageComponent);\n * }\n * });\n * ```\n *\n * @example Accessing extension options in the component\n * ```tsx\n * function ImageComponent({ node, extension, decorations }: ReactNodeViewProps) {\n * const maxWidth = extension.options.maxWidth as number;\n * return <NodeViewWrapper><img src={node.attrs.src} style={{ maxWidth }} /></NodeViewWrapper>;\n * }\n * ```\n */\nexport function ReactNodeViewRenderer(\n component: React.ComponentType<ReactNodeViewProps>,\n options: ReactNodeViewRendererOptions = {},\n): (node: PMNode, view: unknown, getPos: () => number, decorations: unknown[]) => ReactNodeView {\n // Return ProseMirror-compatible NodeViewConstructor: (node, view, getPos, decorations) => NodeView\n const constructor = (node: PMNode, _view: unknown, getPos: () => number, decorations: unknown[]): ReactNodeView => {\n // Read context injected by core's ExtensionManager.collectNodeViews()\n const ctx = (constructor as unknown as { __domternalContext?: NodeViewContext }).__domternalContext;\n const editor = ctx?.editor as Editor;\n const extension = ctx?.extension ?? { name: node.type.name, options: {} };\n\n return new ReactNodeView(component, {\n editor,\n node,\n getPos,\n decorations,\n extension,\n }, options);\n };\n\n return constructor;\n}\n\ninterface ReactNodeViewInit {\n editor: Editor;\n node: PMNode;\n getPos: () => number;\n decorations: unknown[];\n extension: { name: string; options: Record<string, unknown> };\n}\n\nclass ReactNodeView {\n dom: HTMLElement;\n contentDOM: HTMLElement | null = null;\n private root: Root;\n private component: React.ComponentType<ReactNodeViewProps>;\n private editor: Editor;\n private node: PMNode;\n private getPos: () => number;\n private decorations: unknown[];\n private extension: { name: string; options: Record<string, unknown> };\n private selected = false;\n\n constructor(\n component: React.ComponentType<ReactNodeViewProps>,\n init: ReactNodeViewInit,\n options: ReactNodeViewRendererOptions,\n ) {\n this.component = component;\n this.editor = init.editor;\n this.node = init.node;\n this.getPos = init.getPos;\n this.decorations = init.decorations;\n this.extension = init.extension;\n\n const isInline = init.node.type.spec.group === 'inline';\n const tag = options.as ?? (isInline ? 'span' : 'div');\n\n this.dom = document.createElement(tag);\n this.dom.setAttribute('data-node-view-wrapper', '');\n if (options.className) {\n this.dom.className = options.className;\n }\n\n // Content DOM for editable nested content\n if (options.contentDOMElement !== null) {\n const contentTag = options.contentDOMElement ?? (isInline ? 'span' : 'div');\n this.contentDOM = document.createElement(contentTag);\n this.contentDOM.setAttribute('data-node-view-content', '');\n this.contentDOM.style.whiteSpace = 'pre-wrap';\n }\n\n this.root = createRoot(this.dom);\n this.render();\n }\n\n private render(): void {\n const contextValue: ReactNodeViewContextValue = {\n onDragStart: (event: DragEvent) => {\n if (this.editor.view.dragging) {\n event.dataTransfer?.setData('text/plain', this.node.textContent);\n }\n },\n nodeViewContentRef: (el: HTMLElement | null) => {\n if (el && this.contentDOM && !el.contains(this.contentDOM)) {\n el.appendChild(this.contentDOM);\n }\n },\n };\n\n const props: ReactNodeViewProps = {\n editor: this.editor,\n node: this.node,\n selected: this.selected,\n getPos: this.getPos,\n extension: this.extension,\n decorations: this.decorations,\n updateAttributes: (attrs) => {\n const pos = this.getPos();\n const { tr } = this.editor.view.state;\n tr.setNodeMarkup(pos, undefined, { ...this.node.attrs, ...attrs });\n this.editor.view.dispatch(tr);\n },\n deleteNode: () => {\n const pos = this.getPos();\n const { tr } = this.editor.view.state;\n tr.delete(pos, pos + this.node.nodeSize);\n this.editor.view.dispatch(tr);\n },\n };\n\n this.root.render(\n createElement(ReactNodeViewProvider, { value: contextValue },\n createElement(this.component, props),\n ),\n );\n }\n\n update(node: PMNode, decorations: unknown[]): boolean {\n if (node.type.name !== this.node.type.name) return false;\n this.node = node;\n this.decorations = decorations;\n this.render();\n return true;\n }\n\n selectNode(): void {\n this.selected = true;\n this.render();\n }\n\n deselectNode(): void {\n this.selected = false;\n this.render();\n }\n\n destroy(): void {\n // Defer unmount to avoid React warnings about synchronous unmount\n const root = this.root;\n setTimeout(() => { root.unmount(); }, 0);\n }\n\n ignoreMutation(mutation: MutationRecord): boolean {\n if (!this.contentDOM) return true;\n return !this.contentDOM.contains(mutation.target);\n }\n\n stopEvent(): boolean {\n return false;\n }\n}\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport { useReactNodeView } from './ReactNodeViewContext.js';\n\nexport interface NodeViewWrapperProps extends HTMLAttributes<HTMLElement> {\n /** The HTML element type to render. @default 'div' */\n as?: ElementType;\n}\n\n/**\n * Container component for custom React node views.\n * Handles drag events and marks the element as a node view wrapper.\n */\nexport function NodeViewWrapper({ as: Tag = 'div', style, ...props }: NodeViewWrapperProps): ReactNode {\n const { onDragStart } = useReactNodeView();\n\n return (\n <Tag\n {...props}\n data-node-view-wrapper=\"\"\n style={{ whiteSpace: 'normal', ...style }}\n onDragStart={onDragStart}\n />\n );\n}\n","import type { ElementType, HTMLAttributes, ReactNode } from 'react';\nimport { useReactNodeView } from './ReactNodeViewContext.js';\n\nexport interface NodeViewContentProps extends HTMLAttributes<HTMLElement> {\n /** The HTML element type to render. @default 'div' */\n as?: ElementType;\n}\n\n/**\n * Placeholder for editable nested content within a custom React node view.\n * ProseMirror manages the content DOM inside this element.\n */\nexport function NodeViewContent({ as: Tag = 'div', style, ...props }: NodeViewContentProps): ReactNode {\n const { nodeViewContentRef } = useReactNodeView();\n\n return (\n <Tag\n {...props}\n ref={nodeViewContentRef}\n data-node-view-content=\"\"\n style={{ whiteSpace: 'pre-wrap', ...style }}\n />\n );\n}\n"]}
|