@payloadcms/richtext-lexical 3.68.0-internal-debug.591ab42 → 3.68.0-internal-debug.e9b66ee

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 (254) hide show
  1. package/dist/cell/rscEntry.js +2 -21
  2. package/dist/cell/rscEntry.js.map +1 -1
  3. package/dist/features/blocks/client/component/BlockContent.js +13 -48
  4. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  5. package/dist/features/blocks/client/component/components/BlockCollapsible.js +1 -10
  6. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  7. package/dist/features/blocks/client/component/components/BlockEditButton.js +1 -7
  8. package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
  9. package/dist/features/blocks/client/component/components/BlockRemoveButton.js +1 -7
  10. package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
  11. package/dist/features/blocks/client/component/index.js +81 -247
  12. package/dist/features/blocks/client/component/index.js.map +1 -1
  13. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js +1 -9
  14. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  15. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js +1 -7
  16. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
  17. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js +1 -7
  18. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
  19. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js +1 -7
  20. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
  21. package/dist/features/blocks/client/componentInline/index.js +68 -217
  22. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  23. package/dist/features/blocks/client/getBlockImageComponent.js +4 -15
  24. package/dist/features/blocks/client/getBlockImageComponent.js.map +1 -1
  25. package/dist/features/blocks/client/nodes/BlocksNode.js +1 -12
  26. package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
  27. package/dist/features/blocks/client/nodes/InlineBlocksNode.js +2 -12
  28. package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
  29. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +26 -127
  30. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
  31. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +49 -65
  32. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
  33. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +3 -16
  34. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -1
  35. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +4 -25
  36. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -1
  37. package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
  38. package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
  39. package/dist/features/converters/lexicalToJSX/Component/index.js +2 -13
  40. package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
  41. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js +1 -8
  42. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js.map +1 -1
  43. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +1 -8
  44. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
  45. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js +1 -6
  46. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js.map +1 -1
  47. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js +1 -6
  48. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js.map +1 -1
  49. package/dist/features/converters/lexicalToJSX/converter/converters/link.js +10 -19
  50. package/dist/features/converters/lexicalToJSX/converter/converters/link.js.map +1 -1
  51. package/dist/features/converters/lexicalToJSX/converter/converters/list.js +16 -63
  52. package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
  53. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js +4 -19
  54. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js.map +1 -1
  55. package/dist/features/converters/lexicalToJSX/converter/converters/table.js +12 -45
  56. package/dist/features/converters/lexicalToJSX/converter/converters/table.js.map +1 -1
  57. package/dist/features/converters/lexicalToJSX/converter/converters/text.js +11 -57
  58. package/dist/features/converters/lexicalToJSX/converter/converters/text.js.map +1 -1
  59. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +7 -46
  60. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
  61. package/dist/features/converters/lexicalToJSX/converter/index.js +5 -12
  62. package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
  63. package/dist/features/debug/jsxConverter/client/plugin/index.js +3 -16
  64. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  65. package/dist/features/debug/testRecorder/client/plugin/index.js +38 -113
  66. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  67. package/dist/features/debug/treeView/client/plugin/index.js +1 -15
  68. package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
  69. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +79 -357
  70. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  71. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +7 -41
  72. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  73. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +9 -39
  74. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  75. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +28 -59
  76. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
  77. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js +0 -1
  78. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js.map +1 -1
  79. package/dist/features/indent/client/IndentPlugin.js +1 -6
  80. package/dist/features/indent/client/IndentPlugin.js.map +1 -1
  81. package/dist/features/link/client/plugins/clickableLink/index.js +1 -7
  82. package/dist/features/link/client/plugins/clickableLink/index.js.map +1 -1
  83. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +59 -151
  84. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  85. package/dist/features/link/client/plugins/floatingLinkEditor/index.js +1 -9
  86. package/dist/features/link/client/plugins/floatingLinkEditor/index.js.map +1 -1
  87. package/dist/features/link/nodes/LinkNode.js.map +1 -1
  88. package/dist/features/lists/checklist/client/plugin/index.js +1 -7
  89. package/dist/features/lists/checklist/client/plugin/index.js.map +1 -1
  90. package/dist/features/lists/plugin/index.js +1 -7
  91. package/dist/features/lists/plugin/index.js.map +1 -1
  92. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +3 -18
  93. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  94. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +2 -9
  95. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  96. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +3 -18
  97. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  98. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +2 -9
  99. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  100. package/dist/features/relationship/client/components/RelationshipComponent.js +31 -100
  101. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  102. package/dist/features/relationship/client/drawer/index.js +4 -21
  103. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  104. package/dist/features/relationship/client/nodes/RelationshipNode.js +2 -12
  105. package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
  106. package/dist/features/relationship/client/plugins/index.js +1 -8
  107. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  108. package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
  109. package/dist/features/textState/feature.client.js +5 -22
  110. package/dist/features/textState/feature.client.js.map +1 -1
  111. package/dist/features/toolbars/fixed/client/Toolbar/index.js +27 -123
  112. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  113. package/dist/features/toolbars/inline/client/Toolbar/index.js +18 -111
  114. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  115. package/dist/features/toolbars/shared/ToolbarButton/index.js +4 -14
  116. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  117. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +56 -135
  118. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  119. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +16 -70
  120. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  121. package/dist/features/upload/client/component/index.js +43 -167
  122. package/dist/features/upload/client/component/index.js.map +1 -1
  123. package/dist/features/upload/client/component/pending/index.js +3 -16
  124. package/dist/features/upload/client/component/pending/index.js.map +1 -1
  125. package/dist/features/upload/client/drawer/index.js +4 -21
  126. package/dist/features/upload/client/drawer/index.js.map +1 -1
  127. package/dist/features/upload/client/nodes/UploadNode.js +3 -17
  128. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  129. package/dist/features/upload/client/plugin/index.js +2 -9
  130. package/dist/features/upload/client/plugin/index.js.map +1 -1
  131. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  132. package/dist/field/Diff/converters/listitem/index.js +11 -54
  133. package/dist/field/Diff/converters/listitem/index.js.map +1 -1
  134. package/dist/field/Diff/converters/relationship/index.js +18 -60
  135. package/dist/field/Diff/converters/relationship/index.js.map +1 -1
  136. package/dist/field/Diff/converters/unknown/index.js +7 -42
  137. package/dist/field/Diff/converters/unknown/index.js.map +1 -1
  138. package/dist/field/Diff/converters/upload/index.js +21 -91
  139. package/dist/field/Diff/converters/upload/index.js.map +1 -1
  140. package/dist/field/Diff/index.js +4 -17
  141. package/dist/field/Diff/index.js.map +1 -1
  142. package/dist/field/Field.js +25 -124
  143. package/dist/field/Field.js.map +1 -1
  144. package/dist/field/RenderLexical/index.js +15 -47
  145. package/dist/field/RenderLexical/index.js.map +1 -1
  146. package/dist/field/index.js +5 -24
  147. package/dist/field/index.js.map +1 -1
  148. package/dist/field/rscEntry.js +1 -9
  149. package/dist/field/rscEntry.js.map +1 -1
  150. package/dist/lexical/EditorPlugin.js +2 -17
  151. package/dist/lexical/EditorPlugin.js.map +1 -1
  152. package/dist/lexical/LexicalEditor.js +69 -232
  153. package/dist/lexical/LexicalEditor.js.map +1 -1
  154. package/dist/lexical/LexicalProvider.js +13 -64
  155. package/dist/lexical/LexicalProvider.js.map +1 -1
  156. package/dist/lexical/config/client/EditorConfigProvider.js +2 -11
  157. package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
  158. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +5 -28
  159. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  160. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +1 -14
  161. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  162. package/dist/lexical/plugins/SlashMenu/index.js +31 -98
  163. package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
  164. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +7 -27
  165. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  166. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +7 -45
  167. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  168. package/dist/lexical/ui/ContentEditable.js +3 -18
  169. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  170. package/dist/lexical/ui/icons/AI/index.js +10 -58
  171. package/dist/lexical/ui/icons/AI/index.js.map +1 -1
  172. package/dist/lexical/ui/icons/Add/index.js +4 -31
  173. package/dist/lexical/ui/icons/Add/index.js.map +1 -1
  174. package/dist/lexical/ui/icons/AlignCenter/index.js +5 -45
  175. package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
  176. package/dist/lexical/ui/icons/AlignJustify/index.js +5 -45
  177. package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
  178. package/dist/lexical/ui/icons/AlignLeft/index.js +5 -45
  179. package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
  180. package/dist/lexical/ui/icons/AlignRight/index.js +5 -45
  181. package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
  182. package/dist/lexical/ui/icons/Block/index.js +5 -54
  183. package/dist/lexical/ui/icons/Block/index.js.map +1 -1
  184. package/dist/lexical/ui/icons/Blockquote/index.js +3 -24
  185. package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
  186. package/dist/lexical/ui/icons/Bold/index.js +3 -24
  187. package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
  188. package/dist/lexical/ui/icons/Checklist/index.js +4 -39
  189. package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
  190. package/dist/lexical/ui/icons/Code/index.js +4 -34
  191. package/dist/lexical/ui/icons/Code/index.js.map +1 -1
  192. package/dist/lexical/ui/icons/CodeBlock/index.js +3 -22
  193. package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
  194. package/dist/lexical/ui/icons/Collapse/index.js +3 -23
  195. package/dist/lexical/ui/icons/Collapse/index.js.map +1 -1
  196. package/dist/lexical/ui/icons/H1/index.js +3 -24
  197. package/dist/lexical/ui/icons/H1/index.js.map +1 -1
  198. package/dist/lexical/ui/icons/H2/index.js +3 -24
  199. package/dist/lexical/ui/icons/H2/index.js.map +1 -1
  200. package/dist/lexical/ui/icons/H3/index.js +3 -24
  201. package/dist/lexical/ui/icons/H3/index.js.map +1 -1
  202. package/dist/lexical/ui/icons/H4/index.js +3 -24
  203. package/dist/lexical/ui/icons/H4/index.js.map +1 -1
  204. package/dist/lexical/ui/icons/H5/index.js +3 -24
  205. package/dist/lexical/ui/icons/H5/index.js.map +1 -1
  206. package/dist/lexical/ui/icons/H6/index.js +3 -24
  207. package/dist/lexical/ui/icons/H6/index.js.map +1 -1
  208. package/dist/lexical/ui/icons/HorizontalRule/index.js +3 -27
  209. package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
  210. package/dist/lexical/ui/icons/IndentDecrease/index.js +6 -53
  211. package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
  212. package/dist/lexical/ui/icons/IndentIncrease/index.js +6 -53
  213. package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
  214. package/dist/lexical/ui/icons/InlineBlocks/index.js +3 -26
  215. package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -1
  216. package/dist/lexical/ui/icons/Italic/index.js +3 -24
  217. package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
  218. package/dist/lexical/ui/icons/Link/index.js +3 -25
  219. package/dist/lexical/ui/icons/Link/index.js.map +1 -1
  220. package/dist/lexical/ui/icons/Meatballs/index.js +5 -39
  221. package/dist/lexical/ui/icons/Meatballs/index.js.map +1 -1
  222. package/dist/lexical/ui/icons/OrderedList/index.js +7 -61
  223. package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
  224. package/dist/lexical/ui/icons/Relationship/index.js +10 -58
  225. package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
  226. package/dist/lexical/ui/icons/Strikethrough/index.js +4 -34
  227. package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
  228. package/dist/lexical/ui/icons/Subscript/index.js +3 -24
  229. package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
  230. package/dist/lexical/ui/icons/Superscript/index.js +3 -24
  231. package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
  232. package/dist/lexical/ui/icons/Table/index.js +3 -24
  233. package/dist/lexical/ui/icons/Table/index.js.map +1 -1
  234. package/dist/lexical/ui/icons/Text/index.js +3 -24
  235. package/dist/lexical/ui/icons/Text/index.js.map +1 -1
  236. package/dist/lexical/ui/icons/TextState/index.js +12 -18
  237. package/dist/lexical/ui/icons/TextState/index.js.map +1 -1
  238. package/dist/lexical/ui/icons/Underline/index.js +4 -34
  239. package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
  240. package/dist/lexical/ui/icons/UnorderedList/index.js +8 -81
  241. package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
  242. package/dist/lexical/ui/icons/Upload/index.js +5 -48
  243. package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
  244. package/dist/lexical/utils/point.js.map +1 -1
  245. package/dist/lexical/utils/rect.js.map +1 -1
  246. package/dist/utilities/fieldsDrawer/Drawer.js +16 -41
  247. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  248. package/dist/utilities/fieldsDrawer/DrawerContent.js +10 -42
  249. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  250. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +1 -9
  251. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  252. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +3 -11
  253. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  254. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lexical/config/client/EditorConfigProvider.tsx"],"sourcesContent":["'use client'\n\nimport type { LexicalEditor } from 'lexical'\nimport type { MarkRequired } from 'ts-essentials'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useEditDepth } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { createContext, use, useMemo, useRef, useState } from 'react'\n\nimport type { InlineBlockNode } from '../../../features/blocks/client/nodes/InlineBlocksNode.js'\nimport type { LexicalRichTextFieldProps } from '../../../types.js'\nimport type { SanitizedClientEditorConfig } from '../types.js'\n\n// Should always produce a 20 character pseudo-random string\nfunction generateQuickGuid(): string {\n return Math.random().toString(36).substring(2, 12) + Math.random().toString(36).substring(2, 12)\n}\n\nexport interface EditorConfigContextType {\n // Editor focus handling\n blurEditor: (editorContext: EditorConfigContextType) => void\n childrenEditors: React.RefObject<Map<string, EditorConfigContextType>>\n createdInlineBlock?: InlineBlockNode\n editDepth: number\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n editorContainerRef: React.RefObject<HTMLDivElement>\n fieldProps: MarkRequired<LexicalRichTextFieldProps, 'path' | 'schemaPath'>\n focusedEditor: EditorConfigContextType | null\n // Editor focus handling\n focusEditor: (editorContext: EditorConfigContextType) => void\n parentEditor: EditorConfigContextType\n registerChild: (uuid: string, editorContext: EditorConfigContextType) => void\n setCreatedInlineBlock?: React.Dispatch<React.SetStateAction<InlineBlockNode | undefined>>\n unregisterChild?: (uuid: string) => void\n uuid: string\n}\n\n// @ts-expect-error: TODO: Fix this\nconst Context: React.Context<EditorConfigContextType> = createContext({\n editorConfig: null,\n fieldProps: null,\n uuid: null,\n})\n\nexport const EditorConfigProvider = ({\n children,\n editorConfig,\n editorContainerRef,\n fieldProps,\n parentContext,\n}: {\n children: React.ReactNode\n editorConfig: SanitizedClientEditorConfig\n editorContainerRef: React.RefObject<HTMLDivElement | null>\n\n fieldProps: LexicalRichTextFieldProps\n parentContext?: EditorConfigContextType\n}): React.ReactNode => {\n const [editor] = useLexicalComposerContext()\n // State to store the UUID\n const [uuid] = useState(() => generateQuickGuid())\n\n const childrenEditors = useRef<Map<string, EditorConfigContextType>>(new Map())\n const [focusedEditor, setFocusedEditor] = useState<EditorConfigContextType | null>(null)\n const focusHistory = useRef<Set<string>>(new Set())\n const [createdInlineBlock, setCreatedInlineBlock] = useState<InlineBlockNode>()\n\n const editDepth = useEditDepth()\n\n const editorContext = useMemo(\n () =>\n ({\n blurEditor: (editorContext: EditorConfigContextType) => {\n //setFocusedEditor(null) // Clear focused editor\n focusHistory.current.clear() // Reset focus history when focus is lost\n },\n childrenEditors,\n createdInlineBlock,\n editDepth,\n editor,\n editorConfig,\n editorContainerRef,\n fieldProps,\n focusedEditor,\n focusEditor: (editorContext: EditorConfigContextType) => {\n const editorUUID = editorContext.uuid\n\n // Avoid recursion by checking if this editor is already focused in this cycle\n if (focusHistory.current.has(editorUUID)) {\n return\n }\n\n // Add this editor to the history to prevent future recursions in this cycle\n focusHistory.current.add(editorUUID)\n setFocusedEditor(editorContext)\n\n // Propagate focus event to parent and children, ensuring they do not refocus this editor\n if (parentContext?.uuid) {\n parentContext.focusEditor(editorContext)\n }\n childrenEditors.current.forEach((childEditor) => {\n childEditor.focusEditor(editorContext)\n })\n\n focusHistory.current.clear()\n },\n parentEditor: parentContext,\n registerChild: (childUUID, childEditorContext) => {\n if (!childrenEditors.current.has(childUUID)) {\n const newMap = new Map(childrenEditors.current)\n newMap.set(childUUID, childEditorContext)\n childrenEditors.current = newMap\n }\n },\n setCreatedInlineBlock,\n unregisterChild: (childUUID) => {\n if (childrenEditors.current.has(childUUID)) {\n const newMap = new Map(childrenEditors.current)\n newMap.delete(childUUID)\n childrenEditors.current = newMap\n }\n },\n\n uuid,\n }) as EditorConfigContextType,\n [\n createdInlineBlock,\n setCreatedInlineBlock,\n editor,\n childrenEditors,\n editorConfig,\n editorContainerRef,\n editDepth,\n fieldProps,\n focusedEditor,\n parentContext,\n uuid,\n ],\n )\n\n return <Context value={editorContext}>{children}</Context>\n}\n\nexport const useEditorConfigContext = (): EditorConfigContextType => {\n const context = use(Context)\n if (context === undefined) {\n throw new Error('useEditorConfigContext must be used within an EditorConfigProvider')\n }\n return context\n}\n"],"names":["useLexicalComposerContext","useEditDepth","React","createContext","use","useMemo","useRef","useState","generateQuickGuid","Math","random","toString","substring","Context","editorConfig","fieldProps","uuid","EditorConfigProvider","children","editorContainerRef","parentContext","editor","childrenEditors","Map","focusedEditor","setFocusedEditor","focusHistory","Set","createdInlineBlock","setCreatedInlineBlock","editDepth","editorContext","blurEditor","current","clear","focusEditor","editorUUID","has","add","forEach","childEditor","parentEditor","registerChild","childUUID","childEditorContext","newMap","set","unregisterChild","delete","value","useEditorConfigContext","context","undefined","Error"],"mappings":"AAAA;;AAKA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,YAAY,QAAQ,iBAAgB;AAC7C,YAAYC,WAAW,QAAO;AAC9B,SAASC,aAAa,EAAEC,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAMrE,4DAA4D;AAC5D,SAASC;IACP,OAAOC,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG,MAAMH,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG;AAC/F;AAGE,wBAAwB;AAUxB,wBAAwB;AAS1B,mCAAmC;AACnC,MAAMC,wBAAkDV,cAAc;IACpEW,cAAc;IACdC,YAAY;IACZC,MAAM;AACR;AAEA,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,QAAQ,EACRJ,YAAY,EACZK,kBAAkB,EAClBJ,UAAU,EACVK,aAAa,EAQd;IACC,MAAM,CAACC,OAAO,GAAGrB;IACjB,0BAA0B;IAC1B,MAAM,CAACgB,KAAK,GAAGT,SAAS,IAAMC;IAE9B,MAAMc,kBAAkBhB,OAA6C,IAAIiB;IACzE,MAAM,CAACC,eAAeC,iBAAiB,GAAGlB,SAAyC;IACnF,MAAMmB,eAAepB,OAAoB,IAAIqB;IAC7C,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGtB;IAEpD,MAAMuB,YAAY7B;IAElB,MAAM8B,gBAAgB1B,QACpB,IACG,CAAA;YACC2B,YAAY,CAACD;gBACX,gDAAgD;gBAChDL,aAAaO,OAAO,CAACC,KAAK;YAC5B;YAD+B,yCAAyC;YAExEZ;YACAM;YACAE;YACAT;YACAP;YACAK;YACAJ;YACAS;YACAW,aAAa,CAACJ;gBACZ,MAAMK,aAAaL,cAAcf,IAAI;gBAErC,8EAA8E;gBAC9E,IAAIU,aAAaO,OAAO,CAACI,GAAG,CAACD,aAAa;oBACxC;gBACF;gBAEA,4EAA4E;gBAC5EV,aAAaO,OAAO,CAACK,GAAG,CAACF;gBACzBX,iBAAiBM;gBAEjB,yFAAyF;gBACzF,IAAIX,eAAeJ,MAAM;oBACvBI,cAAce,WAAW,CAACJ;gBAC5B;gBACAT,gBAAgBW,OAAO,CAACM,OAAO,CAAC,CAACC;oBAC/BA,YAAYL,WAAW,CAACJ;gBAC1B;gBAEAL,aAAaO,OAAO,CAACC,KAAK;YAC5B;YACAO,cAAcrB;YACdsB,eAAe,CAACC,WAAWC;gBACzB,IAAI,CAACtB,gBAAgBW,OAAO,CAACI,GAAG,CAACM,YAAY;oBAC3C,MAAME,SAAS,IAAItB,IAAID,gBAAgBW,OAAO;oBAC9CY,OAAOC,GAAG,CAACH,WAAWC;oBACtBtB,gBAAgBW,OAAO,GAAGY;gBAC5B;YACF;YACAhB;YACAkB,iBAAiB,CAACJ;gBAChB,IAAIrB,gBAAgBW,OAAO,CAACI,GAAG,CAACM,YAAY;oBAC1C,MAAME,SAAS,IAAItB,IAAID,gBAAgBW,OAAO;oBAC9CY,OAAOG,MAAM,CAACL;oBACdrB,gBAAgBW,OAAO,GAAGY;gBAC5B;YACF;YAEA7B;QACF,CAAA,GACF;QACEY;QACAC;QACAR;QACAC;QACAR;QACAK;QACAW;QACAf;QACAS;QACAJ;QACAJ;KACD;IAGH,qBAAO,QAACH;QAAQoC,OAAOlB;kBAAgBb;;;;;;AACzC,EAAC;AAED,OAAO,MAAMgC,yBAAyB;IACpC,MAAMC,UAAU/C,IAAIS;IACpB,IAAIsC,YAAYC,WAAW;QACzB,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOF;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../../src/lexical/config/client/EditorConfigProvider.tsx"],"sourcesContent":["'use client'\n\nimport type { LexicalEditor } from 'lexical'\nimport type { MarkRequired } from 'ts-essentials'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useEditDepth } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { createContext, use, useMemo, useRef, useState } from 'react'\n\nimport type { InlineBlockNode } from '../../../features/blocks/client/nodes/InlineBlocksNode.js'\nimport type { LexicalRichTextFieldProps } from '../../../types.js'\nimport type { SanitizedClientEditorConfig } from '../types.js'\n\n// Should always produce a 20 character pseudo-random string\nfunction generateQuickGuid(): string {\n return Math.random().toString(36).substring(2, 12) + Math.random().toString(36).substring(2, 12)\n}\n\nexport interface EditorConfigContextType {\n // Editor focus handling\n blurEditor: (editorContext: EditorConfigContextType) => void\n childrenEditors: React.RefObject<Map<string, EditorConfigContextType>>\n createdInlineBlock?: InlineBlockNode\n editDepth: number\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n editorContainerRef: React.RefObject<HTMLDivElement>\n fieldProps: MarkRequired<LexicalRichTextFieldProps, 'path' | 'schemaPath'>\n focusedEditor: EditorConfigContextType | null\n // Editor focus handling\n focusEditor: (editorContext: EditorConfigContextType) => void\n parentEditor: EditorConfigContextType\n registerChild: (uuid: string, editorContext: EditorConfigContextType) => void\n setCreatedInlineBlock?: React.Dispatch<React.SetStateAction<InlineBlockNode | undefined>>\n unregisterChild?: (uuid: string) => void\n uuid: string\n}\n\n// @ts-expect-error: TODO: Fix this\nconst Context: React.Context<EditorConfigContextType> = createContext({\n editorConfig: null,\n fieldProps: null,\n uuid: null,\n})\n\nexport const EditorConfigProvider = ({\n children,\n editorConfig,\n editorContainerRef,\n fieldProps,\n parentContext,\n}: {\n children: React.ReactNode\n editorConfig: SanitizedClientEditorConfig\n editorContainerRef: React.RefObject<HTMLDivElement | null>\n\n fieldProps: LexicalRichTextFieldProps\n parentContext?: EditorConfigContextType\n}): React.ReactNode => {\n const [editor] = useLexicalComposerContext()\n // State to store the UUID\n const [uuid] = useState(() => generateQuickGuid())\n\n const childrenEditors = useRef<Map<string, EditorConfigContextType>>(new Map())\n const [focusedEditor, setFocusedEditor] = useState<EditorConfigContextType | null>(null)\n const focusHistory = useRef<Set<string>>(new Set())\n const [createdInlineBlock, setCreatedInlineBlock] = useState<InlineBlockNode>()\n\n const editDepth = useEditDepth()\n\n const editorContext = useMemo(\n () =>\n ({\n blurEditor: (editorContext: EditorConfigContextType) => {\n //setFocusedEditor(null) // Clear focused editor\n focusHistory.current.clear() // Reset focus history when focus is lost\n },\n childrenEditors,\n createdInlineBlock,\n editDepth,\n editor,\n editorConfig,\n editorContainerRef,\n fieldProps,\n focusedEditor,\n focusEditor: (editorContext: EditorConfigContextType) => {\n const editorUUID = editorContext.uuid\n\n // Avoid recursion by checking if this editor is already focused in this cycle\n if (focusHistory.current.has(editorUUID)) {\n return\n }\n\n // Add this editor to the history to prevent future recursions in this cycle\n focusHistory.current.add(editorUUID)\n setFocusedEditor(editorContext)\n\n // Propagate focus event to parent and children, ensuring they do not refocus this editor\n if (parentContext?.uuid) {\n parentContext.focusEditor(editorContext)\n }\n childrenEditors.current.forEach((childEditor) => {\n childEditor.focusEditor(editorContext)\n })\n\n focusHistory.current.clear()\n },\n parentEditor: parentContext,\n registerChild: (childUUID, childEditorContext) => {\n if (!childrenEditors.current.has(childUUID)) {\n const newMap = new Map(childrenEditors.current)\n newMap.set(childUUID, childEditorContext)\n childrenEditors.current = newMap\n }\n },\n setCreatedInlineBlock,\n unregisterChild: (childUUID) => {\n if (childrenEditors.current.has(childUUID)) {\n const newMap = new Map(childrenEditors.current)\n newMap.delete(childUUID)\n childrenEditors.current = newMap\n }\n },\n\n uuid,\n }) as EditorConfigContextType,\n [\n createdInlineBlock,\n setCreatedInlineBlock,\n editor,\n childrenEditors,\n editorConfig,\n editorContainerRef,\n editDepth,\n fieldProps,\n focusedEditor,\n parentContext,\n uuid,\n ],\n )\n\n return <Context value={editorContext}>{children}</Context>\n}\n\nexport const useEditorConfigContext = (): EditorConfigContextType => {\n const context = use(Context)\n if (context === undefined) {\n throw new Error('useEditorConfigContext must be used within an EditorConfigProvider')\n }\n return context\n}\n"],"names":["useLexicalComposerContext","useEditDepth","createContext","use","useMemo","useRef","useState","generateQuickGuid","Math","random","toString","substring","Context","editorConfig","fieldProps","uuid","EditorConfigProvider","children","editorContainerRef","parentContext","editor","childrenEditors","Map","focusedEditor","setFocusedEditor","focusHistory","Set","createdInlineBlock","setCreatedInlineBlock","editDepth","editorContext","blurEditor","current","clear","focusEditor","editorUUID","has","add","forEach","childEditor","parentEditor","registerChild","childUUID","childEditorContext","newMap","set","unregisterChild","delete","value","useEditorConfigContext","context","undefined","Error"],"mappings":"AAAA;AAKA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,YAAY,QAAQ,iBAAgB;AAE7C,SAASC,aAAa,EAAEC,GAAG,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAMrE,4DAA4D;AAC5D,SAASC;IACP,OAAOC,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG,MAAMH,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG;AAC/F;AAGE,wBAAwB;AAUxB,wBAAwB;AAS1B,mCAAmC;AACnC,MAAMC,UAAkDV,cAAc;IACpEW,cAAc;IACdC,YAAY;IACZC,MAAM;AACR;AAEA,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,QAAQ,EACRJ,YAAY,EACZK,kBAAkB,EAClBJ,UAAU,EACVK,aAAa,EAQd;IACC,MAAM,CAACC,OAAO,GAAGpB;IACjB,0BAA0B;IAC1B,MAAM,CAACe,KAAK,GAAGT,SAAS,IAAMC;IAE9B,MAAMc,kBAAkBhB,OAA6C,IAAIiB;IACzE,MAAM,CAACC,eAAeC,iBAAiB,GAAGlB,SAAyC;IACnF,MAAMmB,eAAepB,OAAoB,IAAIqB;IAC7C,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGtB;IAEpD,MAAMuB,YAAY5B;IAElB,MAAM6B,gBAAgB1B,QACpB,IACG,CAAA;YACC2B,YAAY,CAACD;gBACX,gDAAgD;gBAChDL,aAAaO,OAAO,CAACC,KAAK;YAC5B;YAD+B,yCAAyC;YAExEZ;YACAM;YACAE;YACAT;YACAP;YACAK;YACAJ;YACAS;YACAW,aAAa,CAACJ;gBACZ,MAAMK,aAAaL,cAAcf,IAAI;gBAErC,8EAA8E;gBAC9E,IAAIU,aAAaO,OAAO,CAACI,GAAG,CAACD,aAAa;oBACxC;gBACF;gBAEA,4EAA4E;gBAC5EV,aAAaO,OAAO,CAACK,GAAG,CAACF;gBACzBX,iBAAiBM;gBAEjB,yFAAyF;gBACzF,IAAIX,eAAeJ,MAAM;oBACvBI,cAAce,WAAW,CAACJ;gBAC5B;gBACAT,gBAAgBW,OAAO,CAACM,OAAO,CAAC,CAACC;oBAC/BA,YAAYL,WAAW,CAACJ;gBAC1B;gBAEAL,aAAaO,OAAO,CAACC,KAAK;YAC5B;YACAO,cAAcrB;YACdsB,eAAe,CAACC,WAAWC;gBACzB,IAAI,CAACtB,gBAAgBW,OAAO,CAACI,GAAG,CAACM,YAAY;oBAC3C,MAAME,SAAS,IAAItB,IAAID,gBAAgBW,OAAO;oBAC9CY,OAAOC,GAAG,CAACH,WAAWC;oBACtBtB,gBAAgBW,OAAO,GAAGY;gBAC5B;YACF;YACAhB;YACAkB,iBAAiB,CAACJ;gBAChB,IAAIrB,gBAAgBW,OAAO,CAACI,GAAG,CAACM,YAAY;oBAC1C,MAAME,SAAS,IAAItB,IAAID,gBAAgBW,OAAO;oBAC9CY,OAAOG,MAAM,CAACL;oBACdrB,gBAAgBW,OAAO,GAAGY;gBAC5B;YACF;YAEA7B;QACF,CAAA,GACF;QACEY;QACAC;QACAR;QACAC;QACAR;QACAK;QACAW;QACAf;QACAS;QACAJ;QACAJ;KACD;IAGH,QAAQH,QAAQoC,OAAOlB,gBAAgBb,WAAWL;AACpD,EAAC;AAED,OAAO,MAAMqC,yBAAyB;IACpC,MAAMC,UAAU/C,IAAIS;IACpB,IAAIsC,YAAYC,WAAW;QACzB,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOF;AACT,EAAC"}
