@payloadcms/richtext-lexical 4.0.0-beta.2 → 4.0.0-beta.4

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 (159) hide show
  1. package/dist/exports/client/Field-334JNLRF.js +2 -0
  2. package/dist/exports/client/Field-334JNLRF.js.map +7 -0
  3. package/dist/exports/client/{RelationshipComponent-YCPAKOL7.js → RelationshipComponent-TVK6I4W4.js} +2 -2
  4. package/dist/exports/client/chunk-BEKGION5.js +2 -0
  5. package/dist/exports/client/chunk-BEKGION5.js.map +7 -0
  6. package/dist/exports/client/{chunk-WSAPGI3Z.js → chunk-EA5BHQ2T.js} +1 -1
  7. package/dist/exports/client/{chunk-WSAPGI3Z.js.map → chunk-EA5BHQ2T.js.map} +1 -1
  8. package/dist/exports/client/chunk-FAJJXXCW.js +2 -0
  9. package/dist/exports/client/{chunk-3LRZDIIG.js.map → chunk-FAJJXXCW.js.map} +2 -2
  10. package/dist/exports/client/{chunk-5VIL27GI.js → chunk-IYBYNEKX.js} +1 -1
  11. package/dist/exports/client/{chunk-5VIL27GI.js.map → chunk-IYBYNEKX.js.map} +1 -1
  12. package/dist/exports/client/chunk-SE5IITBK.js +2 -0
  13. package/dist/exports/client/chunk-SE5IITBK.js.map +7 -0
  14. package/dist/exports/client/{component-6DQLENIE.js → component-QENB4QTS.js} +2 -2
  15. package/dist/exports/client/componentInline-AU7IBNY7.js +2 -0
  16. package/dist/exports/client/index.js +27 -27
  17. package/dist/exports/client/index.js.map +3 -3
  18. package/dist/features/align/client/index.js.map +1 -1
  19. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  20. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  21. package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
  22. package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
  23. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  24. package/dist/features/blocks/client/component/index.js +38 -16
  25. package/dist/features/blocks/client/component/index.js.map +1 -1
  26. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  27. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
  28. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
  29. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
  30. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  31. package/dist/features/blocks/client/componentInline/index.js +5 -11
  32. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  33. package/dist/features/blocks/client/getCachedFormStateIfDataMatches.js.map +1 -1
  34. package/dist/features/blocks/client/plugin/index.js.map +1 -1
  35. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +121 -78
  36. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
  37. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +142 -87
  38. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
  39. package/dist/features/converters/lexicalToHtml/sync/types.d.ts.map +1 -1
  40. package/dist/features/converters/lexicalToHtml/sync/types.js.map +1 -1
  41. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  42. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  43. package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
  44. package/dist/features/heading/client/index.js.map +1 -1
  45. package/dist/features/horizontalRule/client/plugin/index.js.map +1 -1
  46. package/dist/features/indent/client/index.d.ts.map +1 -1
  47. package/dist/features/indent/client/index.js +0 -2
  48. package/dist/features/indent/client/index.js.map +1 -1
  49. package/dist/features/indent/server/i18n.d.ts.map +1 -1
  50. package/dist/features/indent/server/i18n.js.map +1 -1
  51. package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
  52. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  53. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +10 -2
  54. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  55. package/dist/features/link/client/plugins/link/index.js.map +1 -1
  56. package/dist/features/link/markdownTransformer.js +2 -2
  57. package/dist/features/link/markdownTransformer.js.map +1 -1
  58. package/dist/features/link/server/baseFields.js.map +1 -1
  59. package/dist/features/lists/shared/schema.d.ts.map +1 -1
  60. package/dist/features/lists/shared/schema.js.map +1 -1
  61. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  62. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  63. package/dist/features/relationship/client/utils/useEnabledRelationships.js.map +1 -1
  64. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.css +1 -1
  65. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  66. package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js +6 -6
  67. package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  68. package/dist/features/table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  69. package/dist/features/table/client/plugins/TablePlugin/index.js +54 -18
  70. package/dist/features/table/client/plugins/TablePlugin/index.js.map +1 -1
  71. package/dist/features/table/client/utils/useDebounce.js.map +1 -1
  72. package/dist/features/textState/defaultColors.js +1 -1
  73. package/dist/features/textState/defaultColors.js.map +1 -1
  74. package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.js.map +1 -1
  75. package/dist/features/toolbars/fixed/client/Toolbar/index.js +126 -70
  76. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  77. package/dist/features/toolbars/inline/client/Toolbar/index.js +67 -35
  78. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  79. package/dist/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
  80. package/dist/features/toolbars/shared/ToolbarButton/index.js +26 -2
  81. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  82. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +137 -72
  83. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  84. package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
  85. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +22 -6
  86. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  87. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js +100 -70
  88. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js.map +1 -1
  89. package/dist/features/upload/client/drawer/index.js.map +1 -1
  90. package/dist/features/upload/client/plugin/index.js.map +1 -1
  91. package/dist/field/RenderLexical/index.js.map +1 -1
  92. package/dist/field/ViewSelector.js +12 -4
  93. package/dist/field/ViewSelector.js.map +1 -1
  94. package/dist/field/bundled.css +1 -1
  95. package/dist/field/index.js.map +1 -1
  96. package/dist/i18n.d.ts.map +1 -1
  97. package/dist/i18n.js +44 -0
  98. package/dist/i18n.js.map +1 -1
  99. package/dist/lexical/LexicalEditor.js.map +1 -1
  100. package/dist/lexical/plugins/ClipboardPlugin/index.js.map +1 -1
  101. package/dist/lexical/plugins/DecoratorPlugin/index.js.map +1 -1
  102. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  103. package/dist/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
  104. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +1 -1
  105. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +234 -87
  106. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  107. package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js.map +1 -1
  108. package/dist/lexical/plugins/TextPlugin/index.js.map +1 -1
  109. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  110. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.css +16 -0
  111. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  112. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +126 -38
  113. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  114. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.d.ts +7 -0
  115. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.d.ts.map +1 -0
  116. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.js +15 -0
  117. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.js.map +1 -0
  118. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.d.ts.map +1 -1
  119. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js +9 -12
  120. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js.map +1 -1
  121. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  122. package/dist/lexical/utils/nodeFormat.d.ts.map +1 -1
  123. package/dist/lexical/utils/nodeFormat.js +0 -2
  124. package/dist/lexical/utils/nodeFormat.js.map +1 -1
  125. package/dist/lexical/utils/url.d.ts.map +1 -1
  126. package/dist/lexical/utils/url.js +1 -1
  127. package/dist/lexical/utils/url.js.map +1 -1
  128. package/dist/populateGraphQL/populate.js.map +1 -1
  129. package/dist/types/index.d.ts.map +1 -1
  130. package/dist/types/index.js.map +1 -1
  131. package/dist/utilities/buildEditorState.d.ts.map +1 -1
  132. package/dist/utilities/buildEditorState.js.map +1 -1
  133. package/dist/utilities/fieldsDrawer/Drawer.js +36 -36
  134. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  135. package/dist/utilities/fieldsDrawer/DrawerContent.d.ts.map +1 -1
  136. package/dist/utilities/fieldsDrawer/DrawerContent.js +6 -9
  137. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  138. package/dist/utilities/fieldsDrawer/useDrawerSubmit.js.map +1 -1
  139. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  140. package/dist/utilities/fieldsDrawer/useLexicalDrawer.js.map +1 -1
  141. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  142. package/dist/utilities/initLexicalFeatures.d.ts.map +1 -1
  143. package/dist/utilities/initLexicalFeatures.js +38 -4
  144. package/dist/utilities/initLexicalFeatures.js.map +1 -1
  145. package/dist/utilities/useLexicalFeature.js +15 -6
  146. package/dist/utilities/useLexicalFeature.js.map +1 -1
  147. package/dist/utilities/useRunDeprioritized.js.map +1 -1
  148. package/package.json +32 -35
  149. package/dist/exports/client/Field-W2ABOM7M.js +0 -2
  150. package/dist/exports/client/Field-W2ABOM7M.js.map +0 -7
  151. package/dist/exports/client/chunk-3LRZDIIG.js +0 -2
  152. package/dist/exports/client/chunk-E6LSRRP2.js +0 -2
  153. package/dist/exports/client/chunk-E6LSRRP2.js.map +0 -7
  154. package/dist/exports/client/chunk-ZQX5HXUL.js +0 -2
  155. package/dist/exports/client/chunk-ZQX5HXUL.js.map +0 -7
  156. package/dist/exports/client/componentInline-HNE5G4TE.js +0 -2
  157. /package/dist/exports/client/{RelationshipComponent-YCPAKOL7.js.map → RelationshipComponent-TVK6I4W4.js.map} +0 -0
  158. /package/dist/exports/client/{component-6DQLENIE.js.map → component-QENB4QTS.js.map} +0 -0
  159. /package/dist/exports/client/{componentInline-HNE5G4TE.js.map → componentInline-AU7IBNY7.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","getScrollParent","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","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","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","t1","current","rootElement","getRootElement","rootScrollParent","body","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","style","display","position","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","undefined","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","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 { getScrollParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\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\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_NORMAL,\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_NORMAL,\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_NORMAL,\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_NORMAL,\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_NORMAL,\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 const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + 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
+ {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","getScrollParent","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","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","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","t1","current","rootElement","getRootElement","rootScrollParent","body","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","undefined","selectedItemKey","setSelectedItemKey","t2","item","rootElem","setAttribute","key","updateSelectedItem","t3","allItems","flatMap","_temp","firstMatchingItem","setSelectedItemKeyToFirstMatchingItem","t4","t5","t6","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","selectItemAndCleanUp","t7","t8","rootElem_0","removeAttribute","t9","t10","t11","registerCommand","_temp2","t12","t13","t14","payload","event","allItems_0","_temp3","selectedIndex","findIndex","item_1","newSelectedIndex","newSelectedItem","ref","dispatchCommand","index","preventDefault","stopImmediatePropagation","payload_0","event_0","allItems_1","_temp4","selectedIndex_0","item_2","newSelectedIndex_0","newSelectedItem_0","payload_1","event_1","payload_2","event_2","allItems_2","_temp5","selectedItem_0","find","item_3","event_3","allItems_3","_temp6","selectedItem_1","item_4","t15","listItemProps","t16","t17","group_3","group","items","group_2","group_1","group_0","item_0","setContainerDivAttributes","containerDiv","className","style","display","position","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","append","positionMenu","rootElement_0","containerDiv_0"],"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 { getScrollParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\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\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_NORMAL,\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_NORMAL,\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_NORMAL,\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_NORMAL,\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_NORMAL,\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 const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + 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 +1 @@
1
- {"version":3,"file":"useMenuTriggerMatch.js","names":["c","_c","useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","t0","$","maxLength","t1","minLength","t2","undefined","t3","t4","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]!\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]!\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2]!, // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,WAAW,QAAQ;AAE5B,SAASC,WAAW,QAAQ;AAiB5B;;;AAGA,OAAO,SAAAC,oBAAAC,OAAA,EAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAKL;IAAAO,SAAA,EAAAC,EAAA;IAAAC,SAAA,EAAAC;EAAA,IAAAL,EAA6E;EAA3E,MAAAE,SAAA,GAAAC,EAAc,KAAAG,SAAA,QAAdH,EAAc;EAAE,MAAAC,SAAA,GAAAC,EAAa,KAAAC,SAAA,OAAbD,EAAa;EAAA,IAAAE,EAAA;EAAA,IAAAN,CAAA,QAAAC,SAAA,IAAAD,CAAA,QAAAG,SAAA,IAAAH,CAAA,QAAAF,OAAA;IAG7BQ,EAAA,GAAAC,EAAA;MAAC;QAAAC;MAAA,IAAAD,EAAS;MACR,MAAAE,UAAA,GAAmB,OAAOX,OAAA,GAAAF,WAAU,GAAc;MAClD,MAAAc,qBAAA,OAAAC,MAAA,CACE,eACE,GACAb,OAAA,GACA,MACA,SACAW,UAAA,GACA,SACAR,SAAA,GACA,OACA;MAEJ,MAAAW,KAAA,GAAcF,qBAAA,CAAAG,IAAA,CAA2BL,KAAA;MAAA,IACrCI,KAAA,SAAU;QACZ,MAAAE,sBAAA,GAA+BF,KAAK;QAKpC,MAAAG,cAAA,GAAuBH,KAAK;QAAG,IAE3BG,cAAA,CAAAC,MAAA,IAAyBb,SAAA;UAAA;YAAAc,UAAA,EAEbL,KAAA,CAAAM,KAAA,GAAcJ,sBAAA,CAAAE,MAA6B;YAAAD,cAAA;YAAAI,iBAAA,EAEpCP,KAAK;UAAA;QAAA;MAAA;MAAA;IAAA;IAKhCZ,CAAA,MAAAC,SAAA;IAAAD,CAAA,MAAAG,SAAA;IAAAH,CAAA,MAAAF,OAAA;IAAAE,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAAA,OAjCKM,EAkC0B;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"useMenuTriggerMatch.js","names":["c","_c","useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","t0","$","maxLength","t1","minLength","t2","undefined","t3","t4","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]!\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]!\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2]!, // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,WAAW,QAAQ;AAE5B,SAASC,WAAW,QAAQ;AAiB5B;;;AAGA,OAAO,SAAAC,oBAAAC,OAAA,EAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAKL;IAAAO,SAAA,EAAAC,EAAA;IAAAC,SAAA,EAAAC;EAAA,IAAAL,EAA6E;EAA3E,MAAAE,SAAA,GAAAC,EAAc,KAAdG,SAAc,GAAd,EAAc,GAAdH,EAAc;EAAE,MAAAC,SAAA,GAAAC,EAAa,KAAbC,SAAa,GAAb,CAAa,GAAbD,EAAa;EAAA,IAAAE,EAAA;EAAA,IAAAN,CAAA,QAAAC,SAAA,IAAAD,CAAA,QAAAG,SAAA,IAAAH,CAAA,QAAAF,OAAA;IAG7BQ,EAAA,GAAAC,EAAA;MAAC;QAAAC;MAAA,IAAAD,EAAS;MACR,MAAAE,UAAA,GAAmB,OAAOX,OAAA,GAAUF,WAAA,GAAc;MAClD,MAAAc,qBAAA,GAA8B,IAAIC,MAAA,CAChC,eACE,GACAb,OAAA,GACA,MACA,SACAW,UAAA,GACA,SACAR,SAAA,GACA,OACA;MAEJ,MAAAW,KAAA,GAAcF,qBAAA,CAAAG,IAA0B,CAACL,KAAA;MACzC,IAAII,KAAA,KAAU;QACZ,MAAAE,sBAAA,GAA+BF,KAAK,GAAG;QAKvC,MAAAG,cAAA,GAAuBH,KAAK,GAAG;QAE/B,IAAIG,cAAA,CAAAC,MAAqB,IAAIb,SAAA;UAAA,OACpB;YAAAc,UAAA,EACOL,KAAA,CAAAM,KAAW,GAAGJ,sBAAA,CAAAE,MAA6B;YAAAD,cAAA;YAAAI,iBAAA,EAEpCP,KAAK;UAC1B;QAAA;MACF;MACF,OACO;IAAA,CACT;IAAAZ,CAAA,MAAAC,SAAA;IAAAD,CAAA,MAAAG,SAAA;IAAAH,CAAA,MAAAF,OAAA;IAAAE,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAAA,OAjCKM,EAkC0B;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TEXT_TYPE_TO_FORMAT","TextNode","useEffect","TextPlugin","t0","$","features","editor","t1","enabledFormats","disabledFormats","getDisabledFormats","length","registerNodeTransform","textNode","forEach","disabledFormat","hasFormat","toggleFormat","t2","allFormats","Object","keys","enabledSet","Set","filter","format","has"],"sources":["../../../../src/lexical/plugins/TextPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { TextFormatType } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TEXT_TYPE_TO_FORMAT, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { SanitizedClientFeatures } from '../../../features/typesClient.js'\n\nexport function TextPlugin({ features }: { features: SanitizedClientFeatures }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n const disabledFormats = getDisabledFormats(features.enabledFormats)\n if (disabledFormats.length === 0) {\n return\n }\n // Ideally override the TextNode with our own TextNode (changing its setFormat or toggleFormat methods),\n // would be more performant. If we find a noticeable perf regression we can switch to that option.\n // Overriding the FORMAT_TEXT_COMMAND and PASTE_COMMAND commands is not an option I considered because\n // there might be other forms of mutation that we might not be considering. For example:\n // browser extensions or Payload/Lexical plugins that have their own commands.\n return editor.registerNodeTransform(TextNode, (textNode) => {\n disabledFormats.forEach((disabledFormat) => {\n if (textNode.hasFormat(disabledFormat)) {\n textNode.toggleFormat(disabledFormat)\n }\n })\n })\n }, [editor, features])\n\n return null\n}\n\nfunction getDisabledFormats(enabledFormats: TextFormatType[]): TextFormatType[] {\n const allFormats = Object.keys(TEXT_TYPE_TO_FORMAT) as TextFormatType[]\n const enabledSet = new Set(enabledFormats)\n\n return allFormats.filter((format) => !enabledSet.has(format))\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,mBAAmB,EAAEC,QAAQ,QAAQ;AAC9C,SAASC,SAAS,QAAQ;AAI1B,OAAO,SAAAC,WAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAoB;IAAAQ;EAAA,IAAAF,EAAmD;EAC5E,OAAAG,MAAA,IAAiBR,yBAAA;EAAA,IAAAS,EAAA;EAAA,IAAAH,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA,CAAAG,cAAA;IAEPD,EAAA,GAAAA,CAAA;MACR,MAAAE,eAAA,GAAwBC,kBAAA,CAAmBL,QAAA,CAAAG,cAAuB;MAAA,IAC9DC,eAAA,CAAAE,MAAA,MAA2B;QAAA;MAAA;MAAA,OAQxBL,MAAA,CAAAM,qBAAA,CAAAZ,QAAA,EAAAa,QAAA;QACLJ,eAAA,CAAAK,OAAA,CAAAC,cAAA;UAAA,IACMF,QAAA,CAAAG,SAAA,CAAmBD,cAAA;YACrBF,QAAA,CAAAI,YAAA,CAAsBF,cAAA;UAAA;QAAA,CAE1B;MAAA,CACF;IAAA;IACFX,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA,CAAAG,cAAA;IAAAJ,CAAA,MAAAG,EAAA;EAAA;IAAAA,EAAA,GAAAH,CAAA;EAAA;EAAA,IAAAc,EAAA;EAAA,IAAAd,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA;IAAGa,EAAA,IAACZ,MAAA,EAAQD,QAAA;IAASD,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA;IAAAD,CAAA,MAAAc,EAAA;EAAA;IAAAA,EAAA,GAAAd,CAAA;EAAA;EAjBrBH,SAAA,CAAUM,EAiBV,EAAGW,EAAkB;EAAA;AAAA;AAKvB,SAASR,mBAAmBF,cAAgC;EAC1D,MAAMW,UAAA,GAAaC,MAAA,CAAOC,IAAI,CAACtB,mBAAA;EAC/B,MAAMuB,UAAA,GAAa,IAAIC,GAAA,CAAIf,cAAA;EAE3B,OAAOW,UAAA,CAAWK,MAAM,CAAEC,MAAA,IAAW,CAACH,UAAA,CAAWI,GAAG,CAACD,MAAA;AACvD","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TEXT_TYPE_TO_FORMAT","TextNode","useEffect","TextPlugin","t0","$","features","editor","t1","enabledFormats","disabledFormats","getDisabledFormats","length","registerNodeTransform","textNode","forEach","disabledFormat","hasFormat","toggleFormat","t2","allFormats","Object","keys","enabledSet","Set","filter","format","has"],"sources":["../../../../src/lexical/plugins/TextPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { TextFormatType } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TEXT_TYPE_TO_FORMAT, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { SanitizedClientFeatures } from '../../../features/typesClient.js'\n\nexport function TextPlugin({ features }: { features: SanitizedClientFeatures }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n const disabledFormats = getDisabledFormats(features.enabledFormats)\n if (disabledFormats.length === 0) {\n return\n }\n // Ideally override the TextNode with our own TextNode (changing its setFormat or toggleFormat methods),\n // would be more performant. If we find a noticeable perf regression we can switch to that option.\n // Overriding the FORMAT_TEXT_COMMAND and PASTE_COMMAND commands is not an option I considered because\n // there might be other forms of mutation that we might not be considering. For example:\n // browser extensions or Payload/Lexical plugins that have their own commands.\n return editor.registerNodeTransform(TextNode, (textNode) => {\n disabledFormats.forEach((disabledFormat) => {\n if (textNode.hasFormat(disabledFormat)) {\n textNode.toggleFormat(disabledFormat)\n }\n })\n })\n }, [editor, features])\n\n return null\n}\n\nfunction getDisabledFormats(enabledFormats: TextFormatType[]): TextFormatType[] {\n const allFormats = Object.keys(TEXT_TYPE_TO_FORMAT) as TextFormatType[]\n const enabledSet = new Set(enabledFormats)\n\n return allFormats.filter((format) => !enabledSet.has(format))\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,mBAAmB,EAAEC,QAAQ,QAAQ;AAC9C,SAASC,SAAS,QAAQ;AAI1B,OAAO,SAAAC,WAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAoB;IAAAQ;EAAA,IAAAF,EAAmD;EAC5E,OAAAG,MAAA,IAAiBR,yBAAA;EAAA,IAAAS,EAAA;EAAA,IAAAH,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA,CAAAG,cAAA;IAEPD,EAAA,GAAAA,CAAA;MACR,MAAAE,eAAA,GAAwBC,kBAAA,CAAmBL,QAAA,CAAAG,cAAuB;MAClE,IAAIC,eAAA,CAAAE,MAAsB,KAAK;QAAA;MAAA;MAE/B,OAMOL,MAAA,CAAAM,qBAA4B,CAACZ,QAAA,EAAUa,QAAA;QAC5CJ,eAAA,CAAAK,OAAuB,CAACC,cAAA;UACtB,IAAIF,QAAA,CAAAG,SAAkB,CAACD,cAAA;YACrBF,QAAA,CAAAI,YAAqB,CAACF,cAAA;UAAA;QACxB,CACF;MAAA,CACF;IAAA,CACF;IAAAX,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA,CAAAG,cAAA;IAAAJ,CAAA,MAAAG,EAAA;EAAA;IAAAA,EAAA,GAAAH,CAAA;EAAA;EAAA,IAAAc,EAAA;EAAA,IAAAd,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA;IAAGa,EAAA,IAACZ,MAAA,EAAQD,QAAA,CAAS;IAAAD,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA;IAAAD,CAAA,MAAAc,EAAA;EAAA;IAAAA,EAAA,GAAAd,CAAA;EAAA;EAjBrBH,SAAA,CAAUM,EAiBV,EAAGW,EAAkB;EAAA,OAEd;AAAA;AAGT,SAASR,mBAAmBF,cAAgC;EAC1D,MAAMW,UAAA,GAAaC,MAAA,CAAOC,IAAI,CAACtB,mBAAA;EAC/B,MAAMuB,UAAA,GAAa,IAAIC,GAAA,CAAIf,cAAA;EAE3B,OAAOW,UAAA,CAAWK,MAAM,CAAEC,MAAA,IAAW,CAACH,UAAA,CAAWI,GAAG,CAACD,MAAA;AACvD","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","isHTMLElement","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","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","t0","t1","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, isHTMLElement } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.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.css'\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 (\n blockNode &&\n (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem)\n ) {\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) {\n setHandlePosition(\n hoveredElement?.elem ?? null,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\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 aria-label=\"Add block\"\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,EAAEC,aAAa,QAAQ;AACpD,YAAYC,KAAA,MAAW;AACvB,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AACzD,SAASC,YAAY,QAAQ;AAE7B,SAASC,sBAAsB,QAAQ;AACvC,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;AAClC,OAAO;AAEP,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,GAAGrB,sBAAA;EACzB,MAAMsB,2BAAA,GAA8BD,YAAA,EAAcE,KAAA,EAAOC,UAAA,GAAa,CAAC,KAAK;EAE5E,MAAMC,OAAA,GAAU5B,MAAA,CAA0B;EAC1C,MAAM,CAAC6B,cAAA,EAAgBC,iBAAA,CAAkB,GAAG7B,QAAA,CAGlC;EAEVF,SAAA,CAAU;IACR,SAASgC,oBAAoBC,KAAiB;MAC5C,MAAMC,MAAA,GAASD,KAAA,CAAMC,MAAM;MAC3B,IAAI,CAACrC,aAAA,CAAcqC,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,IACEC,SAAA,KACCX,cAAA,EAAgBsB,IAAA,KAASX,SAAA,IAAaX,cAAA,EAAgBuB,IAAA,KAASb,eAAc,GAC9E;QACAT,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;EAErD9B,SAAA,CAAU;IACR,IAAI6B,OAAA,CAAQ4B,OAAO,EAAE;MACnB9C,iBAAA,CACEmB,cAAA,EAAgBuB,IAAA,IAAQ,MACxBxB,OAAA,CAAQ4B,OAAO,EACfpC,UAAA,EACAK,2BAAA;IAEJ;EACF,GAAG,CAACL,UAAA,EAAYS,cAAA,EAAgBJ,2BAAA,CAA4B;EAE5D,MAAMgC,cAAA,GAAiB3D,WAAA,CACpBkC,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,EAAqBP,IAAA,CAAKU,OAAA,OAAc,eACxCH,mBAAA,CAAoBP,IAAI,CAACW,cAAc,OAAO,IAC9C;QACAF,gBAAA,GAAmB;MACrB;MAEA,IAAI,CAACA,gBAAA,EAAkB;QACrB,MAAMG,YAAA,GAAepE,oBAAA;QACrB+D,mBAAA,EAAqBP,IAAA,CAAKa,WAAA,CAAYD,YAAA;QAEtCE,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,EAAqBP,IAAA,IACrB,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,EAAqBP;MAC7B;IACF,GAAG;IAEHnB,OAAA,CAAMuC,eAAe;IACrBvC,OAAA,CAAMwC,cAAc;EACtB,GACA,CAACrD,MAAA,EAAQU,cAAA,CAAe;EAG1B,oBAAO3B,YAAA,cACLuE,IAAA,CAAC5E,KAAA,CAAM6E,QAAQ;cACb,aAAAD,IAAA,CAAC;MACC,cAAW;MACXE,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,SAAA2D,qBAAAC,EAAA;EAA8B;IAAA5D,UAAA,EAAA6D;EAAA,IAAAD,EAIpC;EAHC,MAAA5D,UAAA,GAAA6D,EAA0B,KAAAC,SAAA,GAAA7B,QAAA,CAAA8B,IAAA,GAA1BF,EAA0B;EAI1B,OAAA9D,MAAA,IAAiBzB,yBAAA;EAAA,OACVwB,iBAAA,CAAkBC,MAAA,EAAQC,UAAA,EAAYD,MAAA,CAAAiE,SAAgB;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","isHTMLElement","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","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","t0","t1","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, isHTMLElement } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.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.css'\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 (\n blockNode &&\n (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem)\n ) {\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) {\n setHandlePosition(\n hoveredElement?.elem ?? null,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\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 aria-label=\"Add block\"\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,4 +1,20 @@
1
1
  @layer payload-default {
2
+ .draggable-block-menu__button {
3
+ border: 0;
4
+ padding: 0;
5
+ background: transparent;
6
+ cursor: grab;
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ width: var(--spacer-4);
11
+ height: var(--spacer-4);
12
+
13
+ &:focus-visible {
14
+ outline: var(--accessibility-outline);
15
+ }
16
+ }
17
+
2
18
  .draggable-block-menu {
3
19
  border: none;
4
20
  border-radius: var(--radius-medium);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,OAAO,aAAa,CAAA;AAqbpB,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,aAAa,CAAA;AA+hBpB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
@@ -3,10 +3,10 @@
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
5
5
  import { eventFiles } from '@lexical/rich-text';
6
- import { useTranslation } from '@payloadcms/ui';
6
+ import { Popup, PopupList, useTranslation } from '@payloadcms/ui';
7
7
  import { $getNearestNodeFromDOMNode, $getNodeByKey, isHTMLElement } from 'lexical';
8
8
  import * as React from 'react';
9
- import { useEffect, useId, useRef, useState } from 'react';
9
+ import { useCallback, useEffect, useId, useRef, useState } from 'react';
10
10
  import { createPortal } from 'react-dom';
11
11
  import { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js';
12
12
  import { Point } from '../../../utils/point.js';
@@ -17,6 +17,7 @@ import { isOnHandleElement } from '../utils/isOnHandleElement.js';
17
17
  import { setHandlePosition } from '../utils/setHandlePosition.js';
18
18
  import { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js';
19
19
  import './index.css';
20
+ import { $moveBlock } from './moveBlock.js';
20
21
  import { setTargetLine } from './setTargetLine.js';
21
22
  import { useKeyboardReordering } from './useKeyboardReordering.js';
22
23
  const DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu';
@@ -64,6 +65,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
64
65
  instructionsID
65
66
  });
66
67
  const menuRef = useRef(null);
68
+ const isMenuOpenRef = useRef(false);
67
69
  const targetLineRef = useRef(null);
68
70
  const debugHighlightRef = useRef(null);
69
71
  const isDraggingBlockRef = useRef(false);
@@ -80,7 +82,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
80
82
  */
81
83
  function onDocumentMouseMove(event) {
82
84
  const target = event.target;
83
- if (!isHTMLElement(target)) {
85
+ if (isMenuOpenRef.current || !isHTMLElement(target)) {
84
86
  return;
85
87
  }
86
88
  const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target);
@@ -121,9 +123,16 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
121
123
  // Since the draggableBlockElem is outside the actual editor, we need to listen to the document
122
124
  // to be able to detect when the mouse is outside the editor and respect a buffer around
123
125
  // the scrollerElem to avoid the draggableBlockElem disappearing too early.
126
+ const onDocumentPointerDown = event_0 => {
127
+ if (event_0.pointerType === 'touch' || event_0.pointerType === 'pen') {
128
+ onDocumentMouseMove(event_0);
129
+ }
130
+ };
124
131
  document?.addEventListener('mousemove', onDocumentMouseMove);
132
+ document?.addEventListener('pointerdown', onDocumentPointerDown);
125
133
  return () => {
126
134
  document?.removeEventListener('mousemove', onDocumentMouseMove);
135
+ document?.removeEventListener('pointerdown', onDocumentPointerDown);
127
136
  };
128
137
  }, [scrollerElem, anchorElem, editor, draggableBlockElem]);
129
138
  useEffect(() => {
@@ -132,22 +141,22 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
132
141
  }
133
142
  }, [anchorElem, draggableBlockElem, blockHandleHorizontalOffset]);
134
143
  useEffect(() => {
135
- function onDragover(event_0) {
144
+ function onDragover(event_1) {
136
145
  if (!isDraggingBlockRef.current) {
137
146
  return false;
138
147
  }
139
- const [isFileTransfer] = eventFiles(event_0);
148
+ const [isFileTransfer] = eventFiles(event_1);
140
149
  if (isFileTransfer) {
141
150
  return false;
142
151
  }
143
152
  const {
144
153
  pageY,
145
154
  target: target_0
146
- } = event_0;
155
+ } = event_1;
147
156
  if (!isHTMLElement(target_0)) {
148
157
  return false;
149
158
  }
150
- const distanceFromScrollerElem_0 = calculateDistanceFromScrollerElem(scrollerElem, event_0.pageX, event_0.pageY, target_0, 100, 50);
159
+ const distanceFromScrollerElem_0 = calculateDistanceFromScrollerElem(scrollerElem, event_1.pageX, event_1.pageY, target_0, 100, 50);
151
160
  const topLevelNodeKeys_0 = getTopLevelNodeKeys(editor);
152
161
  const {
153
162
  blockElem: targetBlockElem,
@@ -158,7 +167,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
158
167
  editor,
159
168
  fuzzy: true,
160
169
  horizontalOffset: -distanceFromScrollerElem_0,
161
- point: new Point(event_0.x, event_0.y),
170
+ point: new Point(event_1.x, event_1.y),
162
171
  startIndex: getCurrentIndex(topLevelNodeKeys_0.length),
163
172
  useEdgeAsDefault: true,
164
173
  verbose: true
@@ -170,13 +179,13 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
170
179
  return false;
171
180
  }
172
181
  // Always prevent default and set dropEffect during drag to maintain the move cursor
173
- event_0.preventDefault();
174
- event_0.dataTransfer.dropEffect = 'move';
182
+ event_1.preventDefault();
183
+ event_1.dataTransfer.dropEffect = 'move';
175
184
  if (draggableBlockElem !== targetBlockElem) {
176
185
  const {
177
186
  isBelow,
178
187
  willStayInSamePosition
179
- } = setTargetLine(editorConfig?.admin?.hideGutter ? '0px' : 'var(--spacer-5)', blockHandleHorizontalOffset + (editorConfig?.admin?.hideGutter ? menuRef?.current?.getBoundingClientRect()?.width ?? 0 : -(menuRef?.current?.getBoundingClientRect()?.width ?? 0)), targetLineElem, targetBlockElem, lastTargetBlock, pageY, anchorElem, event_0, debugHighlightRef, isFoundNodeEmptyParagraph_0);
188
+ } = setTargetLine(editorConfig?.admin?.hideGutter ? '0px' : 'var(--spacer-5)', blockHandleHorizontalOffset + (editorConfig?.admin?.hideGutter ? menuRef?.current?.getBoundingClientRect()?.width ?? 0 : -(menuRef?.current?.getBoundingClientRect()?.width ?? 0)), targetLineElem, targetBlockElem, lastTargetBlock, pageY, anchorElem, event_1, debugHighlightRef, isFoundNodeEmptyParagraph_0);
180
189
  if (!willStayInSamePosition) {
181
190
  setLastTargetBlock({
182
191
  boundingBox: targetBlockElem.getBoundingClientRect(),
@@ -194,11 +203,11 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
194
203
  }
195
204
  return true;
196
205
  }
197
- function onDrop(event_1) {
206
+ function onDrop(event_2) {
198
207
  if (!isDraggingBlockRef.current) {
199
208
  return false;
200
209
  }
201
- const [isFileTransfer_0] = eventFiles(event_1);
210
+ const [isFileTransfer_0] = eventFiles(event_2);
202
211
  if (isFileTransfer_0) {
203
212
  return false;
204
213
  }
@@ -206,7 +215,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
206
215
  dataTransfer,
207
216
  pageY: pageY_0,
208
217
  target: target_1
209
- } = event_1;
218
+ } = event_2;
210
219
  const dragData = dataTransfer?.getData(DRAG_DATA_FORMAT) || '';
211
220
  editor.update(() => {
212
221
  const draggedNode = $getNodeByKey(dragData);
@@ -216,7 +225,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
216
225
  if (!isHTMLElement(target_1)) {
217
226
  return false;
218
227
  }
219
- const distanceFromScrollerElem_1 = calculateDistanceFromScrollerElem(scrollerElem, event_1.pageX, event_1.pageY, target_1, 100, 50);
228
+ const distanceFromScrollerElem_1 = calculateDistanceFromScrollerElem(scrollerElem, event_2.pageX, event_2.pageY, target_1, 100, 50);
220
229
  const {
221
230
  blockElem: targetBlockElem_0,
222
231
  isFoundNodeEmptyParagraph: isFoundNodeEmptyParagraph_1
@@ -225,7 +234,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
225
234
  editor,
226
235
  fuzzy: true,
227
236
  horizontalOffset: -distanceFromScrollerElem_1,
228
- point: new Point(event_1.x, event_1.y),
237
+ point: new Point(event_2.x, event_2.y),
229
238
  useEdgeAsDefault: true
230
239
  });
231
240
  if (!targetBlockElem_0) {
@@ -318,44 +327,123 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
318
327
  highlightTimersRef.current = [];
319
328
  };
320
329
  }, [scrollerElem, blockHandleHorizontalOffset, anchorElem, editor, lastTargetBlock, draggableBlockElem, editorConfig?.admin?.hideGutter]);
321
- function onDragStart(event_2) {
322
- const dataTransfer_0 = event_2.dataTransfer;
323
- if (!dataTransfer_0 || !draggableBlockElem) {
330
+ const startDrag = useCallback(({
331
+ blockElem,
332
+ dataTransfer: dataTransfer_0
333
+ }) => {
334
+ if (!editor.isEditable() || !dataTransfer_0 || !blockElem) {
324
335
  return;
325
336
  }
326
- setDragImage(dataTransfer_0, draggableBlockElem);
337
+ setDragImage(dataTransfer_0, blockElem);
327
338
  dataTransfer_0.effectAllowed = 'move';
328
- let nodeKey = '';
329
- editor.update(() => {
330
- const node = $getNearestNodeFromDOMNode(draggableBlockElem);
339
+ editor.read(() => {
340
+ const node = $getNearestNodeFromDOMNode(blockElem)?.getTopLevelElement();
331
341
  if (node) {
332
- nodeKey = node.getKey();
342
+ isDraggingBlockRef.current = true;
343
+ dataTransfer_0.setData(DRAG_DATA_FORMAT, node.getKey());
333
344
  }
334
345
  });
335
- isDraggingBlockRef.current = true;
336
- dataTransfer_0.setData(DRAG_DATA_FORMAT, nodeKey);
337
- }
338
- function onDragEnd() {
346
+ }, [editor]);
347
+ const onDragEnd = useCallback(() => {
339
348
  isDraggingBlockRef.current = false;
340
349
  if (lastTargetBlock?.elem) {
341
- hideTargetLine(targetLineRef.current, lastTargetBlock?.elem);
350
+ hideTargetLine(targetLineRef.current, lastTargetBlock.elem);
342
351
  }
352
+ }, [lastTargetBlock]);
353
+ useEffect(() => {
354
+ const onHeaderDragStart = event_3 => {
355
+ const handle = event_3.target instanceof HTMLElement ? event_3.target.closest('.collapsible__drag[draggable="true"]') : null;
356
+ if (!handle || !editor.getRootElement()?.contains(handle)) {
357
+ return;
358
+ }
359
+ const blockElem_0 = editor.getElementByKey(handle.dataset.sortableId ?? '');
360
+ if (blockElem_0) {
361
+ setDraggableBlockElem(blockElem_0);
362
+ startDrag({
363
+ blockElem: blockElem_0,
364
+ dataTransfer: event_3.dataTransfer
365
+ });
366
+ }
367
+ };
368
+ document.addEventListener('dragstart', onHeaderDragStart);
369
+ document.addEventListener('dragend', onDragEnd);
370
+ return () => {
371
+ document.removeEventListener('dragstart', onHeaderDragStart);
372
+ document.removeEventListener('dragend', onDragEnd);
373
+ };
374
+ }, [editor, startDrag, onDragEnd]);
375
+ function moveBlock({
376
+ direction
377
+ }) {
378
+ if (!editor.isEditable() || !draggableBlockElem) {
379
+ return;
380
+ }
381
+ editor.update(() => {
382
+ const node_0 = $getNearestNodeFromDOMNode(draggableBlockElem)?.getTopLevelElement();
383
+ if (node_0) {
384
+ $moveBlock({
385
+ direction,
386
+ node: node_0
387
+ });
388
+ }
389
+ }, {
390
+ onUpdate: () => {
391
+ if (menuRef.current) {
392
+ setHandlePosition(draggableBlockElem, menuRef.current, anchorElem, blockHandleHorizontalOffset);
393
+ }
394
+ }
395
+ });
343
396
  }
344
397
  return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(React.Fragment, {
345
398
  children: [/*#__PURE__*/_jsxs("span", {
346
399
  className: "sr-only",
347
400
  id: instructionsID,
348
401
  children: [t('general:moveUp'), ": Alt + Shift + ↑. ", t('general:moveDown'), ": Alt + Shift + ↓."]
349
- }), /*#__PURE__*/_jsx("button", {
350
- "aria-label": "Drag to move",
351
- className: "icon draggable-block-menu",
352
- draggable: true,
353
- onDragEnd: onDragEnd,
354
- onDragStart: onDragStart,
402
+ }), /*#__PURE__*/_jsx("div", {
403
+ className: "draggable-block-menu",
355
404
  ref: menuRef,
356
- type: "button",
357
- children: /*#__PURE__*/_jsx("div", {
358
- className: isEditable ? 'icon' : ''
405
+ children: /*#__PURE__*/_jsx(Popup, {
406
+ caret: false,
407
+ disabled: !isEditable,
408
+ onToggleClose: () => {
409
+ isMenuOpenRef.current = false;
410
+ },
411
+ onToggleOpen: () => {
412
+ isMenuOpenRef.current = true;
413
+ },
414
+ popupType: "menu",
415
+ render: ({
416
+ close
417
+ }) => /*#__PURE__*/_jsx(PopupList.ButtonGroup, {
418
+ children: [-1, 1].map(direction_0 => /*#__PURE__*/_jsx(PopupList.Button, {
419
+ onClick: () => {
420
+ moveBlock({
421
+ direction: direction_0
422
+ });
423
+ close();
424
+ },
425
+ children: t(direction_0 === -1 ? 'general:moveUp' : 'general:moveDown')
426
+ }, direction_0))
427
+ }),
428
+ renderButton: ({
429
+ active: _active,
430
+ ...buttonProps
431
+ }) => /*#__PURE__*/_jsx("button", {
432
+ ...buttonProps,
433
+ "aria-label": t('general:dragToMove'),
434
+ className: "draggable-block-menu__button",
435
+ disabled: !isEditable,
436
+ draggable: isEditable,
437
+ onDragEnd: onDragEnd,
438
+ onDragStart: event_4 => startDrag({
439
+ blockElem: draggableBlockElem,
440
+ dataTransfer: event_4.dataTransfer
441
+ }),
442
+ type: "button",
443
+ children: /*#__PURE__*/_jsx("div", {
444
+ className: isEditable ? 'icon' : ''
445
+ })
446
+ })
359
447
  })
360
448
  }), /*#__PURE__*/_jsx("div", {
361
449
  className: "draggable-block-target-line",