@payloadcms/richtext-lexical 3.0.0-beta.35 → 3.0.0-beta.37

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 (406) hide show
  1. package/dist/cell/index.d.ts +2 -0
  2. package/dist/cell/index.d.ts.map +1 -1
  3. package/dist/cell/index.js +24 -15
  4. package/dist/cell/index.js.map +1 -1
  5. package/dist/field/Field.d.ts.map +1 -1
  6. package/dist/field/Field.js +66 -47
  7. package/dist/field/Field.js.map +1 -1
  8. package/dist/field/features/align/feature.client.d.ts.map +1 -1
  9. package/dist/field/features/align/feature.client.js +12 -4
  10. package/dist/field/features/align/feature.client.js.map +1 -1
  11. package/dist/field/features/align/feature.server.d.ts.map +1 -1
  12. package/dist/field/features/align/feature.server.js +2 -0
  13. package/dist/field/features/align/feature.server.js.map +1 -1
  14. package/dist/field/features/align/i18n.d.ts +3 -0
  15. package/dist/field/features/align/i18n.d.ts.map +1 -0
  16. package/dist/field/features/align/i18n.js +196 -0
  17. package/dist/field/features/align/i18n.js.map +1 -0
  18. package/dist/field/features/blockquote/feature.client.d.ts.map +1 -1
  19. package/dist/field/features/blockquote/feature.client.js +22 -21
  20. package/dist/field/features/blockquote/feature.client.js.map +1 -1
  21. package/dist/field/features/blockquote/feature.server.d.ts.map +1 -1
  22. package/dist/field/features/blockquote/feature.server.js +2 -0
  23. package/dist/field/features/blockquote/feature.server.js.map +1 -1
  24. package/dist/field/features/blockquote/i18n.d.ts +3 -0
  25. package/dist/field/features/blockquote/i18n.d.ts.map +1 -0
  26. package/dist/field/features/blockquote/i18n.js +100 -0
  27. package/dist/field/features/blockquote/i18n.js.map +1 -0
  28. package/dist/field/features/blocks/component/BlockContent.js +62 -45
  29. package/dist/field/features/blocks/component/BlockContent.js.map +1 -1
  30. package/dist/field/features/blocks/component/index.js +38 -28
  31. package/dist/field/features/blocks/component/index.js.map +1 -1
  32. package/dist/field/features/blocks/drawer/index.js +2 -1
  33. package/dist/field/features/blocks/drawer/index.js.map +1 -1
  34. package/dist/field/features/blocks/feature.client.d.ts.map +1 -1
  35. package/dist/field/features/blocks/feature.client.js +3 -1
  36. package/dist/field/features/blocks/feature.client.js.map +1 -1
  37. package/dist/field/features/blocks/feature.server.d.ts.map +1 -1
  38. package/dist/field/features/blocks/feature.server.js +2 -0
  39. package/dist/field/features/blocks/feature.server.js.map +1 -1
  40. package/dist/field/features/blocks/i18n.d.ts +3 -0
  41. package/dist/field/features/blocks/i18n.d.ts.map +1 -0
  42. package/dist/field/features/blocks/i18n.js +100 -0
  43. package/dist/field/features/blocks/i18n.js.map +1 -0
  44. package/dist/field/features/blocks/nodes/BlocksNode.d.ts +1 -1
  45. package/dist/field/features/blocks/nodes/BlocksNode.d.ts.map +1 -1
  46. package/dist/field/features/blocks/nodes/BlocksNode.js +2 -1
  47. package/dist/field/features/blocks/nodes/BlocksNode.js.map +1 -1
  48. package/dist/field/features/blocks/plugin/index.js +2 -1
  49. package/dist/field/features/blocks/plugin/index.js.map +1 -1
  50. package/dist/field/features/blocks/populationPromise.js +1 -1
  51. package/dist/field/features/blocks/populationPromise.js.map +1 -1
  52. package/dist/field/features/converters/html/field/index.d.ts.map +1 -1
  53. package/dist/field/features/converters/html/field/index.js +30 -2
  54. package/dist/field/features/converters/html/field/index.js.map +1 -1
  55. package/dist/field/features/debug/testRecorder/plugin/index.js +65 -39
  56. package/dist/field/features/debug/testRecorder/plugin/index.js.map +1 -1
  57. package/dist/field/features/debug/treeView/plugin/index.js +2 -1
  58. package/dist/field/features/debug/treeView/plugin/index.js.map +1 -1
  59. package/dist/field/features/heading/feature.client.d.ts.map +1 -1
  60. package/dist/field/features/heading/feature.client.js +26 -21
  61. package/dist/field/features/heading/feature.client.js.map +1 -1
  62. package/dist/field/features/heading/feature.server.d.ts.map +1 -1
  63. package/dist/field/features/heading/feature.server.js +2 -0
  64. package/dist/field/features/heading/feature.server.js.map +1 -1
  65. package/dist/field/features/heading/i18n.d.ts +3 -0
  66. package/dist/field/features/heading/i18n.d.ts.map +1 -0
  67. package/dist/field/features/heading/i18n.js +100 -0
  68. package/dist/field/features/heading/i18n.js.map +1 -0
  69. package/dist/field/features/horizontalRule/feature.client.d.ts.map +1 -1
  70. package/dist/field/features/horizontalRule/feature.client.js +21 -20
  71. package/dist/field/features/horizontalRule/feature.client.js.map +1 -1
  72. package/dist/field/features/horizontalRule/feature.server.d.ts.map +1 -1
  73. package/dist/field/features/horizontalRule/feature.server.js +2 -0
  74. package/dist/field/features/horizontalRule/feature.server.js.map +1 -1
  75. package/dist/field/features/horizontalRule/i18n.d.ts +3 -0
  76. package/dist/field/features/horizontalRule/i18n.d.ts.map +1 -0
  77. package/dist/field/features/horizontalRule/i18n.js +100 -0
  78. package/dist/field/features/horizontalRule/i18n.js.map +1 -0
  79. package/dist/field/features/horizontalRule/nodes/HorizontalRuleNode.js +2 -1
  80. package/dist/field/features/horizontalRule/nodes/HorizontalRuleNode.js.map +1 -1
  81. package/dist/field/features/indent/feature.client.d.ts.map +1 -1
  82. package/dist/field/features/indent/feature.client.js +6 -2
  83. package/dist/field/features/indent/feature.client.js.map +1 -1
  84. package/dist/field/features/indent/feature.server.d.ts.map +1 -1
  85. package/dist/field/features/indent/feature.server.js +2 -0
  86. package/dist/field/features/indent/feature.server.js.map +1 -1
  87. package/dist/field/features/indent/i18n.d.ts +3 -0
  88. package/dist/field/features/indent/i18n.d.ts.map +1 -0
  89. package/dist/field/features/indent/i18n.js +132 -0
  90. package/dist/field/features/indent/i18n.js.map +1 -0
  91. package/dist/field/features/link/drawer/index.js +30 -22
  92. package/dist/field/features/link/drawer/index.js.map +1 -1
  93. package/dist/field/features/link/feature.client.d.ts.map +1 -1
  94. package/dist/field/features/link/feature.client.js +7 -1
  95. package/dist/field/features/link/feature.client.js.map +1 -1
  96. package/dist/field/features/link/feature.server.d.ts.map +1 -1
  97. package/dist/field/features/link/feature.server.js +10 -2
  98. package/dist/field/features/link/feature.server.js.map +1 -1
  99. package/dist/field/features/link/i18n.d.ts +3 -0
  100. package/dist/field/features/link/i18n.d.ts.map +1 -0
  101. package/dist/field/features/link/i18n.js +100 -0
  102. package/dist/field/features/link/i18n.js.map +1 -0
  103. package/dist/field/features/link/markdownTransformer.d.ts +6 -0
  104. package/dist/field/features/link/markdownTransformer.d.ts.map +1 -0
  105. package/dist/field/features/link/markdownTransformer.js +50 -0
  106. package/dist/field/features/link/markdownTransformer.js.map +1 -0
  107. package/dist/field/features/link/plugins/clickableLink/index.js +2 -1
  108. package/dist/field/features/link/plugins/clickableLink/index.js.map +1 -1
  109. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  110. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js +88 -70
  111. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  112. package/dist/field/features/link/plugins/floatingLinkEditor/index.js +2 -1
  113. package/dist/field/features/link/plugins/floatingLinkEditor/index.js.map +1 -1
  114. package/dist/field/features/link/populationPromise.js +1 -1
  115. package/dist/field/features/link/populationPromise.js.map +1 -1
  116. package/dist/field/features/lists/checklist/feature.client.d.ts.map +1 -1
  117. package/dist/field/features/lists/checklist/feature.client.js +21 -20
  118. package/dist/field/features/lists/checklist/feature.client.js.map +1 -1
  119. package/dist/field/features/lists/checklist/feature.server.d.ts.map +1 -1
  120. package/dist/field/features/lists/checklist/feature.server.js +2 -0
  121. package/dist/field/features/lists/checklist/feature.server.js.map +1 -1
  122. package/dist/field/features/lists/checklist/i18n.d.ts +3 -0
  123. package/dist/field/features/lists/checklist/i18n.d.ts.map +1 -0
  124. package/dist/field/features/lists/checklist/i18n.js +100 -0
  125. package/dist/field/features/lists/checklist/i18n.js.map +1 -0
  126. package/dist/field/features/lists/checklist/plugin/index.js +2 -1
  127. package/dist/field/features/lists/checklist/plugin/index.js.map +1 -1
  128. package/dist/field/features/lists/orderedList/feature.client.d.ts.map +1 -1
  129. package/dist/field/features/lists/orderedList/feature.client.js +19 -18
  130. package/dist/field/features/lists/orderedList/feature.client.js.map +1 -1
  131. package/dist/field/features/lists/orderedList/feature.server.d.ts.map +1 -1
  132. package/dist/field/features/lists/orderedList/feature.server.js +3 -1
  133. package/dist/field/features/lists/orderedList/feature.server.js.map +1 -1
  134. package/dist/field/features/lists/orderedList/i18n.d.ts +3 -0
  135. package/dist/field/features/lists/orderedList/i18n.d.ts.map +1 -0
  136. package/dist/field/features/lists/orderedList/i18n.js +100 -0
  137. package/dist/field/features/lists/orderedList/i18n.js.map +1 -0
  138. package/dist/field/features/lists/plugin/index.js +2 -1
  139. package/dist/field/features/lists/plugin/index.js.map +1 -1
  140. package/dist/field/features/lists/shared/slashMenuListGroup.d.ts +3 -0
  141. package/dist/field/features/lists/shared/slashMenuListGroup.d.ts.map +1 -0
  142. package/dist/field/features/lists/shared/slashMenuListGroup.js +11 -0
  143. package/dist/field/features/lists/shared/slashMenuListGroup.js.map +1 -0
  144. package/dist/field/features/lists/unorderedList/feature.client.d.ts.map +1 -1
  145. package/dist/field/features/lists/unorderedList/feature.client.js +19 -18
  146. package/dist/field/features/lists/unorderedList/feature.client.js.map +1 -1
  147. package/dist/field/features/lists/unorderedList/feature.server.d.ts.map +1 -1
  148. package/dist/field/features/lists/unorderedList/feature.server.js +2 -0
  149. package/dist/field/features/lists/unorderedList/feature.server.js.map +1 -1
  150. package/dist/field/features/lists/unorderedList/i18n.d.ts +3 -0
  151. package/dist/field/features/lists/unorderedList/i18n.d.ts.map +1 -0
  152. package/dist/field/features/lists/unorderedList/i18n.js +100 -0
  153. package/dist/field/features/lists/unorderedList/i18n.js.map +1 -0
  154. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +9 -1
  155. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  156. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts +1 -1
  157. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
  158. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +2 -1
  159. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  160. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +9 -1
  161. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  162. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts +1 -1
  163. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
  164. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +2 -1
  165. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  166. package/dist/field/features/paragraph/feature.client.d.ts.map +1 -1
  167. package/dist/field/features/paragraph/feature.client.js +24 -23
  168. package/dist/field/features/paragraph/feature.client.js.map +1 -1
  169. package/dist/field/features/paragraph/feature.server.d.ts.map +1 -1
  170. package/dist/field/features/paragraph/feature.server.js +2 -0
  171. package/dist/field/features/paragraph/feature.server.js.map +1 -1
  172. package/dist/field/features/paragraph/i18n.d.ts +3 -0
  173. package/dist/field/features/paragraph/i18n.d.ts.map +1 -0
  174. package/dist/field/features/paragraph/i18n.js +132 -0
  175. package/dist/field/features/paragraph/i18n.js.map +1 -0
  176. package/dist/field/features/relationship/drawer/index.js +10 -2
  177. package/dist/field/features/relationship/drawer/index.js.map +1 -1
  178. package/dist/field/features/relationship/feature.client.d.ts.map +1 -1
  179. package/dist/field/features/relationship/feature.client.js +23 -22
  180. package/dist/field/features/relationship/feature.client.js.map +1 -1
  181. package/dist/field/features/relationship/feature.server.d.ts.map +1 -1
  182. package/dist/field/features/relationship/feature.server.js +2 -0
  183. package/dist/field/features/relationship/feature.server.js.map +1 -1
  184. package/dist/field/features/relationship/i18n.d.ts +3 -0
  185. package/dist/field/features/relationship/i18n.d.ts.map +1 -0
  186. package/dist/field/features/relationship/i18n.js +100 -0
  187. package/dist/field/features/relationship/i18n.js.map +1 -0
  188. package/dist/field/features/relationship/nodes/RelationshipNode.d.ts +1 -1
  189. package/dist/field/features/relationship/nodes/RelationshipNode.d.ts.map +1 -1
  190. package/dist/field/features/relationship/nodes/RelationshipNode.js +2 -1
  191. package/dist/field/features/relationship/nodes/RelationshipNode.js.map +1 -1
  192. package/dist/field/features/relationship/nodes/components/RelationshipComponent.js +64 -44
  193. package/dist/field/features/relationship/nodes/components/RelationshipComponent.js.map +1 -1
  194. package/dist/field/features/relationship/plugins/index.js +2 -1
  195. package/dist/field/features/relationship/plugins/index.js.map +1 -1
  196. package/dist/field/features/shared/slashMenu/basicGroup.d.ts +3 -0
  197. package/dist/field/features/shared/slashMenu/basicGroup.d.ts.map +1 -0
  198. package/dist/field/features/shared/slashMenu/basicGroup.js +11 -0
  199. package/dist/field/features/shared/slashMenu/basicGroup.js.map +1 -0
  200. package/dist/field/features/toolbars/fixed/Toolbar/index.js +60 -55
  201. package/dist/field/features/toolbars/fixed/Toolbar/index.js.map +1 -1
  202. package/dist/field/features/toolbars/fixed/Toolbar/index.scss +16 -2
  203. package/dist/field/features/toolbars/inline/Toolbar/index.js +57 -49
  204. package/dist/field/features/toolbars/inline/Toolbar/index.js.map +1 -1
  205. package/dist/field/features/toolbars/shared/ToolbarButton/index.d.ts +1 -1
  206. package/dist/field/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
  207. package/dist/field/features/toolbars/shared/ToolbarButton/index.js +5 -3
  208. package/dist/field/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  209. package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.d.ts.map +1 -1
  210. package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.js +54 -35
  211. package/dist/field/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  212. package/dist/field/features/toolbars/shared/ToolbarDropdown/index.d.ts +1 -1
  213. package/dist/field/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
  214. package/dist/field/features/toolbars/shared/ToolbarDropdown/index.js +25 -22
  215. package/dist/field/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  216. package/dist/field/features/toolbars/types.d.ts +1 -1
  217. package/dist/field/features/toolbars/types.d.ts.map +1 -1
  218. package/dist/field/features/toolbars/types.js.map +1 -1
  219. package/dist/field/features/types.d.ts +21 -2
  220. package/dist/field/features/types.d.ts.map +1 -1
  221. package/dist/field/features/types.js.map +1 -1
  222. package/dist/field/features/upload/component/ExtraFieldsDrawer/index.js +30 -22
  223. package/dist/field/features/upload/component/ExtraFieldsDrawer/index.js.map +1 -1
  224. package/dist/field/features/upload/component/index.js +104 -71
  225. package/dist/field/features/upload/component/index.js.map +1 -1
  226. package/dist/field/features/upload/drawer/index.js +8 -4
  227. package/dist/field/features/upload/drawer/index.js.map +1 -1
  228. package/dist/field/features/upload/feature.client.d.ts.map +1 -1
  229. package/dist/field/features/upload/feature.client.js +26 -25
  230. package/dist/field/features/upload/feature.client.js.map +1 -1
  231. package/dist/field/features/upload/feature.server.d.ts.map +1 -1
  232. package/dist/field/features/upload/feature.server.js +2 -0
  233. package/dist/field/features/upload/feature.server.js.map +1 -1
  234. package/dist/field/features/upload/i18n.d.ts +3 -0
  235. package/dist/field/features/upload/i18n.d.ts.map +1 -0
  236. package/dist/field/features/upload/i18n.js +100 -0
  237. package/dist/field/features/upload/i18n.js.map +1 -0
  238. package/dist/field/features/upload/nodes/UploadNode.d.ts +1 -1
  239. package/dist/field/features/upload/nodes/UploadNode.d.ts.map +1 -1
  240. package/dist/field/features/upload/nodes/UploadNode.js +2 -1
  241. package/dist/field/features/upload/nodes/UploadNode.js.map +1 -1
  242. package/dist/field/features/upload/plugin/index.js +2 -1
  243. package/dist/field/features/upload/plugin/index.js.map +1 -1
  244. package/dist/field/features/upload/populationPromise.js +1 -1
  245. package/dist/field/features/upload/populationPromise.js.map +1 -1
  246. package/dist/field/index.d.ts +2 -0
  247. package/dist/field/index.d.ts.map +1 -1
  248. package/dist/field/index.js +29 -21
  249. package/dist/field/index.js.map +1 -1
  250. package/dist/field/index.scss +0 -19
  251. package/dist/field/lexical/EditorFocusProvider.d.ts +1 -2
  252. package/dist/field/lexical/EditorFocusProvider.d.ts.map +1 -1
  253. package/dist/field/lexical/EditorFocusProvider.js +5 -3
  254. package/dist/field/lexical/EditorFocusProvider.js.map +1 -1
  255. package/dist/field/lexical/EditorPlugin.js +3 -2
  256. package/dist/field/lexical/EditorPlugin.js.map +1 -1
  257. package/dist/field/lexical/LexicalEditor.d.ts.map +1 -1
  258. package/dist/field/lexical/LexicalEditor.js +115 -81
  259. package/dist/field/lexical/LexicalEditor.js.map +1 -1
  260. package/dist/field/lexical/LexicalEditor.scss +10 -1
  261. package/dist/field/lexical/LexicalProvider.js +16 -10
  262. package/dist/field/lexical/LexicalProvider.js.map +1 -1
  263. package/dist/field/lexical/config/client/EditorConfigProvider.js +5 -3
  264. package/dist/field/lexical/config/client/EditorConfigProvider.js.map +1 -1
  265. package/dist/field/lexical/config/client/sanitize.d.ts +2 -1
  266. package/dist/field/lexical/config/client/sanitize.d.ts.map +1 -1
  267. package/dist/field/lexical/config/client/sanitize.js +2 -1
  268. package/dist/field/lexical/config/client/sanitize.js.map +1 -1
  269. package/dist/field/lexical/config/server/sanitize.d.ts.map +1 -1
  270. package/dist/field/lexical/config/server/sanitize.js +11 -0
  271. package/dist/field/lexical/config/server/sanitize.js.map +1 -1
  272. package/dist/field/lexical/config/types.d.ts +2 -0
  273. package/dist/field/lexical/config/types.d.ts.map +1 -1
  274. package/dist/field/lexical/config/types.js.map +1 -1
  275. package/dist/field/lexical/plugins/MarkdownShortcut/index.js +2 -1
  276. package/dist/field/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
  277. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts +1 -1
  278. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts.map +1 -1
  279. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  280. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts +1 -1
  281. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts.map +1 -1
  282. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +2 -1
  283. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  284. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts +2 -2
  285. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts.map +1 -1
  286. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js.map +1 -1
  287. package/dist/field/lexical/plugins/SlashMenu/index.js +51 -40
  288. package/dist/field/lexical/plugins/SlashMenu/index.js.map +1 -1
  289. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.d.ts +2 -2
  290. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.d.ts.map +1 -1
  291. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.js +38 -119
  292. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  293. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.scss +2 -2
  294. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.d.ts +1 -1
  295. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.d.ts.map +1 -1
  296. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.js.map +1 -1
  297. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts +2 -2
  298. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  299. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js +102 -58
  300. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  301. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.scss +12 -3
  302. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts +8 -1
  303. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.d.ts.map +1 -1
  304. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js +73 -25
  305. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/setTargetLine.js.map +1 -1
  306. package/dist/field/lexical/plugins/handles/utils/calculateDistanceFromScrollerElem.d.ts +5 -0
  307. package/dist/field/lexical/plugins/handles/utils/calculateDistanceFromScrollerElem.d.ts.map +1 -0
  308. package/dist/field/lexical/plugins/handles/utils/calculateDistanceFromScrollerElem.js +21 -0
  309. package/dist/field/lexical/plugins/handles/utils/calculateDistanceFromScrollerElem.js.map +1 -0
  310. package/dist/field/lexical/plugins/handles/{DraggableBlockPlugin → utils}/getNodeCloseToPoint.d.ts +4 -0
  311. package/dist/field/lexical/plugins/handles/utils/getNodeCloseToPoint.d.ts.map +1 -0
  312. package/dist/field/lexical/plugins/handles/{DraggableBlockPlugin → utils}/getNodeCloseToPoint.js +2 -14
  313. package/dist/field/lexical/plugins/handles/utils/getNodeCloseToPoint.js.map +1 -0
  314. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.d.ts.map +1 -1
  315. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.js +4 -2
  316. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.js.map +1 -1
  317. package/dist/field/lexical/theme/EditorTheme.scss +5 -0
  318. package/dist/field/lexical/ui/ContentEditable.d.ts +1 -1
  319. package/dist/field/lexical/ui/ContentEditable.d.ts.map +1 -1
  320. package/dist/field/lexical/ui/ContentEditable.js +2 -1
  321. package/dist/field/lexical/ui/ContentEditable.js.map +1 -1
  322. package/dist/field/lexical/ui/ContentEditable.scss +50 -2
  323. package/dist/field/lexical/ui/icons/AI/index.js +26 -17
  324. package/dist/field/lexical/ui/icons/AI/index.js.map +1 -1
  325. package/dist/field/lexical/ui/icons/Add/index.js +14 -9
  326. package/dist/field/lexical/ui/icons/Add/index.js.map +1 -1
  327. package/dist/field/lexical/ui/icons/Add/light.svg +4 -0
  328. package/dist/field/lexical/ui/icons/AlignCenter/index.js +21 -15
  329. package/dist/field/lexical/ui/icons/AlignCenter/index.js.map +1 -1
  330. package/dist/field/lexical/ui/icons/AlignJustify/index.js +21 -15
  331. package/dist/field/lexical/ui/icons/AlignJustify/index.js.map +1 -1
  332. package/dist/field/lexical/ui/icons/AlignLeft/index.js +21 -15
  333. package/dist/field/lexical/ui/icons/AlignLeft/index.js.map +1 -1
  334. package/dist/field/lexical/ui/icons/AlignRight/index.js +21 -15
  335. package/dist/field/lexical/ui/icons/AlignRight/index.js.map +1 -1
  336. package/dist/field/lexical/ui/icons/Block/index.js +30 -24
  337. package/dist/field/lexical/ui/icons/Block/index.js.map +1 -1
  338. package/dist/field/lexical/ui/icons/Blockquote/index.js +8 -6
  339. package/dist/field/lexical/ui/icons/Blockquote/index.js.map +1 -1
  340. package/dist/field/lexical/ui/icons/Bold/index.js +8 -6
  341. package/dist/field/lexical/ui/icons/Bold/index.js.map +1 -1
  342. package/dist/field/lexical/ui/icons/Checklist/index.js +19 -14
  343. package/dist/field/lexical/ui/icons/Checklist/index.js.map +1 -1
  344. package/dist/field/lexical/ui/icons/Code/index.js +14 -9
  345. package/dist/field/lexical/ui/icons/Code/index.js.map +1 -1
  346. package/dist/field/lexical/ui/icons/CodeBlock/index.js +14 -9
  347. package/dist/field/lexical/ui/icons/CodeBlock/index.js.map +1 -1
  348. package/dist/field/lexical/ui/icons/DraggableBlock/light.svg +9 -0
  349. package/dist/field/lexical/ui/icons/H1/index.js +8 -6
  350. package/dist/field/lexical/ui/icons/H1/index.js.map +1 -1
  351. package/dist/field/lexical/ui/icons/H2/index.js +8 -6
  352. package/dist/field/lexical/ui/icons/H2/index.js.map +1 -1
  353. package/dist/field/lexical/ui/icons/H3/index.js +8 -6
  354. package/dist/field/lexical/ui/icons/H3/index.js.map +1 -1
  355. package/dist/field/lexical/ui/icons/H4/index.js +8 -6
  356. package/dist/field/lexical/ui/icons/H4/index.js.map +1 -1
  357. package/dist/field/lexical/ui/icons/H5/index.js +8 -6
  358. package/dist/field/lexical/ui/icons/H5/index.js.map +1 -1
  359. package/dist/field/lexical/ui/icons/H6/index.js +8 -6
  360. package/dist/field/lexical/ui/icons/H6/index.js.map +1 -1
  361. package/dist/field/lexical/ui/icons/HorizontalRule/index.js +11 -9
  362. package/dist/field/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
  363. package/dist/field/lexical/ui/icons/IndentDecrease/index.js +25 -18
  364. package/dist/field/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
  365. package/dist/field/lexical/ui/icons/IndentIncrease/index.js +25 -18
  366. package/dist/field/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
  367. package/dist/field/lexical/ui/icons/Italic/index.js +8 -6
  368. package/dist/field/lexical/ui/icons/Italic/index.js.map +1 -1
  369. package/dist/field/lexical/ui/icons/Link/index.js +26 -17
  370. package/dist/field/lexical/ui/icons/Link/index.js.map +1 -1
  371. package/dist/field/lexical/ui/icons/OrderedList/index.js +29 -21
  372. package/dist/field/lexical/ui/icons/OrderedList/index.js.map +1 -1
  373. package/dist/field/lexical/ui/icons/Relationship/index.js +26 -17
  374. package/dist/field/lexical/ui/icons/Relationship/index.js.map +1 -1
  375. package/dist/field/lexical/ui/icons/Strikethrough/index.js +14 -9
  376. package/dist/field/lexical/ui/icons/Strikethrough/index.js.map +1 -1
  377. package/dist/field/lexical/ui/icons/Subscript/index.js +8 -6
  378. package/dist/field/lexical/ui/icons/Subscript/index.js.map +1 -1
  379. package/dist/field/lexical/ui/icons/Superscript/index.js +8 -6
  380. package/dist/field/lexical/ui/icons/Superscript/index.js.map +1 -1
  381. package/dist/field/lexical/ui/icons/Text/index.js +8 -6
  382. package/dist/field/lexical/ui/icons/Text/index.js.map +1 -1
  383. package/dist/field/lexical/ui/icons/Underline/index.js +14 -9
  384. package/dist/field/lexical/ui/icons/Underline/index.js.map +1 -1
  385. package/dist/field/lexical/ui/icons/UnorderedList/index.js +45 -36
  386. package/dist/field/lexical/ui/icons/UnorderedList/index.js.map +1 -1
  387. package/dist/field/lexical/ui/icons/Upload/index.js +24 -18
  388. package/dist/field/lexical/ui/icons/Upload/index.js.map +1 -1
  389. package/dist/field/lexical/utils/url.d.ts.map +1 -1
  390. package/dist/field/lexical/utils/url.js +10 -2
  391. package/dist/field/lexical/utils/url.js.map +1 -1
  392. package/dist/generateComponentMap.js +8 -8
  393. package/dist/generateComponentMap.js.map +1 -1
  394. package/dist/i18n.d.ts +3 -0
  395. package/dist/i18n.d.ts.map +1 -0
  396. package/dist/i18n.js +164 -0
  397. package/dist/i18n.js.map +1 -0
  398. package/dist/index.d.ts.map +1 -1
  399. package/dist/index.js +13 -0
  400. package/dist/index.js.map +1 -1
  401. package/dist/types.d.ts +7 -0
  402. package/dist/types.d.ts.map +1 -1
  403. package/dist/types.js.map +1 -1
  404. package/package.json +20 -15
  405. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.d.ts.map +0 -1
  406. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.js.map +0 -1