@@ -1,8 +1,6 @@
1
1
  /* eslint-disable jsx-a11y/click-events-have-key-events */ 'use client';
2
- import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
2
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
3
  import { $createParagraphNode, $getRoot } from 'lexical';
5
- import React from 'react';
6
4
  import './index.scss';
7
5
  import { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js';
8
6
  const baseClass = 'insert-paragraph-at-end';
@@ -19,32 +17,11 @@ export const InsertParagraphAtEndPlugin = ()=>{
19
17
  paragraphNode.select();
20
18
  });
21
19
  };
22
- return(// TODO: convert to button
23
- /*#__PURE__*/ _jsxDEV("div", {
24
- "aria-label": "Insert Paragraph",
25
- className: baseClass,
26
- onClick: onClick,
27
- role: "button",
28
- tabIndex: 0,
29
- children: /*#__PURE__*/ _jsxDEV("div", {
30
- className: `${baseClass}-inside`,
31
- children: /*#__PURE__*/ _jsxDEV("span", {
32
- children: "+"
33
- }, void 0, false, {
34
- fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
35
- lineNumber: 38,
36
- columnNumber: 9
37
- }, this)
38
- }, void 0, false, {
39
- fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
40
- lineNumber: 37,
41
- columnNumber: 7
42
- }, this)
43
- }, void 0, false, {
44
- fileName: "src/lexical/plugins/InsertParagraphAtEnd/index.tsx",
45
- lineNumber: 30,
46
- columnNumber: 5
47
- }, this));
20
+ return(<div aria-label="Insert Paragraph" className={baseClass} onClick={onClick} role="button" tabIndex={0}>
21
+ <div className={`${baseClass}-inside`}>
22
+ <span>+</span>
23
+ </div>
24
+ </div>);
48
25
  };
