@domternal/react 0.4.1 → 0.5.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 CHANGED
@@ -24,7 +24,7 @@ See <u>[Packages & Bundle Size](https://domternal.dev/v1/packages)</u> for a ful
24
24
  - **Tree-shakeable** - import only what you use, your bundler strips the rest
25
25
  - **~38 KB gzipped** (own code), <u>[~108 KB total](https://domternal.dev/v1/packages)</u> with ProseMirror
26
26
  - **TypeScript first** - 100% typed, zero `any`
27
- - **7,500+ tests** - 3,936 unit tests and 3,652 E2E tests across 76 Playwright specs
27
+ - **6,400+ tests** - 2,677 unit tests and 3,767 E2E tests across 78 Playwright specs
28
28
  - **Light and dark theme** - 70+ CSS custom properties for full visual control
29
29
  - **Inline styles export** - `getHTML({ styled: true })` produces inline CSS ready for email clients, CMS, and Google Docs
30
30
  - **SSR helpers** - `generateHTML`, `generateJSON`, `generateText` for server-side rendering
package/dist/index.js CHANGED
@@ -465,6 +465,20 @@ function useKeyboardNav(controllerRef, toolbarRef, closeDropdown) {
465
465
  const buttons = toolbarRef.current?.querySelectorAll(".dm-toolbar-button");
466
466
  buttons?.[idx]?.focus();
467
467
  }, []);
468
+ const focusDropdownItem = useCallback((direction, first) => {
469
+ const panel = toolbarRef.current?.querySelector(".dm-toolbar-dropdown-panel");
470
+ if (!panel) return;
471
+ const items = Array.from(panel.querySelectorAll('[role="menuitem"]'));
472
+ if (!items.length) return;
473
+ if (first) {
474
+ items[0]?.focus();
475
+ return;
476
+ }
477
+ const current = document.activeElement;
478
+ const idx = items.indexOf(current);
479
+ const next = idx === -1 ? direction > 0 ? 0 : items.length - 1 : (idx + direction + items.length) % items.length;
480
+ items[next]?.focus();
481
+ }, []);
468
482
  const onKeyDown = useCallback((event) => {
469
483
  const controller = controllerRef.current;
470
484
  if (!controller) return;
@@ -479,6 +493,26 @@ function useKeyboardNav(controllerRef, toolbarRef, closeDropdown) {
479
493
  controller.navigatePrev();
480
494
  focusCurrentButton();
481
495
  break;
496
+ case "ArrowDown": {
497
+ event.preventDefault();
498
+ if (controller.openDropdown) {
499
+ focusDropdownItem(1);
500
+ } else {
501
+ const btn = document.activeElement;
502
+ if (btn?.getAttribute("aria-haspopup") && btn.closest(".dm-toolbar")) {
503
+ btn.click();
504
+ requestAnimationFrame(() => focusDropdownItem(0, true));
505
+ }
506
+ }
507
+ break;
508
+ }
509
+ case "ArrowUp": {
510
+ event.preventDefault();
511
+ if (controller.openDropdown) {
512
+ focusDropdownItem(-1);
513
+ }
514
+ break;
515
+ }
482
516
  case "Home":
483
517
  event.preventDefault();
484
518
  controller.navigateFirst();
@@ -497,7 +531,7 @@ function useKeyboardNav(controllerRef, toolbarRef, closeDropdown) {
497
531
  }
498
532
  break;
499
533
  }
500
- }, [closeDropdown, focusCurrentButton]);
534
+ }, [closeDropdown, focusCurrentButton, focusDropdownItem]);
501
535
  return { onKeyDown, focusCurrentButton };
502
536
  }
503
537
 