@@ -1,23 +1,21 @@
1
1
  'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
3
- import { $createParagraphNode, $getNodeByKey } from 'lexical';
4
+ import { $createParagraphNode } from 'lexical';
4
5
  import * as React from 'react';
5
6
  import { useCallback, useEffect, useRef, useState } from 'react';
6
7
  import { createPortal } from 'react-dom';
8
+ import { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js';
7
9
  import { isHTMLElement } from '../../../utils/guard.js';
8
10
  import { Point } from '../../../utils/point.js';
9
- import { Rect } from '../../../utils/rect.js';
10
11
  import { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js';
11
- import { getCollapsedMargins } from '../utils/getCollapsedMargins.js';
12
+ import { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js';
13
+ import { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js';
12
14
  import { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js';
13
15
  import { isOnHandleElement } from '../utils/isOnHandleElement.js';
14
16
  import { setHandlePosition } from '../utils/setHandlePosition.js';
15
17
  import './index.scss';
16
- const SPACE = -24;
17
18
  const ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu';
18
- const Downward = 1;
19
- const Upward = -1;
20
- const Indeterminate = 0;
21
19
  let prevIndex = Infinity;
22
20
  function getCurrentIndex(keysLength) {
23
21
  if (keysLength === 0) {
@@ -28,80 +26,10 @@ function getCurrentIndex(keysLength) {
28
26
  }
29
27
  return Math.floor(keysLength / 2);
30
28
  }
31
- function getBlockElement(anchorElem, editor, event, useEdgeAsDefault = false, horizontalOffset = 0) {
32
- const anchorElementRect = anchorElem.getBoundingClientRect();
33
- const topLevelNodeKeys = getTopLevelNodeKeys(editor);
34
- let blockElem = null;
35
- let blockNode = null;
36
- // Return null if matching block element is the first or last node
37
- editor.getEditorState().read(()=>{
38
- if (useEdgeAsDefault) {
39
- const [firstNode, lastNode] = [
40
- editor.getElementByKey(topLevelNodeKeys[0]),
41
- editor.getElementByKey(topLevelNodeKeys[topLevelNodeKeys.length - 1])
42
- ];
43
- const [firstNodeRect, lastNodeRect] = [
44
- firstNode?.getBoundingClientRect(),
45
- lastNode?.getBoundingClientRect()
46
- ];
47
- if (firstNodeRect && lastNodeRect) {
48
- if (event.y < firstNodeRect.top) {
49
- blockElem = firstNode;
50
- } else if (event.y > lastNodeRect.bottom) {
51
- blockElem = lastNode;
52
- }
53
- if (blockElem) {
54
- return {
55
- blockElem: null
56
- };
57
- }
58
- }
59
- }
60
- // Find matching block element
61
- let index = getCurrentIndex(topLevelNodeKeys.length);
62
- let direction = Indeterminate;
63
- while(index >= 0 && index < topLevelNodeKeys.length){
64
- const key = topLevelNodeKeys[index];
65
- const elem = editor.getElementByKey(key);
66
- if (elem === null) {
67
- break;
68
- }
69
- const point = new Point(event.x + horizontalOffset, event.y);
70
- const domRect = Rect.fromDOM(elem);
71
- const { marginBottom, marginTop } = getCollapsedMargins(elem);
72
- const rect = domRect.generateNewRect({
73
- bottom: domRect.bottom + marginBottom,
74
- left: anchorElementRect.left,
75
- right: anchorElementRect.right,
76
- top: domRect.top - marginTop
77
- });
78
- const { reason: { isOnBottomSide, isOnTopSide }, result } = rect.contains(point);
79
- if (result) {
80
- blockElem = elem;
81
- blockNode = $getNodeByKey(key);
82
- prevIndex = index;
83
- break;
84
- }
85
- if (direction === Indeterminate) {
86
- if (isOnTopSide) {
87
- direction = Upward;
88
- } else if (isOnBottomSide) {
89
- direction = Downward;
90
- } else {
91
- // stop search block element
92
- direction = Infinity;
93
- }
94
- }
95
- index += direction;
96
- }
97
- });
98
- return {
99
- blockElem,
100
- blockNode
101
- };
102
- }
103
29
  function useAddBlockHandle(editor, anchorElem, isEditable) {
104
30
  const scrollerElem = anchorElem.parentElement;
31
+ const { editorConfig } = useEditorConfigContext();
32
+ const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12;
105
33
  const menuRef = useRef(null);
106
34
  const [hoveredElement, setHoveredElement] = useState(null);
107
35
  useEffect(()=>{
@@ -110,31 +38,26 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
110
38
  if (!isHTMLElement(target)) {
111
39
  return;
112
40
  }
113
- let distanceFromScrollerElem = 0;
114
- // Calculate distance between scrollerElem and target if target is not in scrollerElem
115
- if (scrollerElem && !scrollerElem.contains(target)) {
116
- const { bottom, left, right, top } = scrollerElem.getBoundingClientRect();
117
- const { pageX, pageY } = event;
118
- const horizontalBuffer = 50;
119
- const verticalBuffer = 25;
120
- const adjustedTop = top + window.scrollY;
121
- const adjustedBottom = bottom + window.scrollY;
122
- if (pageY < adjustedTop - verticalBuffer || pageY > adjustedBottom + verticalBuffer || pageX < left - horizontalBuffer || pageX > right + horizontalBuffer) {
123
- if (hoveredElement !== null) {
124
- setHoveredElement(null);
125
- }
126
- return;
127
- }
128
- // This is used to allow the _emptyBlockElem to be found when the mouse is in the
129
- // buffer zone around the scrollerElem.
130
- if (pageX < left || pageX > right) {
131
- distanceFromScrollerElem = pageX < left ? pageX - left : pageX - right;
132
- }
41
+ const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target);
42
+ if (distanceFromScrollerElem === -1) {
43
+ setHoveredElement(null);
44
+ return;
133
45
  }
134
46
  if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {
135
47
  return;
136
48
  }
137
- const { blockElem: _emptyBlockElem, blockNode } = getBlockElement(anchorElem, editor, event, false, -distanceFromScrollerElem);
49
+ const topLevelNodeKeys = getTopLevelNodeKeys(editor);
50
+ const { blockElem: _emptyBlockElem, blockNode, foundAtIndex } = getNodeCloseToPoint({
51
+ anchorElem,
52
+ cache_threshold: 0,
53
+ editor,
54
+ horizontalOffset: -distanceFromScrollerElem,
55
+ point: new Point(event.x, event.y),
56
+ returnEmptyParagraphs: true,
57
+ startIndex: getCurrentIndex(topLevelNodeKeys.length),
58
+ useEdgeAsDefault: false
59
+ });
60
+ prevIndex = foundAtIndex;
138
61
  if (!_emptyBlockElem) {
139
62
  return;
140
63
  }
@@ -160,19 +83,12 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
160
83
  ]);
161
84
  useEffect(()=>{
162
85
  if (menuRef.current && hoveredElement?.node) {
163
- editor.getEditorState().read(()=>{
164
- // Check if blockNode is an empty text node
165
- let isEmptyParagraph = true;
166
- if (hoveredElement.node.getType() !== 'paragraph' || hoveredElement.node.getTextContent() !== '') {
167
- isEmptyParagraph = false;
168
- }
169
- setHandlePosition(hoveredElement?.elem, menuRef.current, anchorElem, isEmptyParagraph ? SPACE : SPACE - 20);
170
- });
86
+ setHandlePosition(hoveredElement?.elem, menuRef.current, anchorElem, blockHandleHorizontalOffset);
171
87
  }
172
88
  }, [
173
89
  anchorElem,
174
90
  hoveredElement,
175
- editor
91
+ blockHandleHorizontalOffset
176
92
  ]);
177
93
  const handleAddClick = useCallback((event)=>{
178
94
  let hoveredElementToUse = hoveredElement;
@@ -220,16 +136,19 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
220
136
  editor,
221
137
  hoveredElement
222
138
  ]);
223
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("button", {
224
- className: "icon add-block-menu",
225
- onClick: (event)=>{
226
- handleAddClick(event);
227
- },
228
- ref: menuRef,
229
- type: "button"
230
- }, /*#__PURE__*/ React.createElement("div", {
231
- className: isEditable ? 'icon' : ''
232
- }))), anchorElem);
139
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsx(React.Fragment, {
140
+ children: /*#__PURE__*/ _jsx("button", {
141
+ className: "icon add-block-menu",
142
+ onClick: (event)=>{
143
+ handleAddClick(event);
144
+ },
145
+ ref: menuRef,
146
+ type: "button",
147
+ children: /*#__PURE__*/ _jsx("div", {
148
+ className: isEditable ? 'icon' : ''
149
+ })
150
+ })
151
+ }), anchorElem);
233
152
  }
234
153
  export function AddBlockHandlePlugin({ anchorElem = document.body }) {
235
154
  const [editor] = useLexicalComposerContext();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/field/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, $getNodeByKey } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { Rect } from '../../../utils/rect.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { getCollapsedMargins } from '../utils/getCollapsedMargins.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst SPACE = -24\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nconst Downward = 1\nconst Upward = -1\nconst Indeterminate = 0\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 getBlockElement(\n anchorElem: HTMLElement,\n editor: LexicalEditor,\n event: MouseEvent,\n useEdgeAsDefault = false,\n horizontalOffset = 0,\n): {\n blockElem: HTMLElement | null\n blockNode: LexicalNode | null\n} {\n const anchorElementRect = anchorElem.getBoundingClientRect()\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n let blockElem: HTMLElement | null = null\n let blockNode: LexicalNode | null = null\n\n // Return null if matching block element is the first or last node\n editor.getEditorState().read(() => {\n if (useEdgeAsDefault) {\n const [firstNode, lastNode] = [\n editor.getElementByKey(topLevelNodeKeys[0]),\n editor.getElementByKey(topLevelNodeKeys[topLevelNodeKeys.length - 1]),\n ]\n\n const [firstNodeRect, lastNodeRect] = [\n firstNode?.getBoundingClientRect(),\n lastNode?.getBoundingClientRect(),\n ]\n\n if (firstNodeRect && lastNodeRect) {\n if (event.y < firstNodeRect.top) {\n blockElem = firstNode\n } else if (event.y > lastNodeRect.bottom) {\n blockElem = lastNode\n }\n\n if (blockElem) {\n return {\n blockElem: null,\n }\n }\n }\n }\n\n // Find matching block element\n let index = getCurrentIndex(topLevelNodeKeys.length)\n let direction = Indeterminate\n\n while (index >= 0 && index < topLevelNodeKeys.length) {\n const key = topLevelNodeKeys[index]\n const elem = editor.getElementByKey(key)\n if (elem === null) {\n break\n }\n const point = new Point(event.x + horizontalOffset, event.y)\n const domRect = Rect.fromDOM(elem)\n const { marginBottom, marginTop } = getCollapsedMargins(elem)\n\n const rect = domRect.generateNewRect({\n bottom: domRect.bottom + marginBottom,\n left: anchorElementRect.left,\n right: anchorElementRect.right,\n top: domRect.top - marginTop,\n })\n\n const {\n reason: { isOnBottomSide, isOnTopSide },\n result,\n } = rect.contains(point)\n\n if (result) {\n blockElem = elem\n blockNode = $getNodeByKey(key)\n prevIndex = index\n break\n }\n\n if (direction === Indeterminate) {\n if (isOnTopSide) {\n direction = Upward\n } else if (isOnBottomSide) {\n direction = Downward\n } else {\n // stop search block element\n direction = Infinity\n }\n }\n\n index += direction\n }\n })\n\n return {\n blockElem,\n blockNode,\n }\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): JSX.Element {\n const scrollerElem = anchorElem.parentElement\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 let distanceFromScrollerElem = 0\n // Calculate distance between scrollerElem and target if target is not in scrollerElem\n if (scrollerElem && !scrollerElem.contains(target)) {\n const { bottom, left, right, top } = scrollerElem.getBoundingClientRect()\n const { pageX, pageY } = event\n const horizontalBuffer = 50\n const verticalBuffer = 25\n const adjustedTop = top + window.scrollY\n const adjustedBottom = bottom + window.scrollY\n\n if (\n pageY < adjustedTop - verticalBuffer ||\n pageY > adjustedBottom + verticalBuffer ||\n pageX < left - horizontalBuffer ||\n pageX > right + horizontalBuffer\n ) {\n if (hoveredElement !== null) {\n setHoveredElement(null)\n }\n return\n }\n\n // This is used to allow the _emptyBlockElem to be found when the mouse is in the\n // buffer zone around the scrollerElem.\n if (pageX < left || pageX > right) {\n distanceFromScrollerElem = pageX < left ? pageX - left : pageX - right\n }\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const { blockElem: _emptyBlockElem, blockNode } = getBlockElement(\n anchorElem,\n editor,\n event,\n false,\n -distanceFromScrollerElem,\n )\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n editor.getEditorState().read(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElement.node.getType() !== 'paragraph' ||\n hoveredElement.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n isEmptyParagraph ? SPACE : SPACE - 20,\n )\n })\n }\n }, [anchorElem, hoveredElement, editor])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","$getNodeByKey","React","useCallback","useEffect","useRef","useState","createPortal","isHTMLElement","Point","Rect","ENABLE_SLASH_MENU_COMMAND","getCollapsedMargins","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","SPACE","ADD_BLOCK_MENU_CLASSNAME","Downward","Upward","Indeterminate","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","getBlockElement","anchorElem","editor","event","useEdgeAsDefault","horizontalOffset","anchorElementRect","getBoundingClientRect","topLevelNodeKeys","blockElem","blockNode","getEditorState","read","firstNode","lastNode","getElementByKey","length","firstNodeRect","lastNodeRect","y","top","bottom","index","direction","key","elem","point","x","domRect","fromDOM","marginBottom","marginTop","rect","generateNewRect","left","right","reason","isOnBottomSide","isOnTopSide","result","contains","useAddBlockHandle","isEditable","scrollerElem","parentElement","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","target","distanceFromScrollerElem","pageX","pageY","horizontalBuffer","verticalBuffer","adjustedTop","window","scrollY","adjustedBottom","_emptyBlockElem","node","document","addEventListener","removeEventListener","current","isEmptyParagraph","getType","getTextContent","handleAddClick","hoveredElementToUse","update","newParagraph","insertAfter","setTimeout","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","Fragment","button","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/field/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey()),\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","Fragment","button","className","onClick","ref","type","div","AddBlockHandlePlugin","body","_editable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -10,7 +10,7 @@
10
10
  will-change: transform;
11
11
 
12
12
  &:hover {
13
- background: rgba(255, 255, 255, 0.1);
13
+ background-color: var(--theme-elevation-100);
14
14
  .icon {
15
15
  opacity: 1;
16
16
  }
@@ -25,7 +25,7 @@
25
25
 
26
26
  html[data-theme='dark'] & {
27
27
  .icon {
28
- filter: invert(1);
28
+ background-image: url(../../../ui/icons/Add/light.svg);
29
29
  }
30
30
  }
31
31
  }
@@ -1,3 +1,3 @@
1
1
  import type React from 'react';
2
- export declare function highlightElemOriginalPosition(debugHighlightRef: React.RefObject<HTMLDivElement>, htmlElem: HTMLElement, anchorElem: HTMLElement): void;
2
+ export declare function highlightElemOriginalPosition(debugHighlightRef: React.RefObject<HTMLDivElement | null>, htmlElem: HTMLElement, anchorElem: HTMLElement): void;
3
3
  //# sourceMappingURL=highlightElemOriginalPosition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"highlightElemOriginalPosition.d.ts","sourceRoot":"","sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,EAClD,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,WAAW,QA4BxB"}
1
+ {"version":3,"file":"highlightElemOriginalPosition.d.ts","sourceRoot":"","sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,EACzD,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,WAAW,QA4BxB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"sourcesContent":["import type React from 'react'\n\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\n\nexport function highlightElemOriginalPosition(\n debugHighlightRef: React.RefObject<HTMLDivElement>,\n htmlElem: HTMLElement,\n anchorElem: HTMLElement,\n) {\n if (!debugHighlightRef.current) {\n // If the ref doesn't point to an existing element, we can't set styles\n return\n }\n\n const { left: anchorLeft, top: anchorTop } = anchorElem.getBoundingClientRect()\n\n // Get computed styles of the given element\n const boundingRect = getBoundingClientRectWithoutTransform(htmlElem)\n\n // Extract necessary styles (ignoring transform)\n const width = boundingRect.width\n const height = boundingRect.height\n const top = boundingRect.top - anchorTop\n const left = boundingRect.left - anchorLeft\n\n debugHighlightRef.current.style.border = '2px solid green'\n debugHighlightRef.current.style.boxSizing = 'border-box'\n debugHighlightRef.current.style.height = height + 'px'\n debugHighlightRef.current.style.pointerEvents = 'none'\n debugHighlightRef.current.style.position = 'absolute'\n debugHighlightRef.current.style.top = top + 'px'\n debugHighlightRef.current.style.left = left + 'px'\n debugHighlightRef.current.style.width = width + 'px'\n debugHighlightRef.current.style.zIndex = '1000'\n debugHighlightRef.current.style.opacity = '0.5'\n}\n"],"names":["getBoundingClientRectWithoutTransform","highlightElemOriginalPosition","debugHighlightRef","htmlElem","anchorElem","current","left","anchorLeft","top","anchorTop","getBoundingClientRect","boundingRect","width","height","style","border","boxSizing","pointerEvents","position","zIndex","opacity"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,qCAAqC,QAAQ,uCAAsC;AAE5F,OAAO,SAASC,8BACdC,iBAAkD,EAClDC,QAAqB,EACrBC,UAAuB;IAEvB,IAAI,CAACF,kBAAkBG,OAAO,EAAE;QAC9B,uEAAuE;QACvE;IACF;IAEA,MAAM,EAAEC,MAAMC,UAAU,EAAEC,KAAKC,SAAS,EAAE,GAAGL,WAAWM,qBAAqB;IAE7E,2CAA2C;IAC3C,MAAMC,eAAeX,sCAAsCG;IAE3D,gDAAgD;IAChD,MAAMS,QAAQD,aAAaC,KAAK;IAChC,MAAMC,SAASF,aAAaE,MAAM;IAClC,MAAML,MAAMG,aAAaH,GAAG,GAAGC;IAC/B,MAAMH,OAAOK,aAAaL,IAAI,GAAGC;IAEjCL,kBAAkBG,OAAO,CAACS,KAAK,CAACC,MAAM,GAAG;IACzCb,kBAAkBG,OAAO,CAACS,KAAK,CAACE,SAAS,GAAG;IAC5Cd,kBAAkBG,OAAO,CAACS,KAAK,CAACD,MAAM,GAAGA,SAAS;IAClDX,kBAAkBG,OAAO,CAACS,KAAK,CAACG,aAAa,GAAG;IAChDf,kBAAkBG,OAAO,CAACS,KAAK,CAACI,QAAQ,GAAG;IAC3ChB,kBAAkBG,OAAO,CAACS,KAAK,CAACN,GAAG,GAAGA,MAAM;IAC5CN,kBAAkBG,OAAO,CAACS,KAAK,CAACR,IAAI,GAAGA,OAAO;IAC9CJ,kBAAkBG,OAAO,CAACS,KAAK,CAACF,KAAK,GAAGA,QAAQ;IAChDV,kBAAkBG,OAAO,CAACS,KAAK,CAACK,MAAM,GAAG;IACzCjB,kBAAkBG,OAAO,CAACS,KAAK,CAACM,OAAO,GAAG;AAC5C"}
1
+ {"version":3,"sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/highlightElemOriginalPosition.ts"],"sourcesContent":["import type React from 'react'\n\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\n\nexport function highlightElemOriginalPosition(\n debugHighlightRef: React.RefObject<HTMLDivElement | null>,\n htmlElem: HTMLElement,\n anchorElem: HTMLElement,\n) {\n if (!debugHighlightRef.current) {\n // If the ref doesn't point to an existing element, we can't set styles\n return\n }\n\n const { left: anchorLeft, top: anchorTop } = anchorElem.getBoundingClientRect()\n\n // Get computed styles of the given element\n const boundingRect = getBoundingClientRectWithoutTransform(htmlElem)\n\n // Extract necessary styles (ignoring transform)\n const width = boundingRect.width\n const height = boundingRect.height\n const top = boundingRect.top - anchorTop\n const left = boundingRect.left - anchorLeft\n\n debugHighlightRef.current.style.border = '2px solid green'\n debugHighlightRef.current.style.boxSizing = 'border-box'\n debugHighlightRef.current.style.height = height + 'px'\n debugHighlightRef.current.style.pointerEvents = 'none'\n debugHighlightRef.current.style.position = 'absolute'\n debugHighlightRef.current.style.top = top + 'px'\n debugHighlightRef.current.style.left = left + 'px'\n debugHighlightRef.current.style.width = width + 'px'\n debugHighlightRef.current.style.zIndex = '1000'\n debugHighlightRef.current.style.opacity = '0.5'\n}\n"],"names":["getBoundingClientRectWithoutTransform","highlightElemOriginalPosition","debugHighlightRef","htmlElem","anchorElem","current","left","anchorLeft","top","anchorTop","getBoundingClientRect","boundingRect","width","height","style","border","boxSizing","pointerEvents","position","zIndex","opacity"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,qCAAqC,QAAQ,uCAAsC;AAE5F,OAAO,SAASC,8BACdC,iBAAyD,EACzDC,QAAqB,EACrBC,UAAuB;IAEvB,IAAI,CAACF,kBAAkBG,OAAO,EAAE;QAC9B,uEAAuE;QACvE;IACF;IAEA,MAAM,EAAEC,MAAMC,UAAU,EAAEC,KAAKC,SAAS,EAAE,GAAGL,WAAWM,qBAAqB;IAE7E,2CAA2C;IAC3C,MAAMC,eAAeX,sCAAsCG;IAE3D,gDAAgD;IAChD,MAAMS,QAAQD,aAAaC,KAAK;IAChC,MAAMC,SAASF,aAAaE,MAAM;IAClC,MAAML,MAAMG,aAAaH,GAAG,GAAGC;IAC/B,MAAMH,OAAOK,aAAaL,IAAI,GAAGC;IAEjCL,kBAAkBG,OAAO,CAACS,KAAK,CAACC,MAAM,GAAG;IACzCb,kBAAkBG,OAAO,CAACS,KAAK,CAACE,SAAS,GAAG;IAC5Cd,kBAAkBG,OAAO,CAACS,KAAK,CAACD,MAAM,GAAGA,SAAS;IAClDX,kBAAkBG,OAAO,CAACS,KAAK,CAACG,aAAa,GAAG;IAChDf,kBAAkBG,OAAO,CAACS,KAAK,CAACI,QAAQ,GAAG;IAC3ChB,kBAAkBG,OAAO,CAACS,KAAK,CAACN,GAAG,GAAGA,MAAM;IAC5CN,kBAAkBG,OAAO,CAACS,KAAK,CAACR,IAAI,GAAGA,OAAO;IAC9CJ,kBAAkBG,OAAO,CAACS,KAAK,CAACF,KAAK,GAAGA,QAAQ;IAChDV,kBAAkBG,OAAO,CAACS,KAAK,CAACK,MAAM,GAAG;IACzCjB,kBAAkBG,OAAO,CAACS,KAAK,CAACM,OAAO,GAAG;AAC5C"}
@@ -1,6 +1,6 @@
1
- /// <reference types="react" resolution-mode="require"/>
1
+ import * as React from 'react';
2
2
  import './index.scss';
3
3
  export declare function DraggableBlockPlugin({ anchorElem, }: {
4
4
  anchorElem?: HTMLElement;
5
- }): JSX.Element;
5
+ }): React.ReactElement;
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"names":[],"mappings":";AAkBA,OAAO,cAAc,CAAA;AAuXrB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,GAAG,CAAC,OAAO,CAGd"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,cAAc,CAAA;AAuarB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
@@ -1,20 +1,22 @@
1
1
  'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
3
4
  import { eventFiles } from '@lexical/rich-text';
4
5
  import { $getNearestNodeFromDOMNode, $getNodeByKey } from 'lexical';
5
6
  import * as React from 'react';
6
- import { useCallback, useEffect, useRef, useState } from 'react';
7
+ import { useEffect, useRef, useState } from 'react';
7
8
  import { createPortal } from 'react-dom';
9
+ import { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js';
8
10
  import { isHTMLElement } from '../../../utils/guard.js';
9
11
  import { Point } from '../../../utils/point.js';
12
+ import { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js';
13
+ import { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js';
10
14
  import { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js';
11
15
  import { isOnHandleElement } from '../utils/isOnHandleElement.js';
12
16
  import { setHandlePosition } from '../utils/setHandlePosition.js';
13
17
  import { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js';
14
- import { getNodeCloseToPoint } from './getNodeCloseToPoint.js';
15
18
  import './index.scss';
16
19
  import { setTargetLine } from './setTargetLine.js';
17
- const SPACE = -24;
18
20
  const DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu';
19
21
  const DRAG_DATA_FORMAT = 'application/x-lexical-drag-block';
20
22
  let prevIndex = Infinity;
@@ -41,11 +43,10 @@ function hideTargetLine(targetLineElem, lastTargetBlockElem) {
41
43
  }
42
44
  if (lastTargetBlockElem) {
43
45
  lastTargetBlockElem.style.opacity = '';
44
- lastTargetBlockElem.style.transform = '';
45
46
  // Delete marginBottom and marginTop values we set
46
47
  lastTargetBlockElem.style.marginBottom = '';
47
48
  lastTargetBlockElem.style.marginTop = '';
48
- //lastTargetBlockElem.style.border = 'none'
49
+ //lastTargetBlock.style.border = 'none'
49
50
  }
50
51
  }
51
52
  function useDraggableBlockMenu(editor, anchorElem, isEditable) {
@@ -55,28 +56,9 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
55
56
  const debugHighlightRef = useRef(null);
56
57
  const isDraggingBlockRef = useRef(false);
57
58
  const [draggableBlockElem, setDraggableBlockElem] = useState(null);
58
- const [lastTargetBlockElem, setLastTargetBlockElem] = useState(null);
59
- const calculateDistanceFromScrollerElem = useCallback((pageX, pageY, target, horizontalBuffer = 50, verticalBuffer = 25)=>{
60
- let distanceFromScrollerElem = 0;
61
- // Calculate distance between scrollerElem and target if target is not in scrollerElem
62
- if (scrollerElem && !scrollerElem.contains(target)) {
63
- const { bottom, left, right, top } = scrollerElem.getBoundingClientRect();
64
- const adjustedTop = top + window.scrollY;
65
- const adjustedBottom = bottom + window.scrollY;
66
- if (pageY < adjustedTop - verticalBuffer || pageY > adjustedBottom + verticalBuffer || pageX < left - horizontalBuffer || pageX > right + horizontalBuffer) {
67
- setDraggableBlockElem(null);
68
- return distanceFromScrollerElem;
69
- }
70
- // This is used to allow the _draggableBlockElem to be found when the mouse is in the
71
- // buffer zone around the scrollerElem.
72
- if (pageX < left || pageX > right) {
73
- distanceFromScrollerElem = pageX < left ? pageX - left : pageX - right;
74
- }
75
- }
76
- return distanceFromScrollerElem;
77
- }, [
78
- scrollerElem
79
- ]);
59
+ const [lastTargetBlock, setLastTargetBlock] = useState(null);
60
+ const { editorConfig } = useEditorConfigContext();
61
+ const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -44 : -8;
80
62
  useEffect(()=>{
81
63
  /**
82
64
  * Handles positioning of the drag handle
@@ -85,7 +67,11 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
85
67
  if (!isHTMLElement(target)) {
86
68
  return;
87
69
  }
88
- const distanceFromScrollerElem = calculateDistanceFromScrollerElem(event.pageX, event.pageY, target);
70
+ const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target);
71
+ if (distanceFromScrollerElem === -1) {
72
+ setDraggableBlockElem(null);
73
+ return;
74
+ }
89
75
  if (isOnHandleElement(target, DRAGGABLE_BLOCK_MENU_CLASSNAME)) {
90
76
  return;
91
77
  }
@@ -97,13 +83,14 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
97
83
  horizontalOffset: -distanceFromScrollerElem,
98
84
  point: new Point(event.x, event.y),
99
85
  startIndex: getCurrentIndex(topLevelNodeKeys.length),
100
- useEdgeAsDefault: false
86
+ useEdgeAsDefault: false,
87
+ verbose: false
101
88
  });
89
+ prevIndex = foundAtIndex;
102
90
  //if (DEBUG && _draggableBlockElem) {
103
91
  //targetBlockElem.style.border = '3px solid red'
104
92
  // highlightElemOriginalPosition(debugHighlightRef, _draggableBlockElem, anchorElem)
105
93
  //}
106
- prevIndex = foundAtIndex;
107
94
  if (!_draggableBlockElem && !isFoundNodeEmptyParagraph) {
108
95
  return;
109
96
  }
@@ -112,7 +99,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
112
99
  }
113
100
  }
114
101
  // Since the draggableBlockElem is outside the actual editor, we need to listen to the document
115
- // to be able to detect when the mouse is outside the editor and respect a buffer around the
102
+ // to be able to detect when the mouse is outside the editor and respect a buffer around
116
103
  // the scrollerElem to avoid the draggableBlockElem disappearing too early.
117
104
  document?.addEventListener('mousemove', onDocumentMouseMove);
118
105
  return ()=>{
@@ -122,16 +109,16 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
122
109
  scrollerElem,
123
110
  anchorElem,
124
111
  editor,
125
- calculateDistanceFromScrollerElem,
126
112
  draggableBlockElem
127
113
  ]);
128
114
  useEffect(()=>{
129
115
  if (menuRef.current) {
130
- setHandlePosition(draggableBlockElem, menuRef.current, anchorElem, SPACE);
116
+ setHandlePosition(draggableBlockElem, menuRef.current, anchorElem, blockHandleHorizontalOffset);
131
117
  }
132
118
  }, [
133
119
  anchorElem,
134
- draggableBlockElem
120
+ draggableBlockElem,
121
+ blockHandleHorizontalOffset
135
122
  ]);
136
123
  useEffect(()=>{
137
124
  function onDragover(event) {
@@ -146,7 +133,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
146
133
  if (!isHTMLElement(target)) {
147
134
  return false;
148
135
  }
149
- const distanceFromScrollerElem = calculateDistanceFromScrollerElem(event.pageX, event.pageY, target, 100, 50);
136
+ const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target, 100, 50);
150
137
  const topLevelNodeKeys = getTopLevelNodeKeys(editor);
151
138
  const { blockElem: targetBlockElem, foundAtIndex, isFoundNodeEmptyParagraph } = getNodeCloseToPoint({
152
139
  anchorElem,
@@ -165,15 +152,26 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
165
152
  return false;
166
153
  }
167
154
  if (draggableBlockElem !== targetBlockElem) {
168
- setTargetLine(SPACE, targetLineElem, targetBlockElem, lastTargetBlockElem, pageY, anchorElem, event, debugHighlightRef, isFoundNodeEmptyParagraph);
155
+ const { isBelow, willStayInSamePosition } = setTargetLine(editorConfig?.admin?.hideGutter ? '0px' : '3rem', blockHandleHorizontalOffset + (editorConfig?.admin?.hideGutter ? menuRef?.current?.getBoundingClientRect()?.width ?? 0 : -menuRef?.current?.getBoundingClientRect()?.width ?? 0), targetLineElem, targetBlockElem, lastTargetBlock, pageY, anchorElem, event, debugHighlightRef, isFoundNodeEmptyParagraph);
169
156
  // Prevent default event to be able to trigger onDrop events
170
157
  // Calling preventDefault() adds the green plus icon to the cursor,
171
158
  // indicating that the drop is allowed.
172
159
  event.preventDefault();
160
+ if (!willStayInSamePosition) {
161
+ setLastTargetBlock({
162
+ boundingBox: targetBlockElem.getBoundingClientRect(),
163
+ elem: targetBlockElem,
164
+ isBelow
165
+ });
166
+ }
173
167
  } else {
174
- hideTargetLine(targetLineElem, lastTargetBlockElem);
168
+ hideTargetLine(targetLineElem, lastTargetBlock?.elem);
169
+ setLastTargetBlock({
170
+ boundingBox: targetBlockElem.getBoundingClientRect(),
171
+ elem: targetBlockElem,
172
+ isBelow: false
173
+ });
175
174
  }
176
- setLastTargetBlockElem(targetBlockElem);
177
175
  return true;
178
176
  }
179
177
  function onDrop(event) {
@@ -194,7 +192,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
194
192
  if (!isHTMLElement(target)) {
195
193
  return false;
196
194
  }
197
- const distanceFromScrollerElem = calculateDistanceFromScrollerElem(event.pageX, event.pageY, target, 100, 50);
195
+ const distanceFromScrollerElem = calculateDistanceFromScrollerElem(scrollerElem, event.pageX, event.pageY, target, 100, 50);
198
196
  const { blockElem: targetBlockElem, isFoundNodeEmptyParagraph } = getNodeCloseToPoint({
199
197
  anchorElem,
200
198
  editor,
@@ -237,6 +235,43 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
237
235
  }*/ if (draggableBlockElem !== null) {
238
236
  setDraggableBlockElem(null);
239
237
  }
238
+ // find all previous elements with lexical-block-highlighter class and remove them
239
+ const allPrevHighlighters = document.querySelectorAll('.lexical-block-highlighter');
240
+ allPrevHighlighters.forEach((highlighter)=>{
241
+ highlighter.remove();
242
+ });
243
+ const newInsertedElem = editor.getElementByKey(draggedNode.getKey());
244
+ setTimeout(()=>{
245
+ // add new temp html element to newInsertedElem with the same height and width and the class block-selected
246
+ // to highlight the new inserted element
247
+ const newInsertedElemRect = newInsertedElem.getBoundingClientRect();
248
+ const highlightElem = document.createElement('div');
249
+ highlightElem.className = 'lexical-block-highlighter';
250
+ // if html data-theme is dark, set the highlighter color to white
251
+ if (document.documentElement.getAttribute('data-theme') === 'dark') {
252
+ highlightElem.style.backgroundColor = 'white';
253
+ } else {
254
+ highlightElem.style.backgroundColor = 'black';
255
+ }
256
+ highlightElem.style.transition = 'opacity 0.1s ease-in-out';
257
+ highlightElem.style.zIndex = '1';
258
+ highlightElem.style.pointerEvents = 'none';
259
+ highlightElem.style.boxSizing = 'border-box';
260
+ highlightElem.style.borderRadius = '4px';
261
+ highlightElem.style.position = 'absolute';
262
+ document.body.appendChild(highlightElem);
263
+ highlightElem.style.opacity = '0.1';
264
+ highlightElem.style.height = `${newInsertedElemRect.height + 8}px`;
265
+ highlightElem.style.width = `${newInsertedElemRect.width + 8}px`;
266
+ highlightElem.style.top = `${newInsertedElemRect.top + window.scrollY - 4}px`;
267
+ highlightElem.style.left = `${newInsertedElemRect.left - 4}px`;
268
+ setTimeout(()=>{
269
+ highlightElem.style.opacity = '0';
270
+ setTimeout(()=>{
271
+ highlightElem.remove();
272
+ }, 1000);
273
+ }, 3000);
274
+ }, 120);
240
275
  });
241
276
  return true;
242
277
  }
@@ -249,11 +284,13 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
249
284
  document.removeEventListener('drop', onDrop);
250
285
  };
251
286
  }, [
287
+ scrollerElem,
288
+ blockHandleHorizontalOffset,
252
289
  anchorElem,
253
290
  editor,
254
- lastTargetBlockElem,
255
- calculateDistanceFromScrollerElem,
256
- draggableBlockElem
291
+ lastTargetBlock,
292
+ draggableBlockElem,
293
+ editorConfig?.admin?.hideGutter
257
294
  ]);
258
295
  function onDragStart(event) {
259
296
  const dataTransfer = event.dataTransfer;
@@ -273,23 +310,30 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
273
310
  }
274
311
  function onDragEnd() {
275
312
  isDraggingBlockRef.current = false;
276
- hideTargetLine(targetLineRef.current, lastTargetBlockElem);
313
+ hideTargetLine(targetLineRef.current, lastTargetBlock?.elem);
277
314
  }
278
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("div", {
279
- className: "icon draggable-block-menu",
280
- draggable: true,
281
- onDragEnd: onDragEnd,
282
- onDragStart: onDragStart,
283
- ref: menuRef
284
- }, /*#__PURE__*/ React.createElement("div", {
285
- className: isEditable ? 'icon' : ''
286
- })), /*#__PURE__*/ React.createElement("div", {
287
- className: "draggable-block-target-line",
288
- ref: targetLineRef
289
- }), /*#__PURE__*/ React.createElement("div", {
290
- className: "debug-highlight",
291
- ref: debugHighlightRef
292
- })), anchorElem);
315
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxs(React.Fragment, {
316
+ children: [
317
+ /*#__PURE__*/ _jsx("div", {
318
+ className: "icon draggable-block-menu",
319
+ draggable: true,
320
+ onDragEnd: onDragEnd,
321
+ onDragStart: onDragStart,
322
+ ref: menuRef,
323
+ children: /*#__PURE__*/ _jsx("div", {
324
+ className: isEditable ? 'icon' : ''
325
+ })
326
+ }),
327
+ /*#__PURE__*/ _jsx("div", {
328
+ className: "draggable-block-target-line",
329
+ ref: targetLineRef
330
+ }),
331
+ /*#__PURE__*/ _jsx("div", {
332
+ className: "debug-highlight",
333
+ ref: debugHighlightRef
334
+ })
335
+ ]
336
+ }), anchorElem);
293
337
  }
294
338
  export function DraggableBlockPlugin({ anchorElem = document.body }) {
295
339
  const [editor] = useLexicalComposerContext();