49
26
 
50
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lexical/plugins/InsertParagraphAtEnd/index.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createParagraphNode, $getRoot } from 'lexical'\nimport React from 'react'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nconst baseClass = 'insert-paragraph-at-end'\n\nexport const InsertParagraphAtEndPlugin: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n const { editorConfig } = useEditorConfigContext()\n\n if (editorConfig?.admin?.hideInsertParagraphAtEnd) {\n return null\n }\n\n const onClick = () => {\n editor.update(() => {\n const paragraphNode = $createParagraphNode()\n $getRoot().append(paragraphNode)\n paragraphNode.select()\n })\n }\n\n return (\n // TODO: convert to button\n <div\n aria-label=\"Insert Paragraph\"\n className={baseClass}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n >\n <div className={`${baseClass}-inside`}>\n <span>+</span>\n </div>\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$getRoot","React","useEditorConfigContext","baseClass","InsertParagraphAtEndPlugin","editor","editorConfig","admin","hideInsertParagraphAtEnd","onClick","update","paragraphNode","append","select","div","aria-label","className","role","tabIndex","span"],"mappings":"AAAA,wDAAwD,GACxD;;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,UAAS;AACxD,OAAOC,WAAW,QAAO;AAEzB,OAAO,eAAc;AACrB,SAASC,sBAAsB,QAAQ,8CAA6C;AACpF,MAAMC,YAAY;AAElB,OAAO,MAAMC,6BAAuC;IAClD,MAAM,CAACC,OAAO,GAAGP;IACjB,MAAM,EAAEQ,YAAY,EAAE,GAAGJ;IAEzB,IAAII,cAAcC,OAAOC,0BAA0B;QACjD,OAAO;IACT;IAEA,MAAMC,UAAU;QACdJ,OAAOK,MAAM,CAAC;YACZ,MAAMC,gBAAgBZ;YACtBC,WAAWY,MAAM,CAACD;YAClBA,cAAcE,MAAM;QACtB;IACF;IAEA,OACE,0BAA0B;kBAC1B,QAACC;QACCC,cAAW;QACXC,WAAWb;QACXM,SAASA;QACTQ,MAAK;QACLC,UAAU;kBAEV,cAAA,QAACJ;YAAIE,WAAW,GAAGb,UAAU,OAAO,CAAC;sBACnC,cAAA,QAACgB;0BAAK;;;;;;;;;;;;;;;;AAId,EAAC"}
1
+ {"version":3,"sources":["../../../../src/lexical/plugins/InsertParagraphAtEnd/index.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createParagraphNode, $getRoot } from 'lexical'\nimport React from 'react'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nconst baseClass = 'insert-paragraph-at-end'\n\nexport const InsertParagraphAtEndPlugin: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n const { editorConfig } = useEditorConfigContext()\n\n if (editorConfig?.admin?.hideInsertParagraphAtEnd) {\n return null\n }\n\n const onClick = () => {\n editor.update(() => {\n const paragraphNode = $createParagraphNode()\n $getRoot().append(paragraphNode)\n paragraphNode.select()\n })\n }\n\n return (\n // TODO: convert to button\n <div\n aria-label=\"Insert Paragraph\"\n className={baseClass}\n onClick={onClick}\n role=\"button\"\n tabIndex={0}\n >\n <div className={`${baseClass}-inside`}>\n <span>+</span>\n </div>\n </div>\n )\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$getRoot","useEditorConfigContext","baseClass","InsertParagraphAtEndPlugin","editor","editorConfig","admin","hideInsertParagraphAtEnd","onClick","update","paragraphNode","append","select","div","aria-label","className","role","tabIndex","span"],"mappings":"AAAA,wDAAwD,GACxD;AAEA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,oBAAoB,EAAEC,QAAQ,QAAQ,UAAS;AAGxD,OAAO,eAAc;AACrB,SAASC,sBAAsB,QAAQ,8CAA6C;AACpF,MAAMC,YAAY;AAElB,OAAO,MAAMC,6BAAuC;IAClD,MAAM,CAACC,OAAO,GAAGN;IACjB,MAAM,EAAEO,YAAY,EAAE,GAAGJ;IAEzB,IAAII,cAAcC,OAAOC,0BAA0B;QACjD,OAAO;IACT;IAEA,MAAMC,UAAU;QACdJ,OAAOK,MAAM,CAAC;YACZ,MAAMC,gBAAgBX;YACtBC,WAAWW,MAAM,CAACD;YAClBA,cAAcE,MAAM;QACtB;IACF;IAEA,QAEGC,IACCC,WAAW,mBACXC,WAAWb,WACXM,SAASA,SACTQ,KAAK,SACLC,UAAU,GACX;MACC,CAACJ,IAAIE,WAAW,GAAGb,UAAU,OAAO,CAAC,EAAE;QACrC,CAACgB,KAAK,CAAC,EAAEA,KAAK;MAChB,EAAEL,IAAI;IACR,EAAEA;AAEN,EAAC"}
@@ -1,5 +1,4 @@
1
1
  'use client';
2
- import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
2
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
3
  import { mergeRegister } from '@lexical/utils';
5
4
  import { $getSelection, $isRangeSelection, $isTextNode, COMMAND_PRIORITY_LOW, createCommand, getDOMSelection } from 'lexical';
@@ -171,19 +170,7 @@ export function LexicalTypeaheadMenuPlugin({ anchorClassName, anchorElem, groups
171
170
  closeTypeahead,
172
171
  openTypeahead
173
172
  ]);
174
- return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/ _jsxDEV(LexicalMenu, {
175
- anchorElementRef: anchorElementRef,
176
- close: closeTypeahead,
177
- editor: editor,
178
- groups: groups,
179
- menuRenderFn: menuRenderFn,
180
- resolution: resolution,
181
- shouldSplitNodeWithQuery: true
182
- }, void 0, false, {
183
- fileName: "src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx",
184
- lineNumber: 235,
185
- columnNumber: 5
186
- }, this);
173
+ return anchorElementRef.current === null || resolution === null || editor === null ? null : <LexicalMenu anchorElementRef={anchorElementRef} close={closeTypeahead} editor={editor} groups={groups} menuRenderFn={menuRenderFn} resolution={resolution} shouldSplitNodeWithQuery/>;
187
174
  }