@@ -573,6 +607,7 @@ function ToolbarDropdownPanel({
573
607
  type: "button",
574
608
  className: `dm-color-swatch${isActive(sub.name) ? " dm-color-swatch--active" : ""}`,
575
609
  role: "menuitem",
610
+ tabIndex: -1,
576
611
  "aria-label": sub.label,
577
612
  title: sub.label,
578
613
  style: { backgroundColor: sub.color },
@@ -586,6 +621,7 @@ function ToolbarDropdownPanel({
586
621
  type: "button",
587
622
  className: "dm-color-palette-reset",
588
623
  role: "menuitem",
624
+ tabIndex: -1,
589
625
  "aria-label": sub.label,
590
626
  dangerouslySetInnerHTML: { __html: getCachedItemContent(sub.icon, sub.label) },
591
627
  onMouseDown: (e) => e.preventDefault(),
@@ -609,6 +645,7 @@ function ToolbarDropdownPanel({
609
645
  type: "button",
610
646
  className: `dm-toolbar-dropdown-item${isActive(sub.name) ? " dm-toolbar-dropdown-item--active" : ""}`,
611
647
  role: "menuitem",
648
+ tabIndex: -1,
612
649
  "aria-label": sub.label,
613
650
  ref: (el) => {
614
651
  if (el && sub.style) el.setAttribute("style", sub.style);
@@ -1354,6 +1391,42 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1354
1391
  close,
1355
1392
  categories
1356
1393
  } = useEmojiPicker(editor, emojis);
1394
+ const onGridKeyDown = useCallback((event) => {
1395
+ const grid = event.currentTarget;
1396
+ const swatches = Array.from(grid.querySelectorAll(".dm-emoji-swatch"));
1397
+ if (!swatches.length) return;
1398
+ const current = document.activeElement;
1399
+ const idx = swatches.indexOf(current);
1400
+ if (idx === -1) return;
1401
+ const cols = 8;
1402
+ let next = idx;
1403
+ switch (event.key) {
1404
+ case "ArrowRight":
1405
+ event.preventDefault();
1406
+ next = Math.min(idx + 1, swatches.length - 1);
1407
+ break;
1408
+ case "ArrowLeft":
1409
+ event.preventDefault();
1410
+ next = Math.max(idx - 1, 0);
1411
+ break;
1412
+ case "ArrowDown":
1413
+ event.preventDefault();
1414
+ next = Math.min(idx + cols, swatches.length - 1);
1415
+ break;
1416
+ case "ArrowUp":
1417
+ event.preventDefault();
1418
+ next = Math.max(idx - cols, 0);
1419
+ break;
1420
+ case "Enter":
1421
+ case " ":
1422
+ event.preventDefault();
1423
+ swatches[idx]?.click();
1424
+ return;
1425
+ default:
1426
+ return;
1427
+ }
1428
+ swatches[next]?.focus();
1429
+ }, []);
1357
1430
  if (!isOpen) return /* @__PURE__ */ jsx("div", { ref: pickerRef, className: "dm-emoji-picker-host" });
1358
1431
  return /* @__PURE__ */ jsx("div", { ref: pickerRef, className: "dm-emoji-picker-host", children: /* @__PURE__ */ jsxs("div", { className: "dm-emoji-picker", children: [
1359
1432
  /* @__PURE__ */ jsx("div", { className: "dm-emoji-picker-search", children: /* @__PURE__ */ jsx(
@@ -1361,6 +1434,7 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1361
1434
  {
1362
1435
  type: "text",
1363
1436
  placeholder: "Search emoji...",
1437
+ "aria-label": "Search emoji",
1364
1438
  value: searchQuery,
1365
1439
  onChange: onSearch,
1366
1440
  onKeyDown: (e) => {
@@ -1373,6 +1447,8 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1373
1447
  {
1374
1448
  type: "button",
1375
1449
  className: `dm-emoji-picker-tab${activeCategory === cat ? " dm-emoji-picker-tab--active" : ""}`,
1450
+ role: "tab",
1451
+ "aria-selected": activeCategory === cat,
1376
1452
  title: cat,
1377
1453
  "aria-label": cat,
1378
1454
  onMouseDown: (e) => e.preventDefault(),
@@ -1381,11 +1457,12 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1381
1457
  },
1382
1458
  cat
1383
1459
  )) }),
1384
- /* @__PURE__ */ jsx("div", { className: "dm-emoji-picker-grid", onScroll: onGridScroll, children: searchQuery ? /* @__PURE__ */ jsx(Fragment$1, { children: filteredEmojis.length > 0 ? filteredEmojis.map((item) => /* @__PURE__ */ jsx(
1460
+ /* @__PURE__ */ jsx("div", { className: "dm-emoji-picker-grid", onScroll: onGridScroll, onKeyDown: onGridKeyDown, children: searchQuery ? /* @__PURE__ */ jsx(Fragment$1, { children: filteredEmojis.length > 0 ? filteredEmojis.map((item) => /* @__PURE__ */ jsx(
1385
1461
  "button",
1386
1462
  {
1387
1463
  type: "button",
1388
1464
  className: "dm-emoji-swatch",
1465
+ tabIndex: -1,
1389
1466
  title: formatName(item.name),
1390
1467
  "aria-label": formatName(item.name),
1391
1468
  onMouseDown: (e) => e.preventDefault(),
@@ -1401,6 +1478,7 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1401
1478
  {
1402
1479
  type: "button",
1403
1480
  className: "dm-emoji-swatch",
1481
+ tabIndex: -1,
1404
1482
  title: formatName(item.name),
1405
1483
  "aria-label": formatName(item.name),
1406
1484
  onMouseDown: (e) => e.preventDefault(),
@@ -1417,6 +1495,7 @@ function DomternalEmojiPicker({ editor: editorProp, emojis }) {
1417
1495
  {
1418
1496
  type: "button",
1419
1497
  className: "dm-emoji-swatch",
1498
+ tabIndex: -1,
1420
1499
  title: formatName(item.name),
1421
1500
  "aria-label": formatName(item.name),
1422
1501
  onMouseDown: (e) => e.preventDefault(),
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 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 '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]);\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 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 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 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 }, [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 }, [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 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, behavior: 'smooth' });\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 } 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 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 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 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}>\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 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 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 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}>\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}>\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 {...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/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 }, [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 }, [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 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, behavior: 'smooth' });\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 const idx = swatches.indexOf(current);\n if (idx === -1) return;\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}>\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}>\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 {...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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domternal/react",
3
- "version": "0.4.1",
3
+ "version": "0.5.0",
4
4
  "description": "React components for Domternal editor",
5
5
  "author": "https://github.com/ThomasNowHere",
6
6
  "license": "MIT",
@@ -21,7 +21,7 @@
21
21
  "peerDependencies": {
22
22
  "react": ">=18",
23
23
  "react-dom": ">=18",
24
- "@domternal/core": ">=0.4.0"
24
+ "@domternal/core": ">=0.5.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/react": "^19.0.0",
@@ -30,7 +30,7 @@
30
30
  "react-dom": "^19.1.0",
31
31
  "tsup": "^8.5.1",
32
32
  "typescript": "~5.9.3",
33
- "@domternal/core": "0.4.1"
33
+ "@domternal/core": "0.5.0"
34
34
  },
35
35
  "keywords": [
36
36
  "react",