@payloadcms/richtext-lexical 3.68.0-internal-debug.185cc5f → 3.68.0-internal-debug.dafc24d

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 (280) hide show
  1. package/dist/cell/rscEntry.js +13 -5
  2. package/dist/cell/rscEntry.js.map +1 -1
  3. package/dist/features/blocks/client/component/BlockContent.js +29 -9
  4. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  5. package/dist/features/blocks/client/component/components/BlockCollapsible.js +7 -3
  6. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  7. package/dist/features/blocks/client/component/components/BlockEditButton.js +6 -2
  8. package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
  9. package/dist/features/blocks/client/component/components/BlockRemoveButton.js +6 -2
  10. package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
  11. package/dist/features/blocks/client/component/index.js +123 -43
  12. package/dist/features/blocks/client/component/index.js.map +1 -1
  13. package/dist/features/blocks/client/component/index.scss +188 -0
  14. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js +7 -3
  15. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  16. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js +6 -2
  17. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
  18. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js +6 -2
  19. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
  20. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js +6 -2
  21. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
  22. package/dist/features/blocks/client/componentInline/index.js +117 -37
  23. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  24. package/dist/features/blocks/client/componentInline/index.scss +90 -0
  25. package/dist/features/blocks/client/getBlockImageComponent.js +7 -3
  26. package/dist/features/blocks/client/getBlockImageComponent.js.map +1 -1
  27. package/dist/features/blocks/client/nodes/BlocksNode.js +7 -3
  28. package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
  29. package/dist/features/blocks/client/nodes/InlineBlocksNode.js +7 -3
  30. package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
  31. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +87 -27
  32. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
  33. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +7 -3
  34. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
  35. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +12 -4
  36. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -1
  37. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.scss +6 -0
  38. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +18 -6
  39. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -1
  40. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.scss +29 -0
  41. package/dist/features/blocks/premade/CodeBlock/Component/index.scss +97 -0
  42. package/dist/features/converters/lexicalToJSX/Component/index.js +9 -5
  43. package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
  44. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js +7 -3
  45. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js.map +1 -1
  46. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +7 -3
  47. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
  48. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js +6 -2
  49. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js.map +1 -1
  50. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js +6 -2
  51. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js.map +1 -1
  52. package/dist/features/converters/lexicalToJSX/converter/converters/link.js +13 -5
  53. package/dist/features/converters/lexicalToJSX/converter/converters/link.js.map +1 -1
  54. package/dist/features/converters/lexicalToJSX/converter/converters/list.js +38 -14
  55. package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
  56. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js +18 -6
  57. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js.map +1 -1
  58. package/dist/features/converters/lexicalToJSX/converter/converters/table.js +31 -11
  59. package/dist/features/converters/lexicalToJSX/converter/converters/table.js.map +1 -1
  60. package/dist/features/converters/lexicalToJSX/converter/converters/text.js +43 -15
  61. package/dist/features/converters/lexicalToJSX/converter/converters/text.js.map +1 -1
  62. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +31 -11
  63. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
  64. package/dist/features/converters/lexicalToJSX/converter/index.js +8 -4
  65. package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
  66. package/dist/features/debug/jsxConverter/client/plugin/index.js +13 -5
  67. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  68. package/dist/features/debug/jsxConverter/client/plugin/style.scss +12 -0
  69. package/dist/features/debug/testRecorder/client/plugin/index.js +61 -21
  70. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  71. package/dist/features/debug/testRecorder/client/plugin/index.scss +53 -0
  72. package/dist/features/debug/treeView/client/plugin/index.js +7 -3
  73. package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
  74. package/dist/features/debug/treeView/client/plugin/index.scss +80 -0
  75. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +224 -72
  76. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  77. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss +87 -0
  78. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +31 -11
  79. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  80. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.scss +11 -0
  81. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +21 -9
  82. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  83. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +25 -9
  84. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
  85. package/dist/features/experimental_table/client/plugins/TablePlugin/index.scss +233 -0
  86. package/dist/features/horizontalRule/client/plugin/index.scss +23 -0
  87. package/dist/features/indent/client/IndentPlugin.js +6 -2
  88. package/dist/features/indent/client/IndentPlugin.js.map +1 -1
  89. package/dist/features/link/client/plugins/clickableLink/index.js +6 -2
  90. package/dist/features/link/client/plugins/clickableLink/index.js.map +1 -1
  91. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +76 -24
  92. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  93. package/dist/features/link/client/plugins/floatingLinkEditor/index.js +7 -3
  94. package/dist/features/link/client/plugins/floatingLinkEditor/index.js.map +1 -1
  95. package/dist/features/link/client/plugins/floatingLinkEditor/index.scss +92 -0
  96. package/dist/features/lists/checklist/client/plugin/index.js +6 -2
  97. package/dist/features/lists/checklist/client/plugin/index.js.map +1 -1
  98. package/dist/features/lists/plugin/index.js +6 -2
  99. package/dist/features/lists/plugin/index.js.map +1 -1
  100. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +13 -5
  101. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  102. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +7 -3
  103. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  104. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.scss +16 -0
  105. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +13 -5
  106. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  107. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +7 -3
  108. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  109. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.scss +16 -0
  110. package/dist/features/relationship/client/components/RelationshipComponent.js +55 -19
  111. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  112. package/dist/features/relationship/client/components/index.scss +95 -0
  113. package/dist/features/relationship/client/drawer/index.js +18 -6
  114. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  115. package/dist/features/relationship/client/nodes/RelationshipNode.js +7 -3
  116. package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
  117. package/dist/features/relationship/client/plugins/index.js +7 -3
  118. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  119. package/dist/features/textState/feature.client.js +18 -6
  120. package/dist/features/textState/feature.client.js.map +1 -1
  121. package/dist/features/toolbars/fixed/client/Toolbar/index.js +71 -23
  122. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  123. package/dist/features/toolbars/fixed/client/Toolbar/index.scss +113 -0
  124. package/dist/features/toolbars/inline/client/Toolbar/index.js +71 -23
  125. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  126. package/dist/features/toolbars/inline/client/Toolbar/index.scss +58 -0
  127. package/dist/features/toolbars/shared/ToolbarButton/index.js +7 -3
  128. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  129. package/dist/features/toolbars/shared/ToolbarButton/index.scss +46 -0
  130. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +60 -20
  131. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  132. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +36 -12
  133. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  134. package/dist/features/toolbars/shared/ToolbarDropdown/index.scss +129 -0
  135. package/dist/features/upload/client/component/index.js +91 -31
  136. package/dist/features/upload/client/component/index.js.map +1 -1
  137. package/dist/features/upload/client/component/index.scss +191 -0
  138. package/dist/features/upload/client/component/pending/index.js +13 -5
  139. package/dist/features/upload/client/component/pending/index.js.map +1 -1
  140. package/dist/features/upload/client/drawer/index.js +18 -6
  141. package/dist/features/upload/client/drawer/index.js.map +1 -1
  142. package/dist/features/upload/client/nodes/UploadNode.js +12 -4
  143. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  144. package/dist/features/upload/client/plugin/index.js +7 -3
  145. package/dist/features/upload/client/plugin/index.js.map +1 -1
  146. package/dist/field/Diff/converters/listitem/index.js +36 -12
  147. package/dist/field/Diff/converters/listitem/index.js.map +1 -1
  148. package/dist/field/Diff/converters/listitem/index.scss +47 -0
  149. package/dist/field/Diff/converters/relationship/index.js +36 -12
  150. package/dist/field/Diff/converters/relationship/index.js.map +1 -1
  151. package/dist/field/Diff/converters/relationship/index.scss +73 -0
  152. package/dist/field/Diff/converters/unknown/index.js +30 -10
  153. package/dist/field/Diff/converters/unknown/index.js.map +1 -1
  154. package/dist/field/Diff/converters/unknown/index.scss +40 -0
  155. package/dist/field/Diff/converters/upload/index.js +59 -19
  156. package/dist/field/Diff/converters/upload/index.js.map +1 -1
  157. package/dist/field/Diff/converters/upload/index.scss +115 -0
  158. package/dist/field/Diff/index.js +7 -3
  159. package/dist/field/Diff/index.js.map +1 -1
  160. package/dist/field/Diff/index.scss +102 -0
  161. package/dist/field/Field.js +79 -27
  162. package/dist/field/Field.js.map +1 -1
  163. package/dist/field/RenderLexical/index.js +36 -12
  164. package/dist/field/RenderLexical/index.js.map +1 -1
  165. package/dist/field/index.js +19 -7
  166. package/dist/field/index.js.map +1 -1
  167. package/dist/field/index.scss +41 -0
  168. package/dist/field/rscEntry.js +7 -3
  169. package/dist/field/rscEntry.js.map +1 -1
  170. package/dist/lexical/EditorPlugin.js +13 -5
  171. package/dist/lexical/EditorPlugin.js.map +1 -1
  172. package/dist/lexical/LexicalEditor.js +162 -50
  173. package/dist/lexical/LexicalEditor.js.map +1 -1
  174. package/dist/lexical/LexicalEditor.scss +54 -0
  175. package/dist/lexical/LexicalProvider.js +49 -17
  176. package/dist/lexical/LexicalProvider.js.map +1 -1
  177. package/dist/lexical/config/client/EditorConfigProvider.js +7 -3
  178. package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
  179. package/dist/lexical/plugins/DecoratorPlugin/index.scss +13 -0
  180. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +19 -7
  181. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  182. package/dist/lexical/plugins/InsertParagraphAtEnd/index.scss +54 -0
  183. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +7 -3
  184. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  185. package/dist/lexical/plugins/SlashMenu/index.js +48 -16
  186. package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
  187. package/dist/lexical/plugins/SlashMenu/index.scss +68 -0
  188. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +19 -7
  189. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  190. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.scss +35 -0
  191. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +31 -11
  192. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  193. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.scss +80 -0
  194. package/dist/lexical/theme/EditorTheme.scss +357 -0
  195. package/dist/lexical/ui/ContentEditable.js +13 -5
  196. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  197. package/dist/lexical/ui/ContentEditable.scss +105 -0
  198. package/dist/lexical/ui/icons/AI/index.js +37 -13
  199. package/dist/lexical/ui/icons/AI/index.js.map +1 -1
  200. package/dist/lexical/ui/icons/Add/index.js +19 -7
  201. package/dist/lexical/ui/icons/Add/index.js.map +1 -1
  202. package/dist/lexical/ui/icons/AlignCenter/index.js +25 -9
  203. package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
  204. package/dist/lexical/ui/icons/AlignJustify/index.js +25 -9
  205. package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
  206. package/dist/lexical/ui/icons/AlignLeft/index.js +25 -9
  207. package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
  208. package/dist/lexical/ui/icons/AlignRight/index.js +25 -9
  209. package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
  210. package/dist/lexical/ui/icons/Block/index.js +25 -9
  211. package/dist/lexical/ui/icons/Block/index.js.map +1 -1
  212. package/dist/lexical/ui/icons/Blockquote/index.js +13 -5
  213. package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
  214. package/dist/lexical/ui/icons/Bold/index.js +13 -5
  215. package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
  216. package/dist/lexical/ui/icons/Checklist/index.js +19 -7
  217. package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
  218. package/dist/lexical/ui/icons/Code/index.js +19 -7
  219. package/dist/lexical/ui/icons/Code/index.js.map +1 -1
  220. package/dist/lexical/ui/icons/CodeBlock/index.js +13 -5
  221. package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
  222. package/dist/lexical/ui/icons/Collapse/index.js +13 -5
  223. package/dist/lexical/ui/icons/Collapse/index.js.map +1 -1
  224. package/dist/lexical/ui/icons/H1/index.js +13 -5
  225. package/dist/lexical/ui/icons/H1/index.js.map +1 -1
  226. package/dist/lexical/ui/icons/H2/index.js +13 -5
  227. package/dist/lexical/ui/icons/H2/index.js.map +1 -1
  228. package/dist/lexical/ui/icons/H3/index.js +13 -5
  229. package/dist/lexical/ui/icons/H3/index.js.map +1 -1
  230. package/dist/lexical/ui/icons/H4/index.js +13 -5
  231. package/dist/lexical/ui/icons/H4/index.js.map +1 -1
  232. package/dist/lexical/ui/icons/H5/index.js +13 -5
  233. package/dist/lexical/ui/icons/H5/index.js.map +1 -1
  234. package/dist/lexical/ui/icons/H6/index.js +13 -5
  235. package/dist/lexical/ui/icons/H6/index.js.map +1 -1
  236. package/dist/lexical/ui/icons/HorizontalRule/index.js +13 -5
  237. package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
  238. package/dist/lexical/ui/icons/IndentDecrease/index.js +31 -11
  239. package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
  240. package/dist/lexical/ui/icons/IndentIncrease/index.js +31 -11
  241. package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
  242. package/dist/lexical/ui/icons/InlineBlocks/index.js +13 -5
  243. package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -1
  244. package/dist/lexical/ui/icons/Italic/index.js +13 -5
  245. package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
  246. package/dist/lexical/ui/icons/Link/index.js +13 -5
  247. package/dist/lexical/ui/icons/Link/index.js.map +1 -1
  248. package/dist/lexical/ui/icons/Meatballs/index.js +25 -9
  249. package/dist/lexical/ui/icons/Meatballs/index.js.map +1 -1
  250. package/dist/lexical/ui/icons/OrderedList/index.js +37 -13
  251. package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
  252. package/dist/lexical/ui/icons/Relationship/index.js +37 -13
  253. package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
  254. package/dist/lexical/ui/icons/Strikethrough/index.js +19 -7
  255. package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
  256. package/dist/lexical/ui/icons/Subscript/index.js +13 -5
  257. package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
  258. package/dist/lexical/ui/icons/Superscript/index.js +13 -5
  259. package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
  260. package/dist/lexical/ui/icons/Table/index.js +13 -5
  261. package/dist/lexical/ui/icons/Table/index.js.map +1 -1
  262. package/dist/lexical/ui/icons/Text/index.js +13 -5
  263. package/dist/lexical/ui/icons/Text/index.js.map +1 -1
  264. package/dist/lexical/ui/icons/TextState/index.js +7 -3
  265. package/dist/lexical/ui/icons/TextState/index.js.map +1 -1
  266. package/dist/lexical/ui/icons/Underline/index.js +19 -7
  267. package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
  268. package/dist/lexical/ui/icons/UnorderedList/index.js +43 -15
  269. package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
  270. package/dist/lexical/ui/icons/Upload/index.js +25 -9
  271. package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
  272. package/dist/utilities/fieldsDrawer/Drawer.js +19 -7
  273. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  274. package/dist/utilities/fieldsDrawer/DrawerContent.js +19 -7
  275. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  276. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +7 -3
  277. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  278. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +7 -3
  279. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  280. package/package.json +9 -8