188
175
 
189
176
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","undefined","query","removeUpdateListener","registerUpdateListener","current","close","shouldSplitNodeWithQuery"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand, LexicalEditor, ParagraphNode, RangeSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n getDOMSelection,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = getDOMSelection(editorWindow)\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): string | undefined {\n let text\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === undefined ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return anchorElementRef.current === null || resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n"],"names":["useLexicalComposerContext","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","COMMAND_PRIORITY_LOW","createCommand","getDOMSelection","useCallback","useEffect","useState","React","LexicalMenu","useMenuAnchorRef","PUNCTUATION","getTextUpToAnchor","selection","anchor","type","anchorNode","getNode","isSimpleText","anchorOffset","offset","getTextContent","slice","tryToPositionRange","leadOffset","range","editorWindow","domSelection","isCollapsed","startOffset","endOffset","setStart","setEnd","error","getQueryTextForSearch","editor","text","getEditorState","read","isSelectionOnEntityBoundary","prevSibling","getPreviousSibling","isTextEntity","startTransition","callback","useDynamicPositioning","ENABLE_SLASH_MENU_COMMAND","LexicalTypeaheadMenuPlugin","anchorClassName","anchorElem","groups","menuRenderFn","onClose","onOpen","onQueryChange","triggerFn","resolution","setResolution","anchorElementRef","closeTypeahead","openTypeahead","res","registerCommand","node","match","matchingString","replaceableString","_window","window","document","createRange","isRangePositioned","getRect","getBoundingClientRect","updateListener","undefined","query","removeUpdateListener","registerUpdateListener","current","close","shouldSplitNodeWithQuery"],"mappings":"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"}
@@ -1,9 +1,7 @@
1
1
  'use client';
