@payloadcms/richtext-lexical 3.0.0-beta.90 → 3.0.0-beta.92

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 (90) hide show
  1. package/dist/exports/client/Field-SUWHJ4HF.js +2 -0
  2. package/dist/exports/client/Field-SUWHJ4HF.js.map +7 -0
  3. package/dist/exports/client/RelationshipComponent-EZORSGUZ.js +2 -0
  4. package/dist/exports/client/RelationshipComponent-EZORSGUZ.js.map +7 -0
  5. package/dist/exports/client/bundled.css +1 -1
  6. package/dist/exports/client/{chunk-NI6Z4GBD.js → chunk-OLSILJA6.js} +1 -1
  7. package/dist/exports/client/{chunk-NI6Z4GBD.js.map → chunk-OLSILJA6.js.map} +1 -1
  8. package/dist/exports/client/{chunk-G5DTIOPI.js → chunk-TD7O23AB.js} +2 -2
  9. package/dist/exports/client/{chunk-G5DTIOPI.js.map → chunk-TD7O23AB.js.map} +2 -2
  10. package/dist/exports/client/{chunk-LGUXX2QH.js → chunk-UJDWBQ2K.js} +2 -2
  11. package/dist/exports/client/{chunk-LGUXX2QH.js.map → chunk-UJDWBQ2K.js.map} +2 -2
  12. package/dist/exports/client/{chunk-OKMIHD2R.js → chunk-YL453UOS.js} +2 -2
  13. package/dist/exports/client/chunk-YSI2QILQ.js +2 -0
  14. package/dist/exports/client/{chunk-TO2W7Q2G.js.map → chunk-YSI2QILQ.js.map} +2 -2
  15. package/dist/exports/client/component-2YLEVOFH.js +2 -0
  16. package/dist/exports/client/component-2YLEVOFH.js.map +7 -0
  17. package/dist/exports/client/{component-LCAAX56T.js → component-7RAP75FW.js} +2 -2
  18. package/dist/exports/client/{componentInline-72VZAAHP.js → componentInline-YSHGRL2J.js} +2 -2
  19. package/dist/exports/client/index.js +12 -12
  20. package/dist/exports/client/index.js.map +3 -3
  21. package/dist/features/debug/testRecorder/client/plugin/index.js +187 -363
  22. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  23. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +234 -470
  24. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  25. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +3 -16
  26. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  27. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +59 -123
  28. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  29. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  30. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +5 -3
  31. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  32. package/dist/features/link/server/baseFields.d.ts.map +1 -1
  33. package/dist/features/link/server/baseFields.js +12 -2
  34. package/dist/features/link/server/baseFields.js.map +1 -1
  35. package/dist/features/migrations/slateToLexical/converter/converters/link/converter.js +1 -1
  36. package/dist/features/migrations/slateToLexical/converter/converters/link/converter.js.map +1 -1
  37. package/dist/features/relationship/client/components/RelationshipComponent.d.ts.map +1 -1
  38. package/dist/features/relationship/client/components/RelationshipComponent.js +8 -5
  39. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  40. package/dist/features/relationship/server/nodes/RelationshipNode.d.ts +6 -4
  41. package/dist/features/relationship/server/nodes/RelationshipNode.d.ts.map +1 -1
  42. package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
  43. package/dist/features/toolbars/inline/client/Toolbar/index.js +53 -94
  44. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  45. package/dist/features/upload/client/component/index.d.ts.map +1 -1
  46. package/dist/features/upload/client/component/index.js +3 -0
  47. package/dist/features/upload/client/component/index.js.map +1 -1
  48. package/dist/features/upload/server/nodes/UploadNode.d.ts +9 -7
  49. package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
  50. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  51. package/dist/field/bundled.css +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +8 -19
  54. package/dist/index.js.map +1 -1
  55. package/dist/lexical/config/client/EditorConfigProvider.js +1 -1
  56. package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
  57. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +71 -109
  58. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  59. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +96 -135
  60. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  61. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  62. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +114 -139
  63. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  64. package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts.map +1 -1
  65. package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js +7 -25
  66. package/dist/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js.map +1 -1
  67. package/dist/lexical/plugins/handles/utils/setHandlePosition.d.ts.map +1 -1
  68. package/dist/lexical/plugins/handles/utils/setHandlePosition.js +4 -6
  69. package/dist/lexical/plugins/handles/utils/setHandlePosition.js.map +1 -1
  70. package/dist/lexical/ui/icons/Caret/index.svg +2 -2
  71. package/dist/lexical/utils/setFloatingElemPosition.js +1 -1
  72. package/dist/lexical/utils/setFloatingElemPosition.js.map +1 -1
  73. package/dist/lexical/utils/url.d.ts +5 -0
  74. package/dist/lexical/utils/url.d.ts.map +1 -1
  75. package/dist/lexical/utils/url.js +7 -0
  76. package/dist/lexical/utils/url.js.map +1 -1
  77. package/dist/utilities/migrateSlateToLexical/index.d.ts.map +1 -1
  78. package/dist/utilities/migrateSlateToLexical/index.js +16 -1
  79. package/dist/utilities/migrateSlateToLexical/index.js.map +1 -1
  80. package/package.json +13 -13
  81. package/dist/exports/client/Field-63NGLPJB.js +0 -2
  82. package/dist/exports/client/Field-63NGLPJB.js.map +0 -7
  83. package/dist/exports/client/RelationshipComponent-3QWBV4GT.js +0 -2
  84. package/dist/exports/client/RelationshipComponent-3QWBV4GT.js.map +0 -7
  85. package/dist/exports/client/chunk-TO2W7Q2G.js +0 -2
  86. package/dist/exports/client/component-3OFD6Q4Z.js +0 -2
  87. package/dist/exports/client/component-3OFD6Q4Z.js.map +0 -7
  88. /package/dist/exports/client/{chunk-OKMIHD2R.js.map → chunk-YL453UOS.js.map} +0 -0
  89. /package/dist/exports/client/{component-LCAAX56T.js.map → component-7RAP75FW.js.map} +0 -0
  90. /package/dist/exports/client/{componentInline-72VZAAHP.js.map → componentInline-YSHGRL2J.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","createCommand","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","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","parent","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","onReposition","onVisibilityChange","$","editor","t0","t1","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","unobserve","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","onSelectItem","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","removeAttribute","registerCommand","ref","current","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","useMenuAnchorRef","anchorElem","setResolution","className","Symbol","for","createElement","containerDiv","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","display","append","positionMenu","t2","t3","rootElement_0","containerDiv_0","remove","t4"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { 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 COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n createCommand,\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\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 selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n selectedItemKey: null | string\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | ReactPortal | null\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) return\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 | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return null\n }\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 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 null\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 targetElement: HTMLElement | null,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\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.unobserve(targetElement)\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [targetElement, editor, onVisibilityChange, onReposition, resolution])\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 onSelectItem,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\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 editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n onSelectItem(\n selectedItem,\n textNodeContainingQuery,\n close,\n resolution.match ? resolution.match.matchingString : '',\n )\n })\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, onSelectItem, 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\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\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 selectItemAndCleanUp,\n selectedItemKey,\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\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement>(document.createElement('div'))\n const positionMenu = useCallback(() => {\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 if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('id', 'slash-menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n anchorElem.append(containerDiv)\n }\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 }\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.current, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","COMMAND_PRIORITY_LOW","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","createCommand","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","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","parent","parentElement","test","overflow","overflowY","overflowX","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","onReposition","onVisibilityChange","$","editor","t0","t1","rootElement","getRootElement","rootScrollParent","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","unobserve","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","onSelectItem","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","removeAttribute","registerCommand","ref","current","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","useMenuAnchorRef","anchorElem","setResolution","className","createElement","positionMenu","containerDiv","VERTICAL_OFFSET","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","right","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","margin","isConnected","display","append","remove"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { 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 COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n createCommand,\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\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 selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n selectedItemKey: null | string\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | ReactPortal | null\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) return\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 | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return null\n }\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 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 null\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 targetElement: HTMLElement | null,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\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.unobserve(targetElement)\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [targetElement, editor, onVisibilityChange, onReposition, resolution])\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 onSelectItem,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\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 editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n onSelectItem(\n selectedItem,\n textNodeContainingQuery,\n close,\n resolution.match ? resolution.match.matchingString : '',\n )\n })\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, onSelectItem, 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\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\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 selectItemAndCleanUp,\n selectedItemKey,\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\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement>(document.createElement('div'))\n const positionMenu = useCallback(() => {\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 if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('id', 'slash-menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n anchorElem.append(containerDiv)\n }\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 }\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.current, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { c as _c } from "react/compiler-runtime";
4
3
  import { jsx as _jsx } from "react/jsx-runtime";
5
4
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
6
5
  import { $createParagraphNode } from 'lexical';
@@ -28,7 +27,6 @@ function getCurrentIndex(keysLength) {
28
27
  return Math.floor(keysLength / 2);
29
28
  }
30
29
  function useAddBlockHandle(editor, anchorElem, isEditable) {
31
- const $ = _c(15);
32
30
  const scrollerElem = anchorElem.parentElement;
33
31
  const {
34
32
  editorConfig
@@ -36,156 +34,119 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
36
34
  const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12;
37
35
  const menuRef = useRef(null);
38
36
  const [hoveredElement, setHoveredElement] = useState(null);
39
- let t0;
40
- let t1;
41
- if ($[0] !== scrollerElem || $[1] !== editor || $[2] !== anchorElem || $[3] !== hoveredElement) {
42
- t0 = () => {
43
- const onDocumentMouseMove = function onDocumentMouseMove(event) {
44
- const target = event.target;
45
- if (!isHTMLElement(target)) {
46
- return;
47
- }
48
- const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target);
49
- if (distanceFromScrollerElem === -1) {
50
- setHoveredElement(null);
51
- return;
52
- }
53
- if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {
54
- return;
55
- }
56
- const topLevelNodeKeys = getTopLevelNodeKeys(editor);
57
- const {
58
- blockElem: _emptyBlockElem,
59
- blockNode,
60
- foundAtIndex
61
- } = getNodeCloseToPoint({
62
- anchorElem,
63
- cache_threshold: 0,
64
- editor,
65
- horizontalOffset: -distanceFromScrollerElem,
66
- point: new Point(event.x, event.y),
67
- returnEmptyParagraphs: true,
68
- startIndex: getCurrentIndex(topLevelNodeKeys.length),
69
- useEdgeAsDefault: false
37
+ useEffect(() => {
38
+ function onDocumentMouseMove(event) {
39
+ const target = event.target;
40
+ if (!isHTMLElement(target)) {
41
+ return;
42
+ }
43
+ const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target);
44
+ if (distanceFromScrollerElem === -1) {
45
+ setHoveredElement(null);
46
+ return;
47
+ }
48
+ if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {
49
+ return;
50
+ }
51
+ const topLevelNodeKeys = getTopLevelNodeKeys(editor);
52
+ const {
53
+ blockElem: _emptyBlockElem,
54
+ blockNode,
55
+ foundAtIndex
56
+ } = getNodeCloseToPoint({
57
+ anchorElem,
58
+ cache_threshold: 0,
59
+ editor,
60
+ horizontalOffset: -distanceFromScrollerElem,
61
+ point: new Point(event.x, event.y),
62
+ returnEmptyParagraphs: true,
63
+ startIndex: getCurrentIndex(topLevelNodeKeys.length),
64
+ useEdgeAsDefault: false
65
+ });
66
+ prevIndex = foundAtIndex;
67
+ if (!_emptyBlockElem) {
68
+ return;
69
+ }
70
+ if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {
71
+ setHoveredElement({
72
+ elem: _emptyBlockElem,
73
+ node: blockNode
70
74
  });
71
- prevIndex = foundAtIndex;
72
- if (!_emptyBlockElem) {
73
- return;
74
- }
75
- if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {
76
- setHoveredElement({
77
- elem: _emptyBlockElem,
78
- node: blockNode
79
- });
80
- }
81
- };
82
- document?.addEventListener("mousemove", onDocumentMouseMove);
83
- return () => {
84
- document?.removeEventListener("mousemove", onDocumentMouseMove);
85
- };
75
+ }
76
+ }
77
+ // Since the draggableBlockElem is outside the actual editor, we need to listen to the document
78
+ // to be able to detect when the mouse is outside the editor and respect a buffer around
79
+ // the scrollerElem to avoid the draggableBlockElem disappearing too early.
80
+ document?.addEventListener('mousemove', onDocumentMouseMove);
81
+ return () => {
82
+ document?.removeEventListener('mousemove', onDocumentMouseMove);
86
83
  };
87
- t1 = [scrollerElem, anchorElem, editor, hoveredElement];
88
- $[0] = scrollerElem;
89
- $[1] = editor;
90
- $[2] = anchorElem;
91
- $[3] = hoveredElement;
92
- $[4] = t0;
93
- $[5] = t1;
94
- } else {
95
- t0 = $[4];
96
- t1 = $[5];
97
- }
98
- useEffect(t0, t1);
99
- let t2;
100
- if ($[6] !== anchorElem || $[7] !== hoveredElement || $[8] !== blockHandleHorizontalOffset) {
101
- t2 = [anchorElem, hoveredElement, blockHandleHorizontalOffset];
102
- $[6] = anchorElem;
103
- $[7] = hoveredElement;
104
- $[8] = blockHandleHorizontalOffset;
105
- $[9] = t2;
106
- } else {
107
- t2 = $[9];
108
- }
84
+ }, [scrollerElem, anchorElem, editor, hoveredElement]);
109
85
  useEffect(() => {
110
86
  if (menuRef.current && hoveredElement?.node) {
111
87
  setHandlePosition(hoveredElement?.elem, menuRef.current, anchorElem, blockHandleHorizontalOffset);
112
88
  }
113
- }, t2);
114
- let t3;
115
- if ($[10] !== hoveredElement || $[11] !== editor) {
116
- t3 = event_0 => {
117
- let hoveredElementToUse;
118
- hoveredElementToUse = hoveredElement;
119
- if (!hoveredElementToUse?.node) {
120
- return;
89
+ }, [anchorElem, hoveredElement, blockHandleHorizontalOffset]);
90
+ const handleAddClick = useCallback(event_0 => {
91
+ let hoveredElementToUse = hoveredElement;
92
+ if (!hoveredElementToUse?.node) {
93
+ return;
94
+ }
95
+ // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node
96
+ editor.update(() => {
97
+ // Check if blockNode is an empty text node
98
+ let isEmptyParagraph = true;
99
+ if (hoveredElementToUse.node.getType() !== 'paragraph' || hoveredElementToUse.node.getTextContent() !== '') {
100
+ isEmptyParagraph = false;
101
+ }
102
+ if (!isEmptyParagraph) {
103
+ const newParagraph = $createParagraphNode();
104
+ hoveredElementToUse.node.insertAfter(newParagraph);
105
+ setTimeout(() => {
106
+ hoveredElementToUse = {
107
+ elem: editor.getElementByKey(newParagraph.getKey()),
108
+ node: newParagraph
109
+ };
110
+ setHoveredElement(hoveredElementToUse);
111
+ }, 0);
121
112
  }
113
+ });
114
+ // 2. Focus on the new paragraph node
115
+ setTimeout(() => {
122
116
  editor.update(() => {
123
- let isEmptyParagraph = true;
124
- if (hoveredElementToUse.node.getType() !== "paragraph" || hoveredElementToUse.node.getTextContent() !== "") {
125
- isEmptyParagraph = false;
126
- }
127
- if (!isEmptyParagraph) {
128
- const newParagraph = $createParagraphNode();
129
- hoveredElementToUse.node.insertAfter(newParagraph);
130
- setTimeout(() => {
131
- hoveredElementToUse = {
132
- elem: editor.getElementByKey(newParagraph.getKey()),
133
- node: newParagraph
134
- };
135
- setHoveredElement(hoveredElementToUse);
136
- }, 0);
117
+ editor.focus();
118
+ if (hoveredElementToUse.node && 'select' in hoveredElementToUse.node && typeof hoveredElementToUse.node.select === 'function') {
119
+ hoveredElementToUse.node.select();
137
120
  }
138
121
  });
139
- setTimeout(() => {
140
- editor.update(() => {
141
- editor.focus();
142
- if (hoveredElementToUse.node && "select" in hoveredElementToUse.node && typeof hoveredElementToUse.node.select === "function") {
143
- hoveredElementToUse.node.select();
144
- }
145
- });
146
- }, 1);
147
- setTimeout(() => {
148
- editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {
149
- node: hoveredElementToUse.node
150
- });
151
- }, 2);
152
- event_0.stopPropagation();
153
- event_0.preventDefault();
154
- };
155
- $[10] = hoveredElement;
156
- $[11] = editor;
157
- $[12] = t3;
158
- } else {
159
- t3 = $[12];
160
- }
161
- const handleAddClick = t3;
162
- let t4;
163
- if ($[13] !== handleAddClick) {
164
- t4 = event_1 => {
165
- handleAddClick(event_1);
166
- };
167
- $[13] = handleAddClick;
168
- $[14] = t4;
169
- } else {
170
- t4 = $[14];
171
- }
172
- return createPortal(_jsx(React.Fragment, {
173
- children: _jsx("button", {
122
+ }, 1);
123
+ // Make sure this is called AFTER the focusing has been processed by the browser
124
+ // Otherwise, this won't work
125
+ setTimeout(() => {
126
+ editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {
127
+ node: hoveredElementToUse.node
128
+ });
129
+ }, 2);
130
+ event_0.stopPropagation();
131
+ event_0.preventDefault();
132
+ }, [editor, hoveredElement]);
133
+ return /*#__PURE__*/createPortal( /*#__PURE__*/_jsx(React.Fragment, {
134
+ children: /*#__PURE__*/_jsx("button", {
174
135
  className: "icon add-block-menu",
175
- onClick: t4,
136
+ onClick: event_1 => {
137
+ handleAddClick(event_1);
138
+ },
176
139
  ref: menuRef,
177
140
  type: "button",
178
- children: _jsx("div", {
179
- className: isEditable ? "icon" : ""
141
+ children: /*#__PURE__*/_jsx("div", {
142
+ className: isEditable ? 'icon' : ''
180
143
  })
181
144
  })
182
145
  }), anchorElem);
183
146
  }
184
- export function AddBlockHandlePlugin(t0) {
185
- const {
186
- anchorElem: t1
187
- } = t0;
188
- const anchorElem = t1 === undefined ? document.body : t1;
147
+ export function AddBlockHandlePlugin({
148
+ anchorElem = document.body
149
+ }) {
189
150
  const [editor] = useLexicalComposerContext();
190
151
  return useAddBlockHandle(editor, anchorElem, editor._editable);
191
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","$","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","t0","t1","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","t2","current","t3","event_0","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","handleAddClick","t4","event_1","_jsx","Fragment","children","className","onClick","ref","type","AddBlockHandlePlugin","undefined","body","_editable"],"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","_jsx","Fragment","className","onClick","ref","type","AddBlockHandlePlugin","body","_editable"],"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"mappings":"AAAA;;;AAGA,SAASA,yBAAyB,QAAQ;AAC1C,SAASC,oBAAoB,QAAQ;AACrC,YAAYC,KAAA,MAAW;AACvB,SAAmBC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AACnE,SAASC,YAAY,QAAQ;AAE7B,SAASC,sBAAsB,QAAQ;AACvC,SAASC,aAAa,QAAQ;AAC9B,SAASC,KAAK,QAAQ;AACtB,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,iCAAiC,QAAQ;AAClD,SAASC,mBAAmB,QAAQ;AACpC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,iBAAiB,QAAQ;AAClC,SAASC,iBAAiB,QAAQ;AAGlC,MAAMC,wBAAA,GAA2B;AAEjC,IAAIC,SAAA,GAAYC,QAAA;AAEhB,SAASC,gBAAgBC,UAAkB;EACzC,IAAIA,UAAA,KAAe,GAAG;IACpB,OAAOF,QAAA;EACT;EACA,IAAID,SAAA,IAAa,KAAKA,SAAA,GAAYG,UAAA,EAAY;IAC5C,OAAOH,SAAA;EACT;EAEA,OAAOI,IAAA,CAAKC,KAAK,CAACF,UAAA,GAAa;AACjC;AAEA,SAASG,kBACPC,MAAqB,EACrBC,UAAuB,EACvBC,UAAmB;EAEnB,MAAMC,YAAA,GAAeF,UAAA,CAAWG,aAAa;EAE7C,MAAM;IAAEC;EAAY,CAAE,GAAGtB,sBAAA;EACzB,MAAMuB,2BAAA,GAA8BD,YAAA,EAAcE,KAAA,EAAOC,UAAA,GAAa,CAAC,KAAK;EAE5E,MAAMC,OAAA,GAAU7B,MAAA,CAA0B;EAC1C,MAAM,CAAC8B,cAAA,EAAgBC,iBAAA,CAAkB,GAAG9B,QAAA,CAGlC;EAEVF,SAAA,CAAU;IACR,SAASiC,oBAAoBC,KAAiB;MAC5C,MAAMC,MAAA,GAASD,KAAA,CAAMC,MAAM;MAC3B,IAAI,CAAC9B,aAAA,CAAc8B,MAAA,GAAS;QAC1B;MACF;MAEA,MAAMC,wBAAA,GAA2B5B,iCAAA,CAC/BgB,YAAA,EACAU,KAAA,CAAMG,KAAK,EACXH,KAAA,CAAMI,KAAK,EACXH,MAAA;MAGF,IAAIC,wBAAA,KAA6B,CAAC,GAAG;QACnCJ,iBAAA,CAAkB;QAClB;MACF;MAEA,IAAIrB,iBAAA,CAAkBwB,MAAA,EAAQtB,wBAAA,GAA2B;QACvD;MACF;MACA,MAAM0B,gBAAA,GAAmB7B,mBAAA,CAAoBW,MAAA;MAE7C,MAAM;QACJmB,SAAA,EAAWC,eAAe;QAC1BC,SAAS;QACTC;MAAY,CACb,GAAGlC,mBAAA,CAAoB;QACtBa,UAAA;QACAsB,eAAA,EAAiB;QACjBvB,MAAA;QACAwB,gBAAA,EAAkB,CAACT,wBAAA;QACnBU,KAAA,EAAO,IAAIxC,KAAA,CAAM4B,KAAA,CAAMa,CAAC,EAAEb,KAAA,CAAMc,CAAC;QACjCC,qBAAA,EAAuB;QACvBC,UAAA,EAAYlC,eAAA,CAAgBuB,gBAAA,CAAiBY,MAAM;QACnDC,gBAAA,EAAkB;MACpB;MAEAtC,SAAA,GAAY6B,YAAA;MAEZ,IAAI,CAACF,eAAA,EAAiB;QACpB;MACF;MACA,IAAIV,cAAA,EAAgBsB,IAAA,KAASX,SAAA,IAAaX,cAAA,EAAgBuB,IAAA,KAASb,eAAA,EAAiB;QAClFT,iBAAA,CAAkB;UAChBsB,IAAA,EAAMb,eAAA;UACNY,IAAA,EAAMX;QACR;MACF;IACF;IAEA;IACA;IACA;IACAa,QAAA,EAAUC,gBAAA,CAAiB,aAAavB,mBAAA;IAExC,OAAO;MACLsB,QAAA,EAAUE,mBAAA,CAAoB,aAAaxB,mBAAA;IAC7C;EACF,GAAG,CAACT,YAAA,EAAcF,UAAA,EAAYD,MAAA,EAAQU,cAAA,CAAe;EAErD/B,SAAA,CAAU;IACR,IAAI8B,OAAA,CAAQ4B,OAAO,IAAI3B,cAAA,EAAgBsB,IAAA,EAAM;MAC3CzC,iBAAA,CACEmB,cAAA,EAAgBuB,IAAA,EAChBxB,OAAA,CAAQ4B,OAAO,EACfpC,UAAA,EACAK,2BAAA;IAEJ;EACF,GAAG,CAACL,UAAA,EAAYS,cAAA,EAAgBJ,2BAAA,CAA4B;EAE5D,MAAMgC,cAAA,GAAiB5D,WAAA,CACpBmC,OAAA;IACC,IAAI0B,mBAAA,GAAsB7B,cAAA;IAC1B,IAAI,CAAC6B,mBAAA,EAAqBP,IAAA,EAAM;MAC9B;IACF;IAEA;IACAhC,MAAA,CAAOwC,MAAM,CAAC;MACZ;MACA,IAAIC,gBAAA,GAAmB;MACvB,IACEF,mBAAA,CAAoBP,IAAI,CAACU,OAAO,OAAO,eACvCH,mBAAA,CAAoBP,IAAI,CAACW,cAAc,OAAO,IAC9C;QACAF,gBAAA,GAAmB;MACrB;MAEA,IAAI,CAACA,gBAAA,EAAkB;QACrB,MAAMG,YAAA,GAAepE,oBAAA;QACrB+D,mBAAA,CAAoBP,IAAI,CAACa,WAAW,CAACD,YAAA;QAErCE,UAAA,CAAW;UACTP,mBAAA,GAAsB;YACpBN,IAAA,EAAMjC,MAAA,CAAO+C,eAAe,CAACH,YAAA,CAAaI,MAAM;YAChDhB,IAAA,EAAMY;UACR;UACAjC,iBAAA,CAAkB4B,mBAAA;QACpB,GAAG;MACL;IACF;IAEA;IACAO,UAAA,CAAW;MACT9C,MAAA,CAAOwC,MAAM,CAAC;QACZxC,MAAA,CAAOiD,KAAK;QAEZ,IACEV,mBAAA,CAAoBP,IAAI,IACxB,YAAYO,mBAAA,CAAoBP,IAAI,IACpC,OAAOO,mBAAA,CAAoBP,IAAI,CAACkB,MAAM,KAAK,YAC3C;UACAX,mBAAA,CAAoBP,IAAI,CAACkB,MAAM;QACjC;MACF;IACF,GAAG;IAEH;IACA;IACAJ,UAAA,CAAW;MACT9C,MAAA,CAAOmD,eAAe,CAACjE,yBAAA,EAA2B;QAChD8C,IAAA,EAAMO,mBAAA,CAAoBP;MAC5B;IACF,GAAG;IAEHnB,OAAA,CAAMuC,eAAe;IACrBvC,OAAA,CAAMwC,cAAc;EACtB,GACA,CAACrD,MAAA,EAAQU,cAAA,CAAe;EAG1B,oBAAO5B,YAAA,eACLwE,IAAA,CAAC7E,KAAA,CAAM8E,QAAQ;cACb,aAAAD,IAAA,CAAC;MACCE,SAAA,EAAU;MACVC,OAAA,EAAU5C,OAAA;QACRyB,cAAA,CAAezB,OAAA;MACjB;MACA6C,GAAA,EAAKjD,OAAA;MACLkD,IAAA,EAAK;gBAEL,aAAAL,IAAA,CAAC;QAAIE,SAAA,EAAWtD,UAAA,GAAa,SAAS;;;MAG1CD,UAAA;AAEJ;AAEA,OAAO,SAAS2D,qBAAqB;EACnC3D,UAAA,GAAaiC,QAAA,CAAS2B;AAAI,CAG3B;EACC,MAAM,CAAC7D,MAAA,CAAO,GAAGzB,yBAAA;EACjB,OAAOwB,iBAAA,CAAkBC,MAAA,EAAQC,UAAA,EAAYD,MAAA,CAAO8D,SAAS;AAC/D","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;AAa9B,OAAO,cAAc,CAAA;AAuarB,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;AAa9B,OAAO,cAAc,CAAA;AAiarB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}