@@ -0,0 +1,13 @@
1
+ @import '~@payloadcms/ui/scss';
2
+
3
+ @layer payload-default {
4
+ [data-lexical-decorator='true'] {
5
+ width: fit-content;
6
+ border-radius: $style-radius-m;
7
+ }
8
+
9
+ .decorator-selected {
10
+ box-shadow: $focus-box-shadow !important;
11
+ outline: none !important;
12
+ }
13
+ }
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable jsx-a11y/click-events-have-key-events */ 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
4
  import { $createParagraphNode, $getRoot } from 'lexical';
5
5
  import React from 'react';
@@ -20,19 +20,31 @@ export const InsertParagraphAtEndPlugin = ()=>{
20
20
  });
21
21
  };
22
22
  return(// TODO: convert to button
23
- /*#__PURE__*/ _jsx("div", {
23
+ /*#__PURE__*/ _jsxDEV("div", {
24
24
  "aria-label": "Insert Paragraph",
25
25
  className: baseClass,
26
26
  onClick: onClick,
27
27
  role: "button",
28
28
  tabIndex: 0,
29
- children: /*#__PURE__*/ _jsx("div", {
29
+ children: /*#__PURE__*/ _jsxDEV("div", {
30
30
  className: `${baseClass}-inside`,
31
- children: /*#__PURE__*/ _jsx("span", {
31
+ children: /*#__PURE__*/ _jsxDEV("span", {
32
32
  children: "+"
33
- })
34
- })
35
- }));
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));
36
48
  };
37
49
 
38
50
  //# 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,KAACC;QACCC,cAAW;QACXC,WAAWb;QACXM,SAASA;QACTQ,MAAK;QACLC,UAAU;kBAEV,cAAA,KAACJ;YAAIE,WAAW,GAAGb,UAAU,OAAO,CAAC;sBACnC,cAAA,KAACgB;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","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"}
@@ -0,0 +1,54 @@
1
+ @import '~@payloadcms/ui/scss';
2
+
3
+ @layer payload-default {
4
+ .rich-text-lexical--show-gutter {
5
+ .insert-paragraph-at-end {
6
+ padding: 4px 0px 2px 40px;
7
+ }
8
+ }
9
+ .insert-paragraph-at-end {
10
+ height: 24px;
11
+ margin-top: -16px;
12
+ width: 100%;
13
+ z-index: 0;
14
+ position: relative;
15
+ padding: 4px 0px 2px 0px;
16
+
17
+ &-inside {
18
+ width: 100%;
19
+ height: 100%;
20
+ background-color: transparent;
21
+ transition: background-color 0.1s ease-in-out;
22
+ display: flex;
23
+ justify-content: center;
24
+ border-radius: $style-radius-s;
25
+ color: var(--theme-elevation-500);
26
+
27
+ span {
28
+ display: none;
29
+ justify-content: center;
30
+ align-items: center;
31
+ }
32
+ }
33
+
34
+ &:hover {
35
+ cursor: pointer;
36
+
37
+ .insert-paragraph-at-end-inside {
38
+ background-color: var(--theme-elevation-100);
39
+
40
+ span {
41
+ display: flex;
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ html[data-theme='dark'] {
48
+ .insert-paragraph-at-end:hover {
49
+ .insert-paragraph-at-end-inside {
50
+ background-color: var(--theme-elevation-50);
51
+ }
52
+ }
53
+ }
54
+ }
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
4
  import { mergeRegister } from '@lexical/utils';
5
5
  import { $getSelection, $isRangeSelection, $isTextNode, COMMAND_PRIORITY_LOW, createCommand, getDOMSelection } from 'lexical';
@@ -171,7 +171,7 @@ export function LexicalTypeaheadMenuPlugin({ anchorClassName, anchorElem, groups
171
171
  closeTypeahead,
172
172
  openTypeahead
173
173
  ]);
174
- return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/ _jsx(LexicalMenu, {
174
+ return anchorElementRef.current === null || resolution === null || editor === null ? null : /*#__PURE__*/ _jsxDEV(LexicalMenu, {
175
175
  anchorElementRef: anchorElementRef,
176
176
  close: closeTypeahead,
177
177
  editor: editor,
@@ -179,7 +179,11 @@ export function LexicalTypeaheadMenuPlugin({ anchorClassName, anchorElem, groups
179
179
  menuRenderFn: menuRenderFn,
180
180
  resolution: resolution,
181
181
  shouldSplitNodeWithQuery: true
182
- });
182
+ }, void 0, false, {
183
+ fileName: "src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx",
184
+ lineNumber: 235,
185
+ columnNumber: 5
186
+ }, this);
183
187
  }
184
188
 
185
189
  //# 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,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
4
  import { useTranslation } from '@payloadcms/ui';
5
5
  import { useCallback, useMemo, useState } from 'react';
@@ -29,7 +29,7 @@ function SlashMenuItem({ isSelected, item, onClick, onMouseEnter, ref }) {
29
29
  if (title.length > 25) {
30
30
  title = title.substring(0, 25) + '...';
31
31
  }
32
- return /*#__PURE__*/ _jsxs("button", {
32
+ return /*#__PURE__*/ _jsxDEV("button", {
33
33
  "aria-selected": isSelected,
34
34
  className: className,
35
35
  id: baseClass + '__item-' + item.key,
@@ -40,13 +40,25 @@ function SlashMenuItem({ isSelected, item, onClick, onMouseEnter, ref }) {
40
40
  tabIndex: -1,
41
41
  type: "button",
42
42
  children: [
43
- item?.Icon && /*#__PURE__*/ _jsx(item.Icon, {}),
44
- /*#__PURE__*/ _jsx("span", {
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", {
45
49
  className: `${baseClass}__item-text`,
46
50
  children: title
47
- })
51
+ }, void 0, false, {
52
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
53
+ lineNumber: 74,
54
+ columnNumber: 7
55
+ }, this)
48
56
  ]
49
- }, item.key);
57
+ }, item.key, true, {
58
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
59
+ lineNumber: 60,
60
+ columnNumber: 5
61
+ }, this);
50
62
  }
51
63
  export function SlashMenuPlugin({ anchorElem = document.body }) {
52
64
  const [editor] = useLexicalComposerContext();
@@ -139,10 +151,10 @@ export function SlashMenuPlugin({ anchorElem = document.body }) {
139
151
  i18n,
140
152
  schemaPath
141
153
  ]);
142
- return /*#__PURE__*/ _jsx(LexicalTypeaheadMenuPlugin, {
154
+ return /*#__PURE__*/ _jsxDEV(LexicalTypeaheadMenuPlugin, {
143
155
  anchorElem: anchorElem,
144
156
  groups: groups,
145
- menuRenderFn: (anchorElementRef, { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey })=>anchorElementRef.current && groups.length ? /*#__PURE__*/ ReactDOM.createPortal(/*#__PURE__*/ _jsx("div", {
157
+ menuRenderFn: (anchorElementRef, { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey })=>anchorElementRef.current && groups.length ? /*#__PURE__*/ ReactDOM.createPortal(/*#__PURE__*/ _jsxDEV("div", {
146
158
  className: baseClass,
147
159
  children: groups.map((group)=>{
148
160
  let groupTitle = group.key;
@@ -153,14 +165,18 @@ export function SlashMenuPlugin({ anchorElem = document.body }) {
153
165
  schemaPath
154
166
  }) : group.label;
155
167
  }
156
- return /*#__PURE__*/ _jsxs("div", {
168
+ return /*#__PURE__*/ _jsxDEV("div", {
157
169
  className: `${baseClass}__group ${baseClass}__group-${group.key}`,
158
170
  children: [
159
- /*#__PURE__*/ _jsx("div", {
171
+ /*#__PURE__*/ _jsxDEV("div", {
160
172
  className: `${baseClass}__group-title`,
161
173
  children: groupTitle
162
- }),
163
- group.items.map((item, oi)=>/*#__PURE__*/ _jsx(SlashMenuItem, {
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, {
164
180
  index: oi,
165
181
  isSelected: selectedItemKey === item.key,
166
182
  item: item,
@@ -177,14 +193,30 @@ export function SlashMenuPlugin({ anchorElem = document.body }) {
177
193
  current: el
178
194
  };
179
195
  }
180
- }, item.key))
196
+ }, item.key, false, {
197
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
198
+ lineNumber: 211,
199
+ columnNumber: 25
200
+ }, void 0))
181
201
  ]
182
- }, group.key);
202
+ }, group.key, true, {
203
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
204
+ lineNumber: 205,
205
+ columnNumber: 21
206
+ }, void 0);
183
207
  })
184
- }), anchorElementRef.current) : null,
208
+ }, void 0, false, {
209
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
210
+ lineNumber: 194,
211
+ columnNumber: 15
212
+ }, void 0), anchorElementRef.current) : null,
185
213
  onQueryChange: setQueryString,
186
214
  triggerFn: checkForTriggerMatch
187
- });
215
+ }, void 0, false, {
216
+ fileName: "src/lexical/plugins/SlashMenu/index.tsx",
217
+ lineNumber: 185,
218
+ columnNumber: 5
219
+ }, this);
188
220
  }
189
221
 
190
222
  //# 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":"AAAA;;AACA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AACtD,YAAYC,WAAW,QAAO;AAC9B,YAAYC,cAAc,YAAW;AASrC,SAASC,sBAAsB,QAAQ,8CAA6C;AACpF,OAAO,eAAc;AACrB,SAASC,0BAA0B,QAAQ,wCAAuC;AAClF,SAASC,mBAAmB,QAAQ,2BAA0B;AAE9D,MAAMC,YAAY;AAElB,SAASC,cAAc,EACrBC,UAAU,EACVC,IAAI,EACJC,OAAO,EACPC,YAAY,EACZC,GAAG,EAQJ;IACC,MAAM,EACJC,YAAY,EAAEC,sBAAsB,EAAEC,UAAU,EAAE,EACnD,GAAGZ;IAEJ,MAAM,EAAEa,IAAI,EAAE,GAAGnB;IAEjB,IAAIoB,YAAY,GAAGX,UAAU,OAAO,EAAEA,UAAU,OAAO,EAAEG,KAAKS,GAAG,EAAE;IACnE,IAAIV,YAAY;QACdS,aAAa,CAAC,CAAC,EAAEX,UAAU,gBAAgB,CAAC;IAC9C;IAEA,IAAIa,QAAQV,KAAKS,GAAG;IACpB,IAAIT,KAAKW,KAAK,EAAE;QACdD,QACE,OAAOV,KAAKW,KAAK,KAAK,aAClBX,KAAKW,KAAK,CAAC;YAAEN;YAAwBE;YAAMD;QAAW,KACtDN,KAAKW,KAAK;IAClB;IACA,mCAAmC;IACnC,IAAID,MAAME,MAAM,GAAG,IAAI;QACrBF,QAAQA,MAAMG,SAAS,CAAC,GAAG,MAAM;IACnC;IAEA,qBACE,MAACC;QACCC,iBAAehB;QACfS,WAAWA;QACXQ,IAAInB,YAAY,YAAYG,KAAKS,GAAG;QAEpCR,SAASA;QACTC,cAAcA;QACdC,KAAKA;QACLc,MAAK;QACLC,UAAU,CAAC;QACXC,MAAK;;YAEJnB,MAAMoB,sBAAQ,KAACpB,KAAKoB,IAAI;0BAEzB,KAACC;gBAAKb,WAAW,GAAGX,UAAU,WAAW,CAAC;0BAAGa;;;OAVxCV,KAAKS,GAAG;AAanB;AAEA,OAAO,SAASa,gBAAgB,EAC9BC,aAAaC,SAASC,IAAI,EAG3B;IACC,MAAM,CAACC,OAAO,GAAGvC;IACjB,MAAM,CAACwC,aAAaC,eAAe,GAAGrC,SAAwB;IAC9D,MAAM,EAAEsC,YAAY,EAAE,GAAGnC;IACzB,MAAM,EAAEa,IAAI,EAAE,GAAGnB;IACjB,MAAM,EACJgB,YAAY,EAAEC,sBAAsB,EAAEC,UAAU,EAAE,EACnD,GAAGZ;IAEJ,MAAMoC,uBAAuBlC,oBAAoB,KAAK;QACpDmC,WAAW;IACb;IAEA,MAAMC,kBAAkB3C,YAAY;QAClC,IAAI4C,iBAAwC,EAAE;QAE9C,KAAK,MAAMC,eAAeL,aAAaM,QAAQ,CAACC,SAAS,CAACC,aAAa,CAAE;YACvE,IAAIV,aAAa;gBACf,MAAMW,wBAAwBJ,YAAY;oBACxCR;oBACAC;gBACF;gBACAM,iBAAiBA,eAAeM,MAAM,CAACD;YACzC;QACF;QAEA,OAAOL;IACT,GAAG;QAACP;QAAQC;QAAaE,cAAcM;KAAS;IAEhD,MAAMK,SAA2BlD,QAAQ;QACvC,IAAImD,kBAAoC,EAAE;QAC1C,KAAK,MAAMC,iBAAiBb,cAAcM,SAASC,UAAUI,UAAU,EAAE,CAAE;YACzEC,gBAAgBE,IAAI,CAACD;QACvB;QAEA,IAAIf,aAAa;YACf,8BAA8B;YAC9B,oCAAoC;YACpCc,kBAAkBA,gBAAgBG,GAAG,CAAC,CAACC;gBACrC,MAAMC,gBAAgBD,MAAME,KAAK,CAACC,MAAM,CAAC,CAAChD;oBACxC,IAAIiD,YAAYjD,KAAKS,GAAG;oBACxB,IAAIT,KAAKW,KAAK,EAAE;wBACdsC,YACE,OAAOjD,KAAKW,KAAK,KAAK,aAClBX,KAAKW,KAAK,CAAC;4BAAEN;4BAAwBE;4BAAMD;wBAAW,KACtDN,KAAKW,KAAK;oBAClB;oBAEA,IAAI,IAAIuC,OAAOvB,aAAa,MAAMwB,IAAI,CAACF,YAAY;wBACjD,OAAO;oBACT;oBACA,IAAIjD,KAAKoD,QAAQ,IAAI,MAAM;wBACzB,OAAOpD,KAAKoD,QAAQ,CAACC,IAAI,CAAC,CAACC,UAAY,IAAIJ,OAAOvB,aAAa,MAAMwB,IAAI,CAACG;oBAC5E;oBACA,OAAO;gBACT;gBACA,IAAIR,cAAclC,MAAM,EAAE;oBACxB,OAAO;wBACL,GAAGiC,KAAK;wBACRE,OAAOD;oBACT;gBACF;gBACA,OAAO;YACT;YAEAL,kBAAkBA,gBAAgBO,MAAM,CAAC,CAACH,QAAUA,SAAS;YAE7D,yBAAyB;YACzB,MAAMU,oBAAoBvB;YAE1B,kCAAkC;YAClC,KAAK,MAAMwB,gBAAgBD,kBAAmB;gBAC5C,yDAAyD;gBACzD,IAAIV,QAAQJ,gBAAgBgB,IAAI,CAAC,CAACZ,QAAUA,MAAMpC,GAAG,KAAK+C,aAAa/C,GAAG;gBAC1E,IAAI,CAACoC,OAAO;oBACVA,QAAQ;wBACN,GAAGW,YAAY;wBACfT,OAAO,EAAE;oBACX;gBACF,OAAO;oBACLN,kBAAkBA,gBAAgBO,MAAM,CAAC,CAACH,QAAUA,MAAMpC,GAAG,KAAK+C,aAAa/C,GAAG;gBACpF;gBAEA,mFAAmF;gBACnF,IAAIoC,OAAOE,OAAOnC,QAAQ;oBACxBiC,MAAME,KAAK,GAAGF,MAAME,KAAK,CAACR,MAAM,CAACM,MAAME,KAAK;gBAC9C;gBACAN,gBAAgBE,IAAI,CAACE;YACvB;QACF;QAEA,OAAOJ;IACT,GAAG;QACDd;QACAE,cAAcM,SAASC,UAAUI;QACjCR;QACA3B;QACAE;QACAD;KACD;IAED,qBACE,KAACX;QACC4B,YAAYA;QACZiB,QAAQA;QACRkB,cAAc,CACZC,kBACA,EAAEC,eAAe,EAAEC,oBAAoB,EAAEC,kBAAkB,EAAE,GAE7DH,iBAAiBI,OAAO,IAAIvB,OAAO5B,MAAM,iBACrCnB,SAASuE,YAAY,eACnB,KAACC;gBAAIzD,WAAWX;0BACb2C,OAAOI,GAAG,CAAC,CAACC;oBACX,IAAIqB,aAAarB,MAAMpC,GAAG;oBAC1B,IAAIoC,MAAMlC,KAAK,IAAIN,wBAAwB;wBACzC6D,aACE,OAAOrB,MAAMlC,KAAK,KAAK,aACnBkC,MAAMlC,KAAK,CAAC;4BAAEN;4BAAwBE;4BAAMD;wBAAW,KACvDuC,MAAMlC,KAAK;oBACnB;oBAEA,qBACE,MAACsD;wBACCzD,WAAW,GAAGX,UAAU,QAAQ,EAAEA,UAAU,QAAQ,EAAEgD,MAAMpC,GAAG,EAAE;;0CAGjE,KAACwD;gCAAIzD,WAAW,GAAGX,UAAU,aAAa,CAAC;0CAAGqE;;4BAC7CrB,MAAME,KAAK,CAACH,GAAG,CAAC,CAAC5C,MAAMmE,mBACtB,KAACrE;oCACCsE,OAAOD;oCACPpE,YAAY6D,oBAAoB5D,KAAKS,GAAG;oCACxCT,MAAMA;oCAENC,SAAS;wCACP6D,mBAAmB9D,KAAKS,GAAG;wCAC3BoD,qBAAqB7D;oCACvB;oCACAE,cAAc;wCACZ4D,mBAAmB9D,KAAKS,GAAG;oCAC7B;oCACAN,KAAK,CAACkE;;wCACFrE,KAA+BG,GAAG,GAAG;4CAAE4D,SAASM;wCAAG;oCACvD;mCAVKrE,KAAKS,GAAG;;uBARZoC,MAAMpC,GAAG;gBAuBpB;gBAEFkD,iBAAiBI,OAAO,IAE1B;QAENO,eAAe1C;QACf2C,WAAWzC;;AAGjB"}
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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"}
@@ -0,0 +1,68 @@
1
+ @import '~@payloadcms/ui/scss';
2
+
3
+ @layer payload-default {
4
+ .slash-menu-popup {
5
+ background: var(--theme-input-bg);
6
+ width: 200px;
7
+ color: var(--theme-elevation-800);
8
+ border-radius: $style-radius-m;
9
+ list-style: none;
10
+ font-family: var(--font-body);
11
+ max-height: 300px;
12
+ overflow-y: auto;
13
+ z-index: 10;
14
+ position: absolute;
15
+ box-shadow:
16
+ 0px 1px 2px 1px rgba(0, 0, 0, 0.1),
17
+ 0px 4px 16px 0px rgba(0, 0, 0, 0.2),
18
+ 0px -4px 8px 0px rgba(0, 0, 0, 0.1);
19
+
20
+ &__group {
21
+ padding-bottom: 8px;
22
+ }
23
+
24
+ &__group-title {
25
+ padding-left: 10px;
26
+ color: var(--theme-elevation-600);
27
+ font-size: 10px;
28
+ }
29
+
30
+ &__item {
31
+ all: unset;
32
+ padding-left: 12px;
33
+ font-size: 13px;
34
+ box-sizing: border-box;
35
+ background: none;
36
+ border: none;
37
+ color: var(--theme-elevation-900);
38
+ display: flex;
39
+ align-items: center;
40
+ height: 30px;
41
+ width: 100%;
42
+ cursor: pointer;
43
+
44
+ &--selected {
45
+ background: var(--theme-elevation-100);
46
+ }
47
+
48
+ &-text {
49
+ margin-left: 6px;
50
+ overflow: hidden;
51
+ white-space: nowrap;
52
+ text-overflow: ellipsis;
53
+ }
54
+
55
+ .icon {
56
+ color: var(--theme-elevation-500);
57
+ }
58
+ }
59
+ }
60
+
61
+ html[data-theme='light'] {
62
+ .slash-menu-popup {
63
+ box-shadow:
64
+ 0px 1px 2px 1px rgba(0, 0, 0, 0.05),
65
+ 0px 4px 8px 0px rgba(0, 0, 0, 0.1);
66
+ }
67
+ }
68
+ }
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
4
  import { $createParagraphNode, isHTMLElement } from 'lexical';
5
5
  import * as React from 'react';
@@ -135,8 +135,8 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
135
135
  editor,
136
136
  hoveredElement
137
137
  ]);
138
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsx(React.Fragment, {
139
- children: /*#__PURE__*/ _jsx("button", {
138
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxDEV(React.Fragment, {
139
+ children: /*#__PURE__*/ _jsxDEV("button", {
140
140
  "aria-label": "Add block",
141
141
  className: "icon add-block-menu",
142
142
  onClick: (event)=>{
@@ -144,11 +144,23 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
144
144
  },
145
145
  ref: menuRef,
146
146
  type: "button",
147
- children: /*#__PURE__*/ _jsx("div", {
147
+ children: /*#__PURE__*/ _jsxDEV("div", {
148
148
  className: isEditable ? 'icon' : ''
149
- })
150
- })
151
- }), anchorElem);
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);
152
164
  }
153
165
  export function AddBlockHandlePlugin({ anchorElem = document.body }) {
154
166
  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":"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"}
@@ -0,0 +1,35 @@
1
+ @import '~@payloadcms/ui/scss';
2
+
3
+ @layer payload-default {
4
+ .add-block-menu {
5
+ all: unset; // reset all default button styles
6
+ border-radius: $style-radius-m;
7
+ padding: 0;
8
+ cursor: pointer;
9
+ opacity: 0;
10
+ position: absolute;
11
+ left: 0;
12
+ top: 0;
13
+ will-change: transform;
14
+
15
+ &:hover {
16
+ background-color: var(--theme-elevation-100);
17
+ .icon {
18
+ opacity: 1;
19
+ }
20
+ }
21
+
22
+ .icon {
23
+ width: 18px;
24
+ height: 24px;
25
+ opacity: 0.3;
26
+ background-image: url(../../../ui/icons/Add/index.svg);
27
+ }
28
+
29
+ html[data-theme='dark'] & {
30
+ .icon {
31
+ background-image: url(../../../ui/icons/Add/light.svg);
32
+ }
33
+ }
34
+ }
35
+ }