2
- import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
2
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
3
  import { useTranslation } from '@payloadcms/ui';
5
4
  import { useCallback, useMemo, useState } from 'react';
6
- import * as React from 'react';
7
5
  import * as ReactDOM from 'react-dom';
8
6
  import { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js';
9
7
  import './index.scss';
@@ -29,36 +27,11 @@ function SlashMenuItem({ isSelected, item, onClick, onMouseEnter, ref }) {
29
27
  if (title.length > 25) {
30
28
  title = title.substring(0, 25) + '...';
31
29
  }
32
- return /*#__PURE__*/ _jsxDEV("button", {
33
- "aria-selected": isSelected,
34
- className: className,
35
- id: baseClass + '__item-' + item.key,
36
- onClick: onClick,
37
- onMouseEnter: onMouseEnter,
38
- ref: ref,
39
- role: "option",
40
- tabIndex: -1,
41
- type: "button",
42
- children: [
43
- item?.Icon && /*#__PURE__*/ _jsxDEV(item.Icon, {}, void 0, false, {
44
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
45
- lineNumber: 72,
46
- columnNumber: 22
47
- }, this),
48
- /*#__PURE__*/ _jsxDEV("span", {
49
- className: `${baseClass}__item-text`,
50
- children: title
51
- }, void 0, false, {
52
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
53
- lineNumber: 74,
54
- columnNumber: 7
55
- }, this)
56
- ]
57
- }, item.key, true, {
58
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
59
- lineNumber: 60,
60
- columnNumber: 5
61
- }, this);
30
+ return <button aria-selected={isSelected} className={className} id={baseClass + '__item-' + item.key} key={item.key} onClick={onClick} onMouseEnter={onMouseEnter} ref={ref} role="option" tabIndex={-1} type="button">
31
+ {item?.Icon && <item.Icon/>}
32
+
33
+ <span className={`${baseClass}__item-text`}>{title}</span>
34
+ </button>;
62
35
  }
63
36
  export function SlashMenuPlugin({ anchorElem = document.body }) {
64
37
  const [editor] = useLexicalComposerContext();
@@ -151,72 +124,32 @@ export function SlashMenuPlugin({ anchorElem = document.body }) {
151
124
  i18n,
152
125
  schemaPath
153
126
  ]);
154
- return /*#__PURE__*/ _jsxDEV(LexicalTypeaheadMenuPlugin, {
155
- anchorElem: anchorElem,
156
- groups: groups,
157
- menuRenderFn: (anchorElementRef, { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey })=>anchorElementRef.current && groups.length ? /*#__PURE__*/ ReactDOM.createPortal(/*#__PURE__*/ _jsxDEV("div", {
158
- className: baseClass,
159
- children: groups.map((group)=>{
160
- let groupTitle = group.key;
161
- if (group.label && featureClientSchemaMap) {
162
- groupTitle = typeof group.label === 'function' ? group.label({
163
- featureClientSchemaMap,
164
- i18n,
165
- schemaPath
166
- }) : group.label;
167
- }
168
- return /*#__PURE__*/ _jsxDEV("div", {
169
- className: `${baseClass}__group ${baseClass}__group-${group.key}`,
170
- children: [
171
- /*#__PURE__*/ _jsxDEV("div", {
172
- className: `${baseClass}__group-title`,
173
- children: groupTitle
174
- }, void 0, false, {
175
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
176
- lineNumber: 209,
177
- columnNumber: 23
178
- }, void 0),
179
- group.items.map((item, oi)=>/*#__PURE__*/ _jsxDEV(SlashMenuItem, {
180
- index: oi,
181
- isSelected: selectedItemKey === item.key,
182
- item: item,
183
- onClick: ()=>{
184
- setSelectedItemKey(item.key);
185
- selectItemAndCleanUp(item);
186
- },
187
- onMouseEnter: ()=>{
188
- setSelectedItemKey(item.key);
189
- },
190
- ref: (el)=>{
191
- ;
192
- item.ref = {
193
- current: el
194
- };
195
- }
196
- }, item.key, false, {
197
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
198
- lineNumber: 211,
199
- columnNumber: 25
200
- }, void 0))
201
- ]
202
- }, group.key, true, {
203
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
204
- lineNumber: 205,
205
- columnNumber: 21
206
- }, void 0);
207
- })
208
- }, void 0, false, {
209
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
210
- lineNumber: 194,
211
- columnNumber: 15
212
- }, void 0), anchorElementRef.current) : null,
213
- onQueryChange: setQueryString,
214
- triggerFn: checkForTriggerMatch
215
- }, void 0, false, {
216
- fileName: "src/lexical/plugins/SlashMenu/index.tsx",
217
- lineNumber: 185,
218
- columnNumber: 5
219
- }, this);
127
+ return <LexicalTypeaheadMenuPlugin anchorElem={anchorElem} groups={groups} menuRenderFn={(anchorElementRef, { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey })=>anchorElementRef.current && groups.length ? ReactDOM.createPortal(<div className={baseClass}>
128
+ {groups.map((group)=>{
129
+ let groupTitle = group.key;
130
+ if (group.label && featureClientSchemaMap) {
131
+ groupTitle = typeof group.label === 'function' ? group.label({
132
+ featureClientSchemaMap,
133
+ i18n,
134
+ schemaPath
135
+ }) : group.label;
136
+ }
137
+ return <div className={`${baseClass}__group ${baseClass}__group-${group.key}`} key={group.key}>
138
+ <div className={`${baseClass}__group-title`}>{groupTitle}</div>
139
+ {group.items.map((item, oi)=><SlashMenuItem index={oi} isSelected={selectedItemKey === item.key} item={item} key={item.key} onClick={()=>{
140
+ setSelectedItemKey(item.key);
141
+ selectItemAndCleanUp(item);
142
+ }} onMouseEnter={()=>{
143
+ setSelectedItemKey(item.key);
144
+ }} ref={(el)=>{
145
+ ;
146
+ item.ref = {
147
+ current: el
148
+ };
149
+ }}/>)}
150
+ </div>;
151
+ })}
152
+ </div>, anchorElementRef.current) : null} onQueryChange={setQueryString} triggerFn={checkForTriggerMatch}/>;
220
153
  }
