@payloadcms/richtext-lexical 3.55.0-internal.f8c92b5 → 3.55.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.
Files changed (89) hide show
  1. package/dist/exports/client/Field-SOED2PIU.js +2 -0
  2. package/dist/exports/client/{Field-Q3PTZQ75.js.map → Field-SOED2PIU.js.map} +3 -3
  3. package/dist/exports/client/bundled.css +1 -1
  4. package/dist/exports/client/chunk-FSKAVN4P.js +2 -0
  5. package/dist/exports/client/{chunk-CYLMY5ZJ.js.map → chunk-FSKAVN4P.js.map} +2 -2
  6. package/dist/exports/client/chunk-KZKGNMS3.js +12 -0
  7. package/dist/exports/client/{chunk-YCH4JNUH.js.map → chunk-KZKGNMS3.js.map} +2 -2
  8. package/dist/exports/client/{component-3PENNOM3.js → component-M3U253XK.js} +2 -2
  9. package/dist/exports/client/index.d.ts +0 -2
  10. package/dist/exports/client/index.d.ts.map +1 -1
  11. package/dist/exports/client/index.js +10 -10
  12. package/dist/exports/client/index.js.map +4 -4
  13. package/dist/exports/server/rsc.d.ts +0 -1
  14. package/dist/exports/server/rsc.d.ts.map +1 -1
  15. package/dist/exports/server/rsc.js +0 -1
  16. package/dist/exports/server/rsc.js.map +1 -1
  17. package/dist/features/blocks/client/component/BlockContent.js +10 -8
  18. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  19. package/dist/features/converters/lexicalToHtml/async/converters/upload.js +1 -1
  20. package/dist/features/converters/lexicalToHtml/async/converters/upload.js.map +1 -1
  21. package/dist/features/converters/lexicalToHtml/sync/converters/upload.js +1 -1
  22. package/dist/features/converters/lexicalToHtml/sync/converters/upload.js.map +1 -1
  23. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.d.ts.map +1 -1
  24. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +39 -124
  25. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  26. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +8 -6
  27. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  28. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +3 -3
  29. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  30. package/dist/features/relationship/client/plugins/index.js +37 -20
  31. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  32. package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js +53 -28
  33. package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js.map +1 -1
  34. package/dist/features/textState/feature.client.js +3 -1
  35. package/dist/features/textState/feature.client.js.map +1 -1
  36. package/dist/features/textState/feature.server.d.ts.map +1 -1
  37. package/dist/features/textState/feature.server.js +3 -1
  38. package/dist/features/textState/feature.server.js.map +1 -1
  39. package/dist/features/textState/i18n.d.ts +3 -0
  40. package/dist/features/textState/i18n.d.ts.map +1 -0
  41. package/dist/features/textState/i18n.js +108 -0
  42. package/dist/features/textState/i18n.js.map +1 -0
  43. package/dist/features/toolbars/shared/ToolbarButton/index.js +37 -35
  44. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  45. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +30 -20
  46. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  47. package/dist/field/bundled.css +1 -1
  48. package/dist/index.d.ts +1 -2
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/lexical/LexicalEditor.js +35 -22
  53. package/dist/lexical/LexicalEditor.js.map +1 -1
  54. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +15 -7
  55. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  56. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +15 -7
  57. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  58. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +141 -75
  59. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  60. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  61. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +3 -1
  62. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  63. package/dist/lexical/ui/ContentEditable.js +11 -2
  64. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  65. package/dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.d.ts +2 -0
  66. package/dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.d.ts.map +1 -0
  67. package/dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.js +2 -0
  68. package/dist/lexical-proxy/@lexical-react/LexicalNodeContextMenuPlugin.js.map +1 -0
  69. package/dist/nodeTypes.d.ts +1 -13
  70. package/dist/nodeTypes.d.ts.map +1 -1
  71. package/dist/nodeTypes.js +1 -4
  72. package/dist/nodeTypes.js.map +1 -1
  73. package/package.json +26 -21
  74. package/dist/exports/client/Field-Q3PTZQ75.js +0 -2
  75. package/dist/exports/client/chunk-CYLMY5ZJ.js +0 -2
  76. package/dist/exports/client/chunk-YCH4JNUH.js +0 -12
  77. package/dist/field/RenderLexical/renderLexical.d.ts +0 -38
  78. package/dist/field/RenderLexical/renderLexical.d.ts.map +0 -1
  79. package/dist/field/RenderLexical/renderLexical.js +0 -96
  80. package/dist/field/RenderLexical/renderLexical.js.map +0 -1
  81. package/dist/field/RenderLexical/useRenderEditor.d.ts +0 -15
  82. package/dist/field/RenderLexical/useRenderEditor.d.ts.map +0 -1
  83. package/dist/field/RenderLexical/useRenderEditor.js +0 -159
  84. package/dist/field/RenderLexical/useRenderEditor.js.map +0 -1
  85. package/dist/utilities/buildEditorState.d.ts +0 -11
  86. package/dist/utilities/buildEditorState.d.ts.map +0 -1
  87. package/dist/utilities/buildEditorState.js +0 -76
  88. package/dist/utilities/buildEditorState.js.map +0 -1
  89. /package/dist/exports/client/{component-3PENNOM3.js.map → component-M3U253XK.js.map} +0 -0
@@ -99,11 +99,10 @@ function isTriggerVisibleInNearestScrollContainer(targetElement, containerElemen
99
99
  }
100
100
  // Reposition the menu on scroll, window resize, and element resize.