221
154
 
222
155
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n ref,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n ref?: React.Ref<HTMLButtonElement>\n}) {\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const { i18n } = useTranslation<{}, string>()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={ref}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n if (queryString) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n // @ts-expect-error - TODO: fix this\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [\n queryString,\n editorConfig?.features.slashMenu.groups,\n getDynamicItems,\n featureClientSchemaMap,\n i18n,\n schemaPath,\n ])\n\n return (\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label && featureClientSchemaMap) {\n groupTitle =\n typeof group.label === 'function'\n ? group.label({ featureClientSchemaMap, i18n, schemaPath })\n : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n ref={(el) => {\n ;(item as SlashMenuItemInternal).ref = { current: el }\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n triggerFn={checkForTriggerMatch}\n />\n )\n}\n"],"names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","React","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","ref","fieldProps","featureClientSchemaMap","schemaPath","i18n","className","key","title","label","length","substring","button","aria-selected","id","role","tabIndex","type","Icon","span","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","menuRenderFn","anchorElementRef","selectedItemKey","selectItemAndCleanUp","setSelectedItemKey","current","createPortal","div","groupTitle","oi","index","el","onQueryChange","triggerFn"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n ref,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n ref?: React.Ref<HTMLButtonElement>\n}) {\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const { i18n } = useTranslation<{}, string>()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={ref}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n if (queryString) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n // @ts-expect-error - TODO: fix this\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [\n queryString,\n editorConfig?.features.slashMenu.groups,\n getDynamicItems,\n featureClientSchemaMap,\n i18n,\n schemaPath,\n ])\n\n return (\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label && featureClientSchemaMap) {\n groupTitle =\n typeof group.label === 'function'\n ? group.label({ featureClientSchemaMap, i18n, schemaPath })\n : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n ref={(el) => {\n ;(item as SlashMenuItemInternal).ref = { current: el }\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n triggerFn={checkForTriggerMatch}\n />\n )\n}\n"],"names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","ref","fieldProps","featureClientSchemaMap","schemaPath","i18n","className","key","title","label","length","substring","button","aria-selected","id","role","tabIndex","type","Icon","span","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","menuRenderFn","anchorElementRef","selectedItemKey","selectItemAndCleanUp","setSelectedItemKey","current","createPortal","div","groupTitle","oi","index","el","onQueryChange","triggerFn"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  'use client';
2
- import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
2
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
3
  import { $createParagraphNode, isHTMLElement } from 'lexical';
5
4
  import * as React from 'react';
@@ -135,32 +134,13 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
135
134
  editor,
136
135
  hoveredElement
137
136
  ]);
138
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxDEV(React.Fragment, {
139
- children: /*#__PURE__*/ _jsxDEV("button", {
140
- "aria-label": "Add block",
141
- className: "icon add-block-menu",
142
- onClick: (event)=>{
143
- handleAddClick(event);
144
- },
145
- ref: menuRef,
146
- type: "button",
147
- children: /*#__PURE__*/ _jsxDEV("div", {
148
- className: isEditable ? 'icon' : ''
149
- }, void 0, false, {
150
- fileName: "src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx",
151
- lineNumber: 199,
152
- columnNumber: 9
153
- }, this)
154
- }, void 0, false, {
155
- fileName: "src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx",
156
- lineNumber: 190,
157
- columnNumber: 7
158
- }, this)
159
- }, void 0, false, {
160
- fileName: "src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx",
161
- lineNumber: 189,
162
- columnNumber: 5
163
- }, this), anchorElem);
137
+ return createPortal(<React.Fragment>
138
+ <button aria-label="Add block" className="icon add-block-menu" onClick={(event)=>{
139
+ handleAddClick(event);
140
+ }} ref={menuRef} type="button">
141
+ <div className={isEditable ? 'icon' : ''}/>
142
+ </button>
143
+ </React.Fragment>, anchorElem);
164
144
  }
165
145
  export function AddBlockHandlePlugin({ anchorElem = document.body }) {
166
146
  const [editor] = useLexicalComposerContext();
@@ -1 +1 @@
1
- {"version":3,"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.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (\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 && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event: 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"],"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","Fragment","button","aria-label","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"mappings":"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"}
1
+ {"version":3,"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.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (\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 && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event: 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"],"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","Fragment","button","aria-label","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"mappings":"AAAA;AAGA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,oBAAoB,EAAEC,aAAa,QAAQ,UAAS;AAC7D,YAAYC,WAAW,QAAO;AAC9B,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAChE,SAASC,YAAY,QAAQ,YAAW;AAExC,SAASC,sBAAsB,QAAQ,iDAAgD;AACvF,SAASC,KAAK,QAAQ,0BAAyB;AAC/C,SAASC,yBAAyB,QAAQ,sDAAqD;AAC/F,SAASC,iCAAiC,QAAQ,gDAA+C;AACjG,SAASC,mBAAmB,QAAQ,kCAAiC;AACrE,SAASC,mBAAmB,QAAQ,kCAAiC;AACrE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,SAASC,iBAAiB,QAAQ,gCAA+B;AACjE,OAAO,eAAc;AAErB,MAAMC,2BAA2B;AAEjC,IAAIC,YAAYC;AAEhB,SAASC,gBAAgBC,UAAkB;IACzC,IAAIA,eAAe,GAAG;QACpB,OAAOF;IACT;IACA,IAAID,aAAa,KAAKA,YAAYG,YAAY;QAC5C,OAAOH;IACT;IAEA,OAAOI,KAAKC,KAAK,CAACF,aAAa;AACjC;AAEA,SAASG,kBACPC,MAAqB,EACrBC,UAAuB,EACvBC,UAAmB;IAEnB,MAAMC,eAAeF,WAAWG,aAAa;IAE7C,MAAM,EAAEC,YAAY,EAAE,GAAGrB;IACzB,MAAMsB,8BAA8BD,cAAcE,OAAOC,aAAa,CAAC,KAAK;IAE5E,MAAMC,UAAU5B,OAA0B;IAC1C,MAAM,CAAC6B,gBAAgBC,kBAAkB,GAAG7B,SAGlC;IAEVF,UAAU;QACR,SAASgC,oBAAoBC,KAAiB;YAC5C,MAAMC,SAASD,MAAMC,MAAM;YAC3B,IAAI,CAACrC,cAAcqC,SAAS;gBAC1B;YACF;YAEA,MAAMC,2BAA2B5B,kCAC/BgB,cACAU,MAAMG,KAAK,EACXH,MAAMI,KAAK,EACXH;YAGF,IAAIC,6BAA6B,CAAC,GAAG;gBACnCJ,kBAAkB;gBAClB;YACF;YAEA,IAAIrB,kBAAkBwB,QAAQtB,2BAA2B;gBACvD;YACF;YACA,MAAM0B,mBAAmB7B,oBAAoBW;YAE7C,MAAM,EACJmB,WAAWC,eAAe,EAC1BC,SAAS,EACTC,YAAY,EACb,GAAGlC,oBAAoB;gBACtBa;gBACAsB,iBAAiB;gBACjBvB;gBACAwB,kBAAkB,CAACT;gBACnBU,OAAO,IAAIxC,MAAM4B,MAAMa,CAAC,EAAEb,MAAMc,CAAC;gBACjCC,uBAAuB;gBACvBC,YAAYlC,gBAAgBuB,iBAAiBY,MAAM;gBACnDC,kBAAkB;YACpB;YAEAtC,YAAY6B;YAEZ,IAAI,CAACF,iBAAiB;gBACpB;YACF;YACA,IACEC,aACCX,CAAAA,gBAAgBsB,SAASX,aAAaX,gBAAgBuB,SAASb,eAAc,GAC9E;gBACAT,kBAAkB;oBAChBsB,MAAMb;oBACNY,MAAMX;gBACR;YACF;QACF;QAEA,+FAA+F;QAC/F,wFAAwF;QACxF,2EAA2E;QAC3Ea,UAAUC,iBAAiB,aAAavB;QAExC,OAAO;YACLsB,UAAUE,oBAAoB,aAAaxB;QAC7C;IACF,GAAG;QAACT;QAAcF;QAAYD;QAAQU;KAAe;IAErD9B,UAAU;QACR,IAAI6B,QAAQ4B,OAAO,IAAI3B,gBAAgBsB,MAAM;YAC3CzC,kBACEmB,gBAAgBuB,MAChBxB,QAAQ4B,OAAO,EACfpC,YACAK;QAEJ;IACF,GAAG;QAACL;QAAYS;QAAgBJ;KAA4B;IAE5D,MAAMgC,iBAAiB3D,YACrB,CAACkC;QACC,IAAI0B,sBAAsB7B;QAC1B,IAAI,CAAC6B,qBAAqBP,MAAM;YAC9B;QACF;QAEA,2GAA2G;QAC3GhC,OAAOwC,MAAM,CAAC;YACZ,2CAA2C;YAC3C,IAAIC,mBAAmB;YACvB,IACEF,qBAAqBP,KAAKU,cAAc,eACxCH,oBAAoBP,IAAI,CAACW,cAAc,OAAO,IAC9C;gBACAF,mBAAmB;YACrB;YAEA,IAAI,CAACA,kBAAkB;gBACrB,MAAMG,eAAepE;gBACrB+D,qBAAqBP,KAAKa,YAAYD;gBAEtCE,WAAW;oBACTP,sBAAsB;wBACpBN,MAAMjC,OAAO+C,eAAe,CAACH,aAAaI,MAAM;wBAChDhB,MAAMY;oBACR;oBACAjC,kBAAkB4B;gBACpB,GAAG;YACL;QACF;QAEA,qCAAqC;QACrCO,WAAW;YACT9C,OAAOwC,MAAM,CAAC;gBACZxC,OAAOiD,KAAK;gBAEZ,IACEV,qBAAqBP,QACrB,YAAYO,oBAAoBP,IAAI,IACpC,OAAOO,oBAAoBP,IAAI,CAACkB,MAAM,KAAK,YAC3C;oBACAX,oBAAoBP,IAAI,CAACkB,MAAM;gBACjC;YACF;QACF,GAAG;QAEH,gFAAgF;QAChF,6BAA6B;QAC7BJ,WAAW;YACT9C,OAAOmD,eAAe,CAACjE,2BAA2B;gBAChD8C,MAAMO,qBAAqBP;YAC7B;QACF,GAAG;QAEHnB,MAAMuC,eAAe;QACrBvC,MAAMwC,cAAc;IACtB,GACA;QAACrD;QAAQU;KAAe;IAG1B,OAAO3B,cACJL,MAAM4E,SAAS;MACd,CAACC,OACCC,WAAW,YACXC,UAAU,sBACVC,SAAS,CAAC7C;QACRyB,eAAezB;IACjB,GACA8C,KAAKlD,SACLmD,KAAK,SACN;QACC,CAACC,IAAIJ,WAAWvD,aAAa,SAAS,KAAM;MAC9C,EAAEqD,OAAO;IACX,EAAE7E,MAAM4E,WACRrD;AAEJ;AAEA,OAAO,SAAS6D,qBAAqB,EACnC7D,aAAaiC,SAAS6B,IAAI,EAG3B;IACC,MAAM,CAAC/D,OAAO,GAAGzB;IACjB,OAAOwB,kBAAkBC,QAAQC,YAAYD,OAAOgE,SAAS;AAC/D"}
@@ -1,5 +1,4 @@
1
1
  'use client';
2
- import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
2
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
3
  import { eventFiles } from '@lexical/rich-text';
5
4
  import { $getNearestNodeFromDOMNode, $getNodeByKey, isHTMLElement } from 'lexical';
@@ -311,50 +310,13 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
311
310
  hideTargetLine(targetLineRef.current, lastTargetBlock?.elem);
312
311
  }