101
101
  export function useDynamicPositioning(resolution, targetElementRef, onReposition, onVisibilityChange) {
102
- const $ = _c(7);
102
+ const $ = _c(12);
103
103
  const [editor] = useLexicalComposerContext();
104
104
  let t0;
105
- let t1;
106
- if ($[0] !== editor || $[1] !== onReposition || $[2] !== onVisibilityChange || $[3] !== resolution || $[4] !== targetElementRef) {
105
+ if ($[0] !== editor || $[1] !== onReposition || $[2] !== onVisibilityChange || $[3] !== resolution || $[4] !== targetElementRef.current) {
107
106
  t0 = () => {
108
107
  const targetElement = targetElementRef.current;
109
108
  if (targetElement != null && resolution != null) {
@@ -141,17 +140,26 @@ export function useDynamicPositioning(resolution, targetElementRef, onReposition
141
140
  };
142
141
  }
143
142
  };
144
- t1 = [editor, onVisibilityChange, onReposition, resolution, targetElementRef];
145
143
  $[0] = editor;
146
144
  $[1] = onReposition;
147
145
  $[2] = onVisibilityChange;
148
146
  $[3] = resolution;
149
- $[4] = targetElementRef;
147
+ $[4] = targetElementRef.current;
150
148
  $[5] = t0;
151
- $[6] = t1;
152
149
  } else {
153
150
  t0 = $[5];
154
- t1 = $[6];
151
+ }
152
+ let t1;
153
+ if ($[6] !== editor || $[7] !== onReposition || $[8] !== onVisibilityChange || $[9] !== resolution || $[10] !== targetElementRef) {
154
+ t1 = [editor, onVisibilityChange, onReposition, resolution, targetElementRef];
155
+ $[6] = editor;
156
+ $[7] = onReposition;
157
+ $[8] = onVisibilityChange;
158
+ $[9] = resolution;
159
+ $[10] = targetElementRef;
160
+ $[11] = t1;
161
+ } else {
162
+ t1 = $[11];
155
163
  }
156
164
  useEffect(t0, t1);
157
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","body","parent1","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","t1","current","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","removeAttribute","registerCommand","ref","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","setContainerDivAttributes","containerDiv","className","display","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","undefined","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","append","positionMenu","t2","t3","rootElement_0","containerDiv_0","t4"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\n// Got from https://stackoverflow.com/a/42543908/2013580\nexport function getScrollParent(\n element: HTMLElement,\n includeHidden: boolean,\n): HTMLBodyElement | HTMLElement {\n let style = getComputedStyle(element)\n const excludeStaticParent = style.position === 'absolute'\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n if (style.position === 'fixed') {\n return document.body\n }\n for (let parent: HTMLElement | null = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent)\n if (excludeStaticParent && style.position === 'static') {\n continue\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\n return parent\n }\n }\n return document.body\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n if (left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAIA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,aAAa,QAAQ;AAC9B,SACEC,aAAa,EACbC,iBAAiB,EACjBC,aAAa,EACbC,oBAAoB,EACpBC,aAAa,EACbC,sBAAsB,EACtBC,oBAAoB,EACpBC,iBAAiB,EACjBC,kBAAkB,EAClBC,eAAe,QACV;AACP,SAASC,WAAW,EAAEC,SAAS,EAAEC,eAAe,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAKnF,SAASC,WAAW,QAAQ;AAO5B,MAAMC,SAAA,GAAY;AAalB,MAAMC,sBAAA,GAA0BC,MAAA;EAC9B,MAAMC,sBAAA,GAAyBC,QAAA,CAASC,cAAc,CAAC;EACvD,IAAI,CAACF,sBAAA,EAAwB;IAC3B;EACF;EAEA,MAAMG,aAAA,GAAgBH,sBAAA,CAAuBI,qBAAqB;EAElE,IAAID,aAAA,CAAcE,GAAG,GAAGF,aAAA,CAAcG,MAAM,GAAGC,MAAA,CAAOC,WAAW,EAAE;IACjER,sBAAA,CAAuBS,cAAc,CAAC;MACpCC,KAAA,EAAO;IACT;EACF;EAEA,IAAIP,aAAA,CAAcE,GAAG,GAAG,GAAG;IACzBL,sBAAA,CAAuBS,cAAc,CAAC;MACpCC,KAAA,EAAO;IACT;EACF;EAEAX,MAAA,CAAOU,cAAc,CAAC;IAAEC,KAAA,EAAO;EAAU;AAC3C;AAEA;;;;AAIA,SAASC,mBAAmBC,YAAoB,EAAEC,SAAiB,EAAEC,MAAc;EACjF,IAAIC,aAAA,GAAgBD,MAAA;EACpB,KAAK,IAAIE,CAAA,GAAID,aAAA,EAAeC,CAAA,IAAKH,SAAA,CAAUI,MAAM,EAAED,CAAA,IAAK;IACtD,IAAIJ,YAAA,CAAaM,SAAS,CAACN,YAAA,CAAaK,MAAM,GAAGD,CAAA,MAAOH,SAAA,CAAUK,SAAS,CAAC,GAAGF,CAAA,GAAI;MACjFD,aAAA,GAAgBC,CAAA;IAClB;EACF;EACA,OAAOD,aAAA;AACT;AAEA;;;;AAIA,SAASI,0BAA0BC,KAAoB;EACrD,MAAMC,SAAA,GAAYzC,aAAA;EAClB,IAAI,CAACC,iBAAA,CAAkBwC,SAAA,KAAc,CAACA,SAAA,CAAUC,WAAW,IAAI;IAC7D;EACF;EACA,MAAMC,MAAA,GAASF,SAAA,CAAUE,MAAM;EAC/B,IAAIA,MAAA,CAAOC,IAAI,KAAK,QAAQ;IAC1B;EACF;EACA,MAAMC,UAAA,GAAaF,MAAA,CAAOG,OAAO;EACjC,IAAI,CAACD,UAAA,CAAWE,YAAY,IAAI;IAC9B;EACF;EACA,MAAMC,eAAA,GAAkBL,MAAA,CAAOT,MAAM;EACrC,MAAMe,WAAA,GAAcJ,UAAA,CAAWK,cAAc,GAAGC,KAAK,CAAC,GAAGH,eAAA;EACzD,MAAMI,eAAA,GAAkBZ,KAAA,CAAMa,iBAAiB,CAAChB,MAAM;EACtD,MAAMiB,WAAA,GAAcvB,kBAAA,CAAmBkB,WAAA,EAAaT,KAAA,CAAMe,cAAc,EAAEH,eAAA;EAC1E,MAAMI,WAAA,GAAcR,eAAA,GAAkBM,WAAA;EACtC,IAAIE,WAAA,GAAc,GAAG;IACnB;EACF;EACA,IAAIC,OAAA;EACJ,IAAID,WAAA,KAAgB,GAAG;IACpB,CAACC,OAAA,CAAQ,GAAGZ,UAAA,CAAWa,SAAS,CAACV,eAAA;EACpC,OAAO;IACJ,GAAGS,OAAA,CAAQ,GAAGZ,UAAA,CAAWa,SAAS,CAACF,WAAA,EAAaR,eAAA;EACnD;EAEA,OAAOS,OAAA;AACT;AAEA;AACA,OAAO,SAASE,gBACdC,OAAoB,EACpBC,aAAsB;EAEtB,IAAIC,KAAA,GAAQC,gBAAA,CAAiBH,OAAA;EAC7B,MAAMI,mBAAA,GAAsBF,KAAA,CAAMG,QAAQ,KAAK;EAC/C,MAAMC,aAAA,GAAgBL,aAAA,GAAgB,yBAAyB;EAC/D,IAAIC,KAAA,CAAMG,QAAQ,KAAK,SAAS;IAC9B,OAAO5C,QAAA,CAAS8C,IAAI;EACtB;EACA,KAAK,IAAIC,OAAA,GAA6BR,OAAA,EAAUQ,OAAA,GAASA,OAAA,CAAOC,aAAa,GAAK;IAChFP,KAAA,GAAQC,gBAAA,CAAiBK,OAAA;IACzB,IAAIJ,mBAAA,IAAuBF,KAAA,CAAMG,QAAQ,KAAK,UAAU;MACtD;IACF;IACA,IAAIC,aAAA,CAAcI,IAAI,CAACR,KAAA,CAAMS,QAAQ,GAAGT,KAAA,CAAMU,SAAS,GAAGV,KAAA,CAAMW,SAAS,GAAG;MAC1E,OAAOL,OAAA;IACT;EACF;EACA,OAAO/C,QAAA,CAAS8C,IAAI;AACtB;AAEA,SAASO,yCACPC,aAA0B,EAC1BC,gBAA6B;EAE7B,MAAMC,KAAA,GAAQF,aAAA,CAAcnD,qBAAqB;EACjD,MAAMsD,KAAA,GAAQF,gBAAA,CAAiBpD,qBAAqB;EACpD,OAAOqD,KAAA,CAAMpD,GAAG,GAAGqD,KAAA,CAAMrD,GAAG,IAAIoD,KAAA,CAAMpD,GAAG,GAAGqD,KAAA,CAAMC,MAAM;AAC1D;AAEA;AACA,OAAO,SAAAC,sBAAAC,UAAA,EAAAC,gBAAA,EAAAC,YAAA,EAAAC,kBAAA;EAAA,MAAAC,CAAA,GAAAxF,EAAA;EAML,OAAAyF,MAAA,IAAiBxF,yBAAA;EAAA,IAAAyF,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAC,MAAA,IAAAD,CAAA,QAAAF,YAAA,IAAAE,CAAA,QAAAD,kBAAA,IAAAC,CAAA,QAAAJ,UAAA,IAAAI,CAAA,QAAAH,gBAAA;IACPK,EAAA,GAAAA,CAAA;MACR,MAAAZ,aAAA,GAAsBO,gBAAA,CAAAO,OAAA;MAAwB,IAC1Cd,aAAA,QAAiB,IAAQM,UAAA,QAAc;QACzC,MAAAS,WAAA,GAAoBJ,MAAA,CAAAK,cAAA,CAAqB;QACzC,MAAAC,gBAAA,GACEF,WAAA,QAAe,GAAO/B,eAAA,CAAgB+B,WAAA,OAAa,IAAArE,QAAA,CAAA8C,IAAsB;QAC3E,IAAA0B,OAAA;QACA,IAAAC,gBAAA,GAAuBpB,wCAAA,CACrBC,aAAA,EACAiB,gBAAA;QAEF,MAAAG,YAAA,YAAAA,CAAA;UAAA,KACOF,OAAA;YACHlE,MAAA,CAAAqE,qBAAA;cACEb,YAAA;cACAU,OAAA,CAAAA,CAAA,CAAAA,KAAA;YAAA,CACF;YACAA,OAAA,CAAAA,CAAA,CAAAA,IAAA;UAAA;UAEF,MAAAI,QAAA,GAAiBvB,wCAAA,CAAyCC,aAAA,EAAeiB,gBAAA;UAAA,IACrEK,QAAA,KAAaH,gBAAA;YACfA,gBAAA,CAAAA,CAAA,CAAmBG,QAAA;YAAnB,IACIb,kBAAA,QAAsB;cACxBA,kBAAA,CAAmBa,QAAA;YAAA;UAAA;QAAA;QAIzB,MAAAC,cAAA,OAAAC,cAAA,CAA0ChB,YAAA;QAC1CxD,MAAA,CAAAyE,gBAAA,CAAwB,UAAUjB,YAAA;QAClC9D,QAAA,CAAA+E,gBAAA,CAA0B,UAAUL,YAAA;UAAAM,OAAA;UAAAC,OAAA;QAAA,CAGpC;QACAJ,cAAA,CAAAK,OAAA,CAAuB5B,aAAA;QAAA;UAErBuB,cAAA,CAAAM,UAAA,CAAyB;UACzB7E,MAAA,CAAA8E,mBAAA,CAA2B,UAAUtB,YAAA;UACrC9D,QAAA,CAAAoF,mBAAA,CAA6B,UAAUV,YAAA,MAAc;QAAA;MAAA;IAAA;IAGxDP,EAAA,IAACF,MAAA,EAAQF,kBAAA,EAAoBD,YAAA,EAAcF,UAAA,EAAYC,gBAAA;IAAiBG,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAF,YAAA;IAAAE,CAAA,MAAAD,kBAAA;IAAAC,CAAA,MAAAJ,UAAA;IAAAI,CAAA,MAAAH,gBAAA;IAAAG,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAG,EAAA;EAAA;IAAAD,EAAA,GAAAF,CAAA;IAAAG,EAAA,GAAAH,CAAA;EAAA;EAxC3E1E,SAAA,CAAU4E,EAwCV,EAAGC,EAAwE;AAAA;AAG7E,OAAO,MAAMkB,yCAAA,GAGRtG,aAAA,CAAc;AAEnB,OAAO,SAASuG,YAAY;EAC1BC,gBAAgB;EAChBC,KAAK;EACLvB,MAAM;EACN;EACAwB,MAAM;EACNC,YAAY;EACZ9B,UAAU;EACV+B,wBAAA,GAA2B;AAAK,CASjC;EACC,MAAM,CAACC,eAAA,EAAiBC,kBAAA,CAAmB,GAAGnG,QAAA,CAAwB;EAEtE,MAAMwC,cAAA,GAAiB0B,UAAC,CAAWzC,KAAK,IAAIyC,UAAA,CAAWzC,KAAK,CAACe,cAAc,IAAK;EAEhF,MAAM4D,kBAAA,GAAqBzG,WAAA,CACxB0G,IAAA;IACC,MAAMC,QAAA,GAAW/B,MAAA,CAAOK,cAAc;IACtC,IAAI0B,QAAA,KAAa,MAAM;MACrBA,QAAA,CAASC,YAAY,CAAC,yBAAyB,GAAGrG,SAAA,UAAmBmG,IAAA,CAAKG,GAAG,EAAE;MAC/EL,kBAAA,CAAmBE,IAAA,CAAKG,GAAG;IAC7B;EACF,GACA,CAACjC,MAAA,CAAO;EAGV,MAAMkC,qCAAA,GAAwC9G,WAAA,CAAY;IACxD;IACA,IAAIoG,MAAA,KAAW,QAAQvD,cAAA,IAAkB,MAAM;MAC7C;MACA,MAAMkE,QAAA,GAAWX,MAAA,CAAOY,OAAO,CAAEC,KAAA,IAAUA,KAAA,CAAMC,KAAK;MAEtD,IAAIH,QAAA,CAASpF,MAAM,EAAE;QACnB,MAAMwF,iBAAA,GAAoBJ,QAAQ,CAAC,EAAE;QACrCN,kBAAA,CAAmBU,iBAAA;MACrB;IACF;EACF,GAAG,CAACf,MAAA,EAAQK,kBAAA,EAAoB5D,cAAA,CAAe;EAE/C5C,SAAA,CAAU;IACR6G,qCAAA;EACF,GAAG,CAACjE,cAAA,EAAgBiE,qCAAA,CAAsC;EAE1D,MAAMM,oBAAA,GAAuBpH,WAAA,CAC1BqH,YAAA;IACClB,KAAA;IAEAvB,MAAA,CAAO0C,MAAM,CAAC;MACZ,MAAMC,uBAAA,GACJhD,UAAA,CAAWzC,KAAK,IAAI,QAAQwE,wBAAA,GACxBzE,yBAAA,CAA0B0C,UAAA,CAAWzC,KAAK,IAC1C;MAEN,IAAIyF,uBAAA,EAAyB;QAC3BA,uBAAA,CAAwBC,MAAM;MAChC;IACF;IAEAC,UAAA,CAAW;MACT;MACA,IAAI1F,SAAA;MACJ6C,MAAA,CAAO8C,IAAI,CAAC;QACV3F,SAAA,GAAYzC,aAAA,IAAiBqI,KAAA;MAC/B;MACA/C,MAAA,CAAO0C,MAAM,CAAC;QACZ,IAAIvF,SAAA,EAAW;UACbvC,aAAA,CAAcuC,SAAA;QAChB;MACF;MAEAsF,YAAA,CAAaO,QAAQ,CAAC;QACpBhD,MAAA;QACAiD,WAAA,EAAatD,UAAA,CAAWzC,KAAK,GAAGyC,UAAA,CAAWzC,KAAK,CAACe,cAAc,GAAG;MACpE;IACF,GAAG;EACL,GACA,CAAC+B,MAAA,EAAQ0B,wBAAA,EAA0B/B,UAAA,CAAWzC,KAAK,EAAEqE,KAAA,CAAM;EAG7DlG,SAAA,CAAU;IACR,OAAO;MACL,MAAM0G,UAAA,GAAW/B,MAAA,CAAOK,cAAc;MACtC,IAAI0B,UAAA,KAAa,MAAM;QACrBA,UAAA,CAASmB,eAAe,CAAC;MAC3B;IACF;EACF,GAAG,CAAClD,MAAA,CAAO;EAEX1E,eAAA,CAAgB;IACd,IAAIkG,MAAA,KAAW,MAAM;MACnBI,kBAAA,CAAmB;IACrB,OAAO,IAAID,eAAA,KAAoB,MAAM;MACnCO,qCAAA;IACF;EACF,GAAG,CAACV,MAAA,EAAQG,eAAA,EAAiBE,kBAAA,EAAoBK,qCAAA,CAAsC;EAEvF7G,SAAA,CAAU;IACR,OAAOZ,aAAA,CACLuF,MAAA,CAAOmD,eAAe,CACpB/B,yCAAA,EACA,CAAC;MAAEU,IAAI,EAAJA;IAAI,CAAE;MACP,IAAIA,MAAA,CAAKsB,GAAG,IAAItB,MAAA,CAAKsB,GAAG,CAACjD,OAAO,IAAI,MAAM;QACxCvE,sBAAA,CAAuBkG,MAAA,CAAKsB,GAAG,CAACjD,OAAO;QACvC,OAAO;MACT;MAEA,OAAO;IACT,GACAtF,oBAAA;EAGN,GAAG,CAACmF,MAAA,EAAQ6B,kBAAA,CAAmB;EAE/BxG,SAAA,CAAU;IACR,OAAOZ,aAAA,CACLuF,MAAA,CAAOmD,eAAe,CACpBpI,sBAAA,EACCsI,OAAA;MACC,MAAMC,KAAA,GAAQD,OAAA;MACd,IAAI7B,MAAA,KAAW,QAAQA,MAAA,CAAOzE,MAAM,IAAI4E,eAAA,KAAoB,MAAM;QAChE,MAAMQ,UAAA,GAAWX,MAAA,CAAOY,OAAO,CAAEC,OAAA,IAAUA,OAAA,CAAMC,KAAK;QACtD,MAAMiB,aAAA,GAAgBpB,UAAA,CAASqB,SAAS,CAAE1B,MAAA,IAASA,MAAA,CAAKG,GAAG,KAAKN,eAAA;QAEhE,MAAM8B,gBAAA,GAAmBF,aAAA,KAAkBpB,UAAA,CAASpF,MAAM,GAAG,IAAIwG,aAAA,GAAgB,IAAI;QAErF,MAAMG,eAAA,GAAkBvB,UAAQ,CAACsB,gBAAA,CAAiB;QAClD,IAAI,CAACC,eAAA,EAAiB;UACpB,OAAO;QACT;QAEA7B,kBAAA,CAAmB6B,eAAA;QACnB,IAAIA,eAAA,CAAgBN,GAAG,IAAI,QAAQM,eAAA,CAAgBN,GAAG,CAACjD,OAAO,EAAE;UAC9DH,MAAA,CAAO2D,eAAe,CAACvC,yCAAA,EAA2C;YAChEwC,KAAA,EAAOH,gBAAA;YACP3B,IAAA,EAAM4B;UACR;QACF;QACAJ,KAAA,CAAMO,cAAc;QACpBP,KAAA,CAAMQ,wBAAwB;MAChC;MACA,OAAO;IACT,GACAjJ,oBAAA,GAEFmF,MAAA,CAAOmD,eAAe,CACpBnI,oBAAA,EACCqI,SAAA;MACC,MAAMC,OAAA,GAAQD,SAAA;MACd,IAAI7B,MAAA,KAAW,QAAQA,MAAA,CAAOzE,MAAM,IAAI4E,eAAA,KAAoB,MAAM;QAChE,MAAMQ,UAAA,GAAWX,MAAA,CAAOY,OAAO,CAAEC,OAAA,IAAUA,OAAA,CAAMC,KAAK;QACtD,MAAMiB,eAAA,GAAgBpB,UAAA,CAASqB,SAAS,CAAE1B,MAAA,IAASA,MAAA,CAAKG,GAAG,KAAKN,eAAA;QAEhE,MAAM8B,kBAAA,GAAmBF,eAAA,KAAkB,IAAIA,eAAA,GAAgB,IAAIpB,UAAA,CAASpF,MAAM,GAAG;QAErF,MAAM2G,iBAAA,GAAkBvB,UAAQ,CAACsB,kBAAA,CAAiB;QAClD,IAAI,CAACC,iBAAA,EAAiB;UACpB,OAAO;QACT;QAEA7B,kBAAA,CAAmB6B,iBAAA;QACnB,IAAIA,iBAAA,CAAgBN,GAAG,IAAI,QAAQM,iBAAA,CAAgBN,GAAG,CAACjD,OAAO,EAAE;UAC9DvE,sBAAA,CAAuB8H,iBAAA,CAAgBN,GAAG,CAACjD,OAAO;QACpD;QACAmD,OAAA,CAAMO,cAAc;QACpBP,OAAA,CAAMQ,wBAAwB;MAChC;MACA,OAAO;IACT,GACAjJ,oBAAA,GAEFmF,MAAA,CAAOmD,eAAe,CACpBjI,kBAAA,EACCmI,SAAA;MACC,MAAMC,OAAA,GAAQD,SAAA;MACdC,OAAA,CAAMO,cAAc;MACpBP,OAAA,CAAMQ,wBAAwB;MAC9BvC,KAAA;MACA,OAAO;IACT,GACA1G,oBAAA,GAEFmF,MAAA,CAAOmD,eAAe,CACpBhI,eAAA,EACCkI,SAAA;MACC,MAAMC,OAAA,GAAQD,SAAA;MAEd,IAAI7B,MAAA,KAAW,QAAQG,eAAA,KAAoB,MAAM;QAC/C,OAAO;MACT;MACA,MAAMQ,UAAA,GAAWX,MAAA,CAAOY,OAAO,CAAEC,OAAA,IAAUA,OAAA,CAAMC,KAAK;MACtD,MAAMG,cAAA,GAAeN,UAAA,CAAS4B,IAAI,CAAEjC,MAAA,IAASA,MAAA,CAAKG,GAAG,KAAKN,eAAA;MAC1D,IAAI,CAACc,cAAA,EAAc;QACjB,OAAO;MACT;MAEAa,OAAA,CAAMO,cAAc;MACpBP,OAAA,CAAMQ,wBAAwB;MAC9BtB,oBAAA,CAAqBC,cAAA;MACrB,OAAO;IACT,GACA5H,oBAAA,GAEFmF,MAAA,CAAOmD,eAAe,CACpBlI,iBAAA,EACCqI,OAAA;MACC,IAAI9B,MAAA,KAAW,QAAQG,eAAA,KAAoB,MAAM;QAC/C,OAAO;MACT;MACA,MAAMQ,UAAA,GAAWX,MAAA,CAAOY,OAAO,CAAEC,OAAA,IAAUA,OAAA,CAAMC,KAAK;MACtD,MAAMG,cAAA,GAAeN,UAAA,CAAS4B,IAAI,CAAEjC,MAAA,IAASA,MAAA,CAAKG,GAAG,KAAKN,eAAA;MAC1D,IAAI,CAACc,cAAA,EAAc;QACjB,OAAO;MACT;MAEA,IAAIa,OAAA,KAAU,MAAM;QAClBA,OAAA,CAAMO,cAAc;QACpBP,OAAA,CAAMQ,wBAAwB;MAChC;MACAtB,oBAAA,CAAqBC,cAAA;MACrB,OAAO;IACT,GACA5H,oBAAA;EAGN,GAAG,CAAC2H,oBAAA,EAAsBjB,KAAA,EAAOvB,MAAA,EAAQwB,MAAA,EAAQG,eAAA,EAAiBE,kBAAA,CAAmB;EAErF,MAAMmC,aAAA,GAAgBzI,OAAA,CACpB,OAAO;IACLiG,MAAA;IACAG,eAAA;IACAa,oBAAA;IACAZ;EACF,IACA,CAACY,oBAAA,EAAsBb,eAAA,EAAiBH,MAAA,CAAO;EAGjD,OAAOC,YAAA,CACLH,gBAAA,EACA0C,aAAA,EACArE,UAAA,CAAWzC,KAAK,GAAGyC,UAAA,CAAWzC,KAAK,CAACe,cAAc,GAAG;AAEzD;AAEA,SAASgG,0BAA0BC,YAAyB,EAAEC,SAAkB;EAC9E,IAAIA,SAAA,IAAa,MAAM;IACrBD,YAAA,CAAaC,SAAS,GAAGA,SAAA;EAC3B;EACAD,YAAA,CAAalC,YAAY,CAAC,cAAc;EACxCkC,YAAA,CAAalC,YAAY,CAAC,QAAQ;EAClCkC,YAAA,CAAa1F,KAAK,CAAC4F,OAAO,GAAG;EAC7BF,YAAA,CAAa1F,KAAK,CAACG,QAAQ,GAAG;AAChC;AAEA,OAAO,SAAA0F,iBAAAC,UAAA,EAAA3E,UAAA,EAAA4E,aAAA,EAAAJ,SAAA;EAAA,MAAApE,CAAA,GAAAxF,EAAA;EAML,OAAAyF,MAAA,IAAiBxF,yBAAA;EAAA,IAAAyF,EAAA;EAAA,IAAAF,CAAA,QAAAyE,MAAA,CAAAC,GAAA;IAEfxE,EAAA,GAAAvE,WAAA,GAAcK,QAAA,CAAA2I,aAAA,CAAuB,aAAS;IAAA3E,CAAA,MAAAE,EAAA;EAAA;IAAAA,EAAA,GAAAF,CAAA;EAAA;EADhD,MAAAuB,gBAAA,GAAyB9F,MAAA,CACvByE,EAA8C;EAAA,IAAAC,EAAA;EAAA,IAAAH,CAAA,QAAAuE,UAAA,IAAAvE,CAAA,QAAAoE,SAAA,IAAApE,CAAA,QAAAC,MAAA,IAAAD,CAAA,QAAAJ,UAAA;IAEfO,EAAA,GAAAA,CAAA;MAAA,IAC3BoB,gBAAA,CAAAnB,OAAA,SAA6B,IAAQwE,MAAA,KAAAC,SAAW;QAAA;MAAA;MAGpD,MAAAxE,WAAA,GAAoBJ,MAAA,CAAAK,cAAA,CAAqB;MACzC,MAAA6D,YAAA,GAAqB5C,gBAAA,CAAAnB,OAAA;MAIrB,MAAA0E,OAAA,GAAgBX,YAAA,CAAAY,UAAA;MAAuB,IACnC1E,WAAA,SAAgB,IAAQT,UAAA,SAAe;QACzC;UAAAvD,MAAA;UAAA2I;QAAA,IAA0BpF,UAAA,CAAAqF,OAAA,CAAkB;QAC5C;UAAAC,IAAA;UAAA9I;QAAA,IAAoBwD,UAAA,CAAAqF,OAAA,CAAkB;QAEtC,MAAAE,MAAA,GAAe/I,GAAA;QACfA,GAAA,GAAAA,GAAA,IAAOmI,UAAA,CAAApI,qBAAA,CAAgC,EAAAC,GAAA,GAAAE,MAAA,CAAA8I,OAAuB;QAC9DF,IAAA,GAAAA,IAAA,IAAQX,UAAA,CAAApI,qBAAA,CAAgC,EAAA+I,IAAA,GAAA5I,MAAA,CAAA+I,OAAwB;QAChElB,YAAA,CAAA1F,KAAA,CAAAyG,IAAA,GAA0B,GAAGA,IAAA,GAAA5I,MAAA,CAAA+I,OAAqB,IAAI;QACtDlB,YAAA,CAAA1F,KAAA,CAAApC,MAAA,GAA4B,GAAGA,MAAA,IAAU;QACzC8H,YAAA,CAAA1F,KAAA,CAAAuG,KAAA,GAA2B,GAAGA,KAAA,IAAS;QAAA,IACnCF,OAAA,SAAY;UACd,MAAAQ,QAAA,GAAiBR,OAAA,CAAA3I,qBAAA,CAA6B;UAC9C,MAAAoJ,UAAA,GAAmBD,QAAA,CAAAjJ,MAAA;UACnB,MAAAmJ,SAAA,GAAkBF,QAAA,CAAAN,KAAA;UAElB,MAAAS,eAAA,GAAwBpF,WAAA,CAAAlE,qBAAA,CAAiC;UAAA,IAErD+I,IAAA,GAAOM,SAAA,GAAYC,eAAA,CAAAC,KAAqB;YAC1CvB,YAAA,CAAA1F,KAAA,CAAAyG,IAAA,GAA0B,GAAGO,eAAA,CAAAC,KAAA,GAAwBF,SAAA,GAAAlJ,MAAA,CAAA+I,OAA0B,IAAI;UAAA;UAGrF,MAAAM,wBAAA,GAAiCR,MAAA,GAASI,UAAA,KAAa,GAAAjJ,MAAA,CAAAC,WAAoC;UAE3F,MAAAqJ,qBAAA,GAA8BT,MAAA,IAAS;UAAA,IAGnCQ,wBAAA,KAA6BC,qBAAA;YAE/BzB,YAAA,CAAA1F,KAAA,CAAArC,GAAA,GAAyB,GACvBA,GAAA,KAAM,GAAkBmJ,UAAA,GAAAjJ,MAAA,CAAA8I,OAA2B,IAAI/I,MAAA,KAAc,KACnE;UAAA;YAEJ8H,YAAA,CAAA1F,KAAA,CAAArC,GAAA,GAAyB,GAAGA,GAAA,GAAAE,MAAA,CAAA8I,OAAoB,KAAG,IAAmB;UAAA;QAAA;QAAA,KAIrEjB,YAAA,CAAA0B,WAAA;UACH3B,yBAAA,CAA0BC,YAAA,EAAcC,SAAA;UACxCG,UAAA,CAAAuB,MAAA,CAAkB3B,YAAA;QAAA;QAEpBA,YAAA,CAAAlC,YAAA,CAA0B,MAAM;QAChCV,gBAAA,CAAAnB,OAAA,GAA2B+D,YAAA;QAC3B9D,WAAA,CAAA4B,YAAA,CAAyB,iBAAiB;MAAA;IAAA;IAE9CjC,CAAA,MAAAuE,UAAA;IAAAvE,CAAA,MAAAoE,SAAA;IAAApE,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAAJ,UAAA;IAAAI,CAAA,MAAAG,EAAA;EAAA;IAAAA,EAAA,GAAAH,CAAA;EAAA;EAtDA,MAAA+F,YAAA,GAAqB5F,EAsDyB;EAAA,IAAA6F,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAjG,CAAA,QAAAC,MAAA,IAAAD,CAAA,QAAA+F,YAAA,IAAA/F,CAAA,QAAAJ,UAAA;IAEpCoG,EAAA,GAAAA,CAAA;MACR,MAAAE,aAAA,GAAoBjG,MAAA,CAAAK,cAAA,CAAqB;MAAA,IACrCV,UAAA,SAAe;QACjBmG,YAAA;QAAA;UAAA,IAEM1F,aAAA,SAAgB;YAClBA,aAAA,CAAA8C,eAAA,CAA4B;UAAA;UAG9B,MAAAgD,cAAA,GAAqB5E,gBAAA,CAAAnB,OAAA;UAAwB,IACzC+D,cAAA,SAAiB,IAAQA,cAAA,CAAA0B,WAAwB;YACnD1B,cAAA,CAAAtB,MAAA,CAAmB;YACnBsB,cAAA,CAAAhB,eAAA,CAA6B;UAAA;QAAA;MAAA;IAAA;IAIlC8C,EAAA,IAAChG,MAAA,EAAQ8F,YAAA,EAAcnG,UAAA;IAAWI,CAAA,MAAAC,MAAA;IAAAD,CAAA,MAAA+F,YAAA;IAAA/F,CAAA,MAAAJ,UAAA;IAAAI,CAAA,MAAAgG,EAAA;IAAAhG,CAAA,OAAAiG,EAAA;EAAA;IAAAD,EAAA,GAAAhG,CAAA;IAAAiG,EAAA,GAAAjG,CAAA;EAAA;EAhBrC1E,SAAA,CAAU0K,EAgBV,EAAGC,EAAkC;EAAA,IAAAG,EAAA;EAAA,IAAApG,CAAA,SAAAJ,UAAA,IAAAI,CAAA,SAAAwE,aAAA;IAGnC4B,EAAA,GAAAxF,QAAA;MAAA,IACMhB,UAAA,SAAe;QAAA,KACZgB,QAAA;UACH4D,aAAA,KAAc;QAAA;MAAA;IAAA;IAGpBxE,CAAA,OAAAJ,UAAA;IAAAI,CAAA,OAAAwE,aAAA;IAAAxE,CAAA,OAAAoG,EAAA;EAAA;IAAAA,EAAA,GAAApG,CAAA;EAAA;EAPF,MAAAD,kBAAA,GAA2BqG,EAQE;EAG7BzG,qBAAA,CAAsBC,UAAA,EAAY2B,gBAAA,EAAkBwE,YAAA,EAAchG,kBAAA;EAAA,OAE3DwB,gBAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","getScrollParent","element","includeHidden","style","getComputedStyle","excludeStaticParent","position","overflowRegex","body","parent1","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","current","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","t1","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","removeAttribute","registerCommand","ref","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","setContainerDivAttributes","containerDiv","className","display","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","undefined","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","append","positionMenu","t2","t3","rootElement_0","containerDiv_0","t4"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\n// Got from https://stackoverflow.com/a/42543908/2013580\nexport function getScrollParent(\n element: HTMLElement,\n includeHidden: boolean,\n): HTMLBodyElement | HTMLElement {\n let style = getComputedStyle(element)\n const excludeStaticParent = style.position === 'absolute'\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n if (style.position === 'fixed') {\n return document.body\n }\n for (let parent: HTMLElement | null = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent)\n if (excludeStaticParent && style.position === 'static') {\n continue\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\n return parent\n }\n }\n return document.body\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n if (left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { c as _c } from "react/compiler-runtime";
3
4
  import { jsx as _jsx } from "react/jsx-runtime";
4
5
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
5
6
  import { mergeRegister } from '@lexical/utils';
@@ -75,41 +76,63 @@ function startTransition(callback) {
75
76
  }
76
77
  export { useDynamicPositioning } from './LexicalMenu.js';
77
78
  export const ENABLE_SLASH_MENU_COMMAND = createCommand('ENABLE_SLASH_MENU_COMMAND');
78
- export function LexicalTypeaheadMenuPlugin({
79
- anchorClassName,
80
- anchorElem,
81
- groups,
82
- menuRenderFn,
83
- onClose,
84
- onOpen,
85
- onQueryChange,
86
- triggerFn
87
- }) {
79
+ export function LexicalTypeaheadMenuPlugin(t0) {
80
+ const $ = _c(30);
81
+ const {
82
+ anchorClassName,
83
+ anchorElem,
84
+ groups,
85
+ menuRenderFn,
86
+ onClose,
87
+ onOpen,
88
+ onQueryChange,
89
+ triggerFn
90
+ } = t0;
88
91
  const [editor] = useLexicalComposerContext();
89
92
  const [resolution, setResolution] = useState(null);
90
93
  const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName);
91
- const closeTypeahead = useCallback(() => {
92
- setResolution(null);
93
- if (onClose != null && resolution !== null) {
94
- onClose();
95
- }
96
- }, [onClose, resolution]);
97
- const openTypeahead = useCallback(res => {
98
- setResolution(res);
99
- if (onOpen != null && resolution === null) {
100
- onOpen(res);
101
- }
102
- }, [onOpen, resolution]);
103
- // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there
104
- useEffect(() => {
105
- return mergeRegister(editor.registerCommand(ENABLE_SLASH_MENU_COMMAND, ({
106
- node
107
- }) => {
94
+ let t1;
95
+ if ($[0] !== onClose || $[1] !== resolution) {
96
+ t1 = () => {
97
+ setResolution(null);
98
+ if (onClose != null && resolution !== null) {
99
+ onClose();
100
+ }
101
+ };
102
+ $[0] = onClose;
103
+ $[1] = resolution;
104
+ $[2] = t1;
105
+ } else {
106
+ t1 = $[2];
107
+ }
108
+ const closeTypeahead = t1;
109
+ let t2;
110
+ if ($[3] !== onOpen || $[4] !== resolution) {
111
+ t2 = res => {
112
+ setResolution(res);
113
+ if (onOpen != null && resolution === null) {
114
+ onOpen(res);
115
+ }
116
+ };
117
+ $[3] = onOpen;
118
+ $[4] = resolution;
119
+ $[5] = t2;
120
+ } else {
121
+ t2 = $[5];
122
+ }
123
+ const openTypeahead = t2;
124
+ let t3;
125
+ let t4;
126
+ if ($[6] !== editor || $[7] !== openTypeahead) {
127
+ t3 = () => mergeRegister(editor.registerCommand(ENABLE_SLASH_MENU_COMMAND, t5 => {
128
+ const {
129
+ node
130
+ } = t5;
108
131
  editor.getEditorState().read(() => {
109
132
  const match = {
110
133
  leadOffset: 0,
111
- matchingString: '',
112
- replaceableString: ''
134
+ matchingString: "",
135
+ replaceableString: ""
113
136
  };
114
137
  if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {
115
138
  if (node !== null) {
@@ -118,9 +141,7 @@ export function LexicalTypeaheadMenuPlugin({
118
141
  const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow);
119
142
  if (isRangePositioned !== null) {
120
143
  startTransition(() => openTypeahead({
121
- getRect: () => {
122
- return range.getBoundingClientRect();
123
- },
144
+ getRect: () => range.getBoundingClientRect(),
124
145
  match
125
146
  }));
126
147
  }
@@ -130,51 +151,96 @@ export function LexicalTypeaheadMenuPlugin({
130
151
  });
131
152
  return true;
132
153
  }, COMMAND_PRIORITY_LOW));
133
- }, [editor, openTypeahead]);
134
- useEffect(() => {
135
- const updateListener = () => {
136
- editor.getEditorState().read(() => {
137
- const editorWindow_0 = editor._window ?? window;
138
- const range_0 = editorWindow_0.document.createRange();
139
- const selection = $getSelection();
140
- const text = getQueryTextForSearch(editor);
141
- if (!$isRangeSelection(selection) || !selection.isCollapsed() || text === undefined || range_0 === null) {
142
- closeTypeahead();
143
- return;
144
- }
145
- const match_0 = triggerFn({
146
- editor,
147
- query: text
148
- });
149
- onQueryChange(match_0 ? match_0.matchingString : null);
150
- if (match_0 !== null && !isSelectionOnEntityBoundary(editor, match_0.leadOffset)) {
151
- const isRangePositioned_0 = tryToPositionRange(match_0.leadOffset, range_0, editorWindow_0);
152
- if (isRangePositioned_0 !== null) {
153
- startTransition(() => openTypeahead({
154
- getRect: () => {
155
- return range_0.getBoundingClientRect();
156
- },
157
- match: match_0
158
- }));
154
+ t4 = [editor, openTypeahead];
155
+ $[6] = editor;
156
+ $[7] = openTypeahead;
157
+ $[8] = t3;
158
+ $[9] = t4;
159
+ } else {
160
+ t3 = $[8];
161
+ t4 = $[9];
162
+ }
163
+ useEffect(t3, t4);
164
+ let t5;
165
+ if ($[10] !== closeTypeahead || $[11] !== editor || $[12] !== onQueryChange || $[13] !== openTypeahead || $[14] !== triggerFn) {
166
+ t5 = () => {
167
+ const updateListener = () => {
168
+ editor.getEditorState().read(() => {
169
+ const editorWindow_0 = editor._window ?? window;
170
+ const range_0 = editorWindow_0.document.createRange();
171
+ const selection = $getSelection();
172
+ const text = getQueryTextForSearch(editor);
173
+ if (!$isRangeSelection(selection) || !selection.isCollapsed() || text === undefined || range_0 === null) {
174
+ closeTypeahead();
159
175
  return;
160
176
  }
161
- }
162
- closeTypeahead();
163
- });
164
- };
165
- const removeUpdateListener = editor.registerUpdateListener(updateListener);
166
- return () => {
167
- removeUpdateListener();
177
+ const match_0 = triggerFn({
178
+ editor,
179
+ query: text
180
+ });
181
+ onQueryChange(match_0 ? match_0.matchingString : null);
182
+ if (match_0 !== null && !isSelectionOnEntityBoundary(editor, match_0.leadOffset)) {
183
+ const isRangePositioned_0 = tryToPositionRange(match_0.leadOffset, range_0, editorWindow_0);
184
+ if (isRangePositioned_0 !== null) {
185
+ startTransition(() => openTypeahead({
186
+ getRect: () => range_0.getBoundingClientRect(),
187
+ match: match_0
188
+ }));
189
+ return;
190
+ }
191
+ }
192
+ closeTypeahead();
193
+ });
194
+ };
195
+ const removeUpdateListener = editor.registerUpdateListener(updateListener);
196
+ return () => {
197
+ removeUpdateListener();
198
+ };
168
199
  };
169
- }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead]);
170
- return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/_jsx(LexicalMenu, {
171
- anchorElementRef: anchorElementRef,
172
- close: closeTypeahead,
173
- editor: editor,
174
- groups: groups,
175
- menuRenderFn: menuRenderFn,
176
- resolution: resolution,
177
- shouldSplitNodeWithQuery: true
178
- });
200
+ $[10] = closeTypeahead;
201
+ $[11] = editor;
202
+ $[12] = onQueryChange;
203
+ $[13] = openTypeahead;
204
+ $[14] = triggerFn;
205
+ $[15] = t5;
206
+ } else {
207
+ t5 = $[15];
208
+ }
209
+ let t6;
210
+ if ($[16] !== closeTypeahead || $[17] !== editor || $[18] !== onQueryChange || $[19] !== openTypeahead || $[20] !== resolution || $[21] !== triggerFn) {
211
+ t6 = [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead];
212
+ $[16] = closeTypeahead;
213
+ $[17] = editor;
214
+ $[18] = onQueryChange;
215
+ $[19] = openTypeahead;
216
+ $[20] = resolution;
217
+ $[21] = triggerFn;
218
+ $[22] = t6;
219
+ } else {
220
+ t6 = $[22];
221
+ }
222
+ useEffect(t5, t6);
223
+ let t7;
224
+ if ($[23] !== anchorElementRef || $[24] !== closeTypeahead || $[25] !== editor || $[26] !== groups || $[27] !== menuRenderFn || $[28] !== resolution) {
225
+ t7 = anchorElementRef.current === null || resolution === null || editor === null ? null : _jsx(LexicalMenu, {
226
+ anchorElementRef,
227
+ close: closeTypeahead,
228
+ editor,
229
+ groups,
230
+ menuRenderFn,
231
+ resolution,
232
+ shouldSplitNodeWithQuery: true
233
+ });
234
+ $[23] = anchorElementRef;
235
+ $[24] = closeTypeahead;
236
+ $[25] = editor;
237
+ $[26] = groups;
238
+ $[27] = menuRenderFn;
239
+ $[28] = resolution;
240
+ $[29] = t7;
241
+ } else {
242
+ t7 = $[29];
243
+ }
244
+ return t7;
179
245
  }
180
246
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","undefined","query","removeUpdateListener","registerUpdateListener","current","_jsx","close","shouldSplitNodeWithQuery"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","t0","$","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","t1","closeTypeahead","t2","res","openTypeahead","t3","t4","registerCommand","t5","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","editorWindow_0","range_0","undefined","match_0","query","isRangePositioned_0","removeUpdateListener","registerUpdateListener","t6","t7","current","_jsx","close","shouldSplitNodeWithQuery"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,cAAc,CAAA;AAqarB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,cAAc,CAAA;AAuarB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
@@ -325,12 +325,14 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
325
325
  }
326
326
  }
327
327
  return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(React.Fragment, {
328
- children: [/*#__PURE__*/_jsx("div", {
328
+ children: [/*#__PURE__*/_jsx("button", {
329
+ "aria-label": "Drag to move",
329
330
  className: "icon draggable-block-menu",
330
331
  draggable: true,
331
332
  onDragEnd: onDragEnd,
332
333
  onDragStart: onDragStart,
333
334
  ref: menuRef,
335
+ type: "button",
334
336
  children: /*#__PURE__*/_jsx("div", {
335
337
  className: isEditable ? 'icon' : ''
336
338
  })