313
312
  }
314
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxDEV(React.Fragment, {
315
- children: [
316
- /*#__PURE__*/ _jsxDEV("button", {
317
- "aria-label": "Drag to move",
318
- className: "icon draggable-block-menu",
319
- draggable: true,
320
- onDragEnd: onDragEnd,
321
- onDragStart: onDragStart,
322
- ref: menuRef,
323
- type: "button",
324
- children: /*#__PURE__*/ _jsxDEV("div", {
325
- className: isEditable ? 'icon' : ''
326
- }, void 0, false, {
327
- fileName: "src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx",
328
- lineNumber: 434,
329
- columnNumber: 9
330
- }, this)
331
- }, void 0, false, {
332
- fileName: "src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx",
333
- lineNumber: 425,
334
- columnNumber: 7
335
- }, this),
336
- /*#__PURE__*/ _jsxDEV("div", {
337
- className: "draggable-block-target-line",
338
- ref: targetLineRef
339
- }, void 0, false, {
340
- fileName: "src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx",
341
- lineNumber: 436,
342
- columnNumber: 7
343
- }, this),
344
- /*#__PURE__*/ _jsxDEV("div", {
345
- className: "debug-highlight",
346
- ref: debugHighlightRef
347
- }, void 0, false, {
348
- fileName: "src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx",
349
- lineNumber: 437,
350
- columnNumber: 7
351
- }, this)
352
- ]
353
- }, void 0, true, {
354
- fileName: "src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx",
355
- lineNumber: 424,
356
- columnNumber: 5
357
- }, this), anchorElem);
313
+ return createPortal(<React.Fragment>
314
+ <button aria-label="Drag to move" className="icon draggable-block-menu" draggable onDragEnd={onDragEnd} onDragStart={onDragStart} ref={menuRef} type="button">
315
+ <div className={isEditable ? 'icon' : ''}/>
316
+ </button>
317
+ <div className="draggable-block-target-line" ref={targetLineRef}/>
318
+ <div className="debug-highlight" ref={debugHighlightRef}/>
319
+ </React.Fragment>, anchorElem);
358
320
  }
359
321
  export function DraggableBlockPlugin({ anchorElem = document.body }) {
360
322
  const [editor] = useLexicalComposerContext();