@payloadcms/richtext-lexical 3.0.0-beta.2 → 3.0.0-beta.21

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 (415) hide show
  1. package/dist/cell/index.d.ts +1 -1
  2. package/dist/cell/index.d.ts.map +1 -1
  3. package/dist/cell/index.js +2 -4
  4. package/dist/cell/index.js.map +1 -1
  5. package/dist/field/features/align/feature.client.d.ts.map +1 -1
  6. package/dist/field/features/align/feature.client.js +1 -2
  7. package/dist/field/features/align/feature.client.js.map +1 -1
  8. package/dist/field/features/blockquote/feature.client.d.ts.map +1 -1
  9. package/dist/field/features/blockquote/feature.client.js +3 -6
  10. package/dist/field/features/blockquote/feature.client.js.map +1 -1
  11. package/dist/field/features/blockquote/feature.server.d.ts.map +1 -1
  12. package/dist/field/features/blockquote/feature.server.js +4 -4
  13. package/dist/field/features/blockquote/feature.server.js.map +1 -1
  14. package/dist/field/features/blockquote/markdownTransformer.d.ts.map +1 -1
  15. package/dist/field/features/blockquote/markdownTransformer.js +2 -4
  16. package/dist/field/features/blockquote/markdownTransformer.js.map +1 -1
  17. package/dist/field/features/blocks/component/BlockContent.d.ts.map +1 -1
  18. package/dist/field/features/blocks/component/BlockContent.js +3 -5
  19. package/dist/field/features/blocks/component/BlockContent.js.map +1 -1
  20. package/dist/field/features/blocks/component/index.d.ts.map +1 -1
  21. package/dist/field/features/blocks/component/index.js +36 -3
  22. package/dist/field/features/blocks/component/index.js.map +1 -1
  23. package/dist/field/features/blocks/drawer/index.d.ts.map +1 -1
  24. package/dist/field/features/blocks/drawer/index.js +2 -4
  25. package/dist/field/features/blocks/drawer/index.js.map +1 -1
  26. package/dist/field/features/blocks/feature.server.d.ts.map +1 -1
  27. package/dist/field/features/blocks/feature.server.js +109 -77
  28. package/dist/field/features/blocks/feature.server.js.map +1 -1
  29. package/dist/field/features/blocks/nodes/BlocksNode.d.ts +1 -3
  30. package/dist/field/features/blocks/nodes/BlocksNode.d.ts.map +1 -1
  31. package/dist/field/features/blocks/nodes/BlocksNode.js +1 -2
  32. package/dist/field/features/blocks/nodes/BlocksNode.js.map +1 -1
  33. package/dist/field/features/blocks/plugin/commands.d.ts.map +1 -1
  34. package/dist/field/features/blocks/plugin/commands.js +1 -2
  35. package/dist/field/features/blocks/plugin/commands.js.map +1 -1
  36. package/dist/field/features/blocks/plugin/index.d.ts.map +1 -1
  37. package/dist/field/features/blocks/plugin/index.js +3 -6
  38. package/dist/field/features/blocks/plugin/index.js.map +1 -1
  39. package/dist/field/features/blocks/populationPromise.d.ts.map +1 -1
  40. package/dist/field/features/blocks/populationPromise.js +3 -18
  41. package/dist/field/features/blocks/populationPromise.js.map +1 -1
  42. package/dist/field/features/blocks/validate.d.ts.map +1 -1
  43. package/dist/field/features/blocks/validate.js +22 -36
  44. package/dist/field/features/blocks/validate.js.map +1 -1
  45. package/dist/field/features/converters/html/field/index.d.ts +8 -2
  46. package/dist/field/features/converters/html/field/index.d.ts.map +1 -1
  47. package/dist/field/features/converters/html/field/index.js +6 -3
  48. package/dist/field/features/converters/html/field/index.js.map +1 -1
  49. package/dist/field/features/debug/testrecorder/plugin/index.d.ts.map +1 -1
  50. package/dist/field/features/debug/testrecorder/plugin/index.js +2 -4
  51. package/dist/field/features/debug/testrecorder/plugin/index.js.map +1 -1
  52. package/dist/field/features/debug/treeview/plugin/index.d.ts.map +1 -1
  53. package/dist/field/features/debug/treeview/plugin/index.js +2 -4
  54. package/dist/field/features/debug/treeview/plugin/index.js.map +1 -1
  55. package/dist/field/features/format/bold/feature.client.d.ts.map +1 -1
  56. package/dist/field/features/format/bold/feature.client.js +1 -2
  57. package/dist/field/features/format/bold/feature.client.js.map +1 -1
  58. package/dist/field/features/format/inlinecode/feature.client.d.ts.map +1 -1
  59. package/dist/field/features/format/inlinecode/feature.client.js +1 -2
  60. package/dist/field/features/format/inlinecode/feature.client.js.map +1 -1
  61. package/dist/field/features/format/italic/feature.client.d.ts.map +1 -1
  62. package/dist/field/features/format/italic/feature.client.js +1 -2
  63. package/dist/field/features/format/italic/feature.client.js.map +1 -1
  64. package/dist/field/features/format/strikethrough/feature.client.d.ts.map +1 -1
  65. package/dist/field/features/format/strikethrough/feature.client.js +1 -2
  66. package/dist/field/features/format/strikethrough/feature.client.js.map +1 -1
  67. package/dist/field/features/format/subscript/feature.client.d.ts.map +1 -1
  68. package/dist/field/features/format/subscript/feature.client.js +1 -2
  69. package/dist/field/features/format/subscript/feature.client.js.map +1 -1
  70. package/dist/field/features/format/superscript/feature.client.d.ts.map +1 -1
  71. package/dist/field/features/format/superscript/feature.client.js +1 -2
  72. package/dist/field/features/format/superscript/feature.client.js.map +1 -1
  73. package/dist/field/features/format/underline/feature.client.d.ts.map +1 -1
  74. package/dist/field/features/format/underline/feature.client.js +1 -2
  75. package/dist/field/features/format/underline/feature.client.js.map +1 -1
  76. package/dist/field/features/heading/feature.client.d.ts.map +1 -1
  77. package/dist/field/features/heading/feature.client.js +3 -6
  78. package/dist/field/features/heading/feature.client.js.map +1 -1
  79. package/dist/field/features/heading/feature.server.d.ts.map +1 -1
  80. package/dist/field/features/heading/feature.server.js +5 -5
  81. package/dist/field/features/heading/feature.server.js.map +1 -1
  82. package/dist/field/features/heading/markdownTransformer.d.ts.map +1 -1
  83. package/dist/field/features/heading/markdownTransformer.js +1 -2
  84. package/dist/field/features/heading/markdownTransformer.js.map +1 -1
  85. package/dist/field/features/horizontalrule/component/index.d.ts +10 -0
  86. package/dist/field/features/horizontalrule/component/index.d.ts.map +1 -0
  87. package/dist/field/features/horizontalrule/component/index.js +62 -0
  88. package/dist/field/features/horizontalrule/component/index.js.map +1 -0
  89. package/dist/field/features/horizontalrule/feature.client.d.ts +3 -0
  90. package/dist/field/features/horizontalrule/feature.client.d.ts.map +1 -0
  91. package/dist/field/features/horizontalrule/feature.client.js +53 -0
  92. package/dist/field/features/horizontalrule/feature.client.js.map +1 -0
  93. package/dist/field/features/horizontalrule/feature.server.d.ts +3 -0
  94. package/dist/field/features/horizontalrule/feature.server.d.ts.map +1 -0
  95. package/dist/field/features/horizontalrule/feature.server.js +37 -0
  96. package/dist/field/features/horizontalrule/feature.server.js.map +1 -0
  97. package/dist/field/features/horizontalrule/markdownTransformer.d.ts +3 -0
  98. package/dist/field/features/horizontalrule/markdownTransformer.d.ts.map +1 -0
  99. package/dist/field/features/horizontalrule/markdownTransformer.js +23 -0
  100. package/dist/field/features/horizontalrule/markdownTransformer.js.map +1 -0
  101. package/dist/field/features/horizontalrule/nodes/HorizontalRuleNode.d.ts +53 -0
  102. package/dist/field/features/horizontalrule/nodes/HorizontalRuleNode.d.ts.map +1 -0
  103. package/dist/field/features/horizontalrule/nodes/HorizontalRuleNode.js +88 -0
  104. package/dist/field/features/horizontalrule/nodes/HorizontalRuleNode.js.map +1 -0
  105. package/dist/field/features/horizontalrule/plugin/index.d.ts +6 -0
  106. package/dist/field/features/horizontalrule/plugin/index.d.ts.map +1 -0
  107. package/dist/field/features/horizontalrule/plugin/index.js +31 -0
  108. package/dist/field/features/horizontalrule/plugin/index.js.map +1 -0
  109. package/dist/field/features/horizontalrule/plugin/index.scss +20 -0
  110. package/dist/field/features/indent/feature.client.d.ts.map +1 -1
  111. package/dist/field/features/indent/feature.client.js +1 -2
  112. package/dist/field/features/indent/feature.client.js.map +1 -1
  113. package/dist/field/features/link/drawer/baseFields.d.ts +3 -3
  114. package/dist/field/features/link/drawer/baseFields.d.ts.map +1 -1
  115. package/dist/field/features/link/drawer/baseFields.js +28 -42
  116. package/dist/field/features/link/drawer/baseFields.js.map +1 -1
  117. package/dist/field/features/link/drawer/index.js +3 -2
  118. package/dist/field/features/link/drawer/index.js.map +1 -1
  119. package/dist/field/features/link/drawer/types.d.ts +4 -2
  120. package/dist/field/features/link/drawer/types.d.ts.map +1 -1
  121. package/dist/field/features/link/drawer/types.js.map +1 -1
  122. package/dist/field/features/link/feature.client.d.ts.map +1 -1
  123. package/dist/field/features/link/feature.client.js +2 -4
  124. package/dist/field/features/link/feature.client.js.map +1 -1
  125. package/dist/field/features/link/feature.server.d.ts +0 -2
  126. package/dist/field/features/link/feature.server.d.ts.map +1 -1
  127. package/dist/field/features/link/feature.server.js +48 -9
  128. package/dist/field/features/link/feature.server.js.map +1 -1
  129. package/dist/field/features/link/nodes/AutoLinkNode.d.ts.map +1 -1
  130. package/dist/field/features/link/nodes/AutoLinkNode.js +1 -2
  131. package/dist/field/features/link/nodes/AutoLinkNode.js.map +1 -1
  132. package/dist/field/features/link/nodes/LinkNode.d.ts +1 -3
  133. package/dist/field/features/link/nodes/LinkNode.d.ts.map +1 -1
  134. package/dist/field/features/link/nodes/LinkNode.js +2 -4
  135. package/dist/field/features/link/nodes/LinkNode.js.map +1 -1
  136. package/dist/field/features/link/plugins/autoLink/index.d.ts.map +1 -1
  137. package/dist/field/features/link/plugins/autoLink/index.js +3 -6
  138. package/dist/field/features/link/plugins/autoLink/index.js.map +1 -1
  139. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.d.ts.map +1 -1
  140. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.js +1 -2
  141. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.js.map +1 -1
  142. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  143. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js +56 -39
  144. package/dist/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  145. package/dist/field/features/link/plugins/floatingLinkEditor/index.scss +9 -1
  146. package/dist/field/features/link/plugins/floatingLinkEditor/utilities.d.ts +3 -5
  147. package/dist/field/features/link/plugins/floatingLinkEditor/utilities.d.ts.map +1 -1
  148. package/dist/field/features/link/plugins/floatingLinkEditor/utilities.js +11 -29
  149. package/dist/field/features/link/plugins/floatingLinkEditor/utilities.js.map +1 -1
  150. package/dist/field/features/link/plugins/link/index.d.ts.map +1 -1
  151. package/dist/field/features/link/plugins/link/index.js +3 -12
  152. package/dist/field/features/link/plugins/link/index.js.map +1 -1
  153. package/dist/field/features/link/populationPromise.d.ts.map +1 -1
  154. package/dist/field/features/link/populationPromise.js +9 -25
  155. package/dist/field/features/link/populationPromise.js.map +1 -1
  156. package/dist/field/features/link/validate.d.ts +5 -0
  157. package/dist/field/features/link/validate.d.ts.map +1 -0
  158. package/dist/field/features/link/validate.js +32 -0
  159. package/dist/field/features/link/validate.js.map +1 -0
  160. package/dist/field/features/lists/checklist/feature.client.d.ts.map +1 -1
  161. package/dist/field/features/lists/checklist/feature.client.js +1 -2
  162. package/dist/field/features/lists/checklist/feature.client.js.map +1 -1
  163. package/dist/field/features/lists/checklist/feature.server.d.ts.map +1 -1
  164. package/dist/field/features/lists/checklist/feature.server.js +6 -6
  165. package/dist/field/features/lists/checklist/feature.server.js.map +1 -1
  166. package/dist/field/features/lists/checklist/markdownTransformers.d.ts.map +1 -1
  167. package/dist/field/features/lists/checklist/markdownTransformers.js +1 -2
  168. package/dist/field/features/lists/checklist/markdownTransformers.js.map +1 -1
  169. package/dist/field/features/lists/checklist/plugin/index.d.ts.map +1 -1
  170. package/dist/field/features/lists/checklist/plugin/index.js +1 -2
  171. package/dist/field/features/lists/checklist/plugin/index.js.map +1 -1
  172. package/dist/field/features/lists/common/markdown.d.ts.map +1 -1
  173. package/dist/field/features/lists/common/markdown.js +1 -2
  174. package/dist/field/features/lists/common/markdown.js.map +1 -1
  175. package/dist/field/features/lists/htmlConverter.d.ts.map +1 -1
  176. package/dist/field/features/lists/htmlConverter.js +13 -6
  177. package/dist/field/features/lists/htmlConverter.js.map +1 -1
  178. package/dist/field/features/lists/orderedlist/feature.client.d.ts.map +1 -1
  179. package/dist/field/features/lists/orderedlist/feature.client.js +1 -2
  180. package/dist/field/features/lists/orderedlist/feature.client.js.map +1 -1
  181. package/dist/field/features/lists/orderedlist/feature.server.d.ts.map +1 -1
  182. package/dist/field/features/lists/orderedlist/feature.server.js +6 -6
  183. package/dist/field/features/lists/orderedlist/feature.server.js.map +1 -1
  184. package/dist/field/features/lists/orderedlist/markdownTransformer.d.ts.map +1 -1
  185. package/dist/field/features/lists/orderedlist/markdownTransformer.js +1 -2
  186. package/dist/field/features/lists/orderedlist/markdownTransformer.js.map +1 -1
  187. package/dist/field/features/lists/plugin/index.d.ts.map +1 -1
  188. package/dist/field/features/lists/plugin/index.js +1 -2
  189. package/dist/field/features/lists/plugin/index.js.map +1 -1
  190. package/dist/field/features/lists/unorderedlist/feature.client.d.ts.map +1 -1
  191. package/dist/field/features/lists/unorderedlist/feature.client.js +1 -2
  192. package/dist/field/features/lists/unorderedlist/feature.client.js.map +1 -1
  193. package/dist/field/features/lists/unorderedlist/feature.server.d.ts.map +1 -1
  194. package/dist/field/features/lists/unorderedlist/feature.server.js +6 -6
  195. package/dist/field/features/lists/unorderedlist/feature.server.js.map +1 -1
  196. package/dist/field/features/lists/unorderedlist/markdownTransformer.d.ts.map +1 -1
  197. package/dist/field/features/lists/unorderedlist/markdownTransformer.js +1 -2
  198. package/dist/field/features/lists/unorderedlist/markdownTransformer.js.map +1 -1
  199. package/dist/field/features/migrations/lexicalPluginToLexical/converter/converters/upload/converter.d.ts.map +1 -1
  200. package/dist/field/features/migrations/lexicalPluginToLexical/converter/converters/upload/converter.js +2 -4
  201. package/dist/field/features/migrations/lexicalPluginToLexical/converter/converters/upload/converter.js.map +1 -1
  202. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts +1 -3
  203. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
  204. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +2 -4
  205. package/dist/field/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  206. package/dist/field/features/migrations/slateToLexical/converter/converters/relationship/converter.d.ts.map +1 -1
  207. package/dist/field/features/migrations/slateToLexical/converter/converters/relationship/converter.js +2 -4
  208. package/dist/field/features/migrations/slateToLexical/converter/converters/relationship/converter.js.map +1 -1
  209. package/dist/field/features/migrations/slateToLexical/converter/converters/upload/converter.d.ts.map +1 -1
  210. package/dist/field/features/migrations/slateToLexical/converter/converters/upload/converter.js +2 -4
  211. package/dist/field/features/migrations/slateToLexical/converter/converters/upload/converter.js.map +1 -1
  212. package/dist/field/features/migrations/slateToLexical/converter/index.d.ts.map +1 -1
  213. package/dist/field/features/migrations/slateToLexical/converter/index.js +2 -1
  214. package/dist/field/features/migrations/slateToLexical/converter/index.js.map +1 -1
  215. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts +1 -3
  216. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
  217. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +2 -4
  218. package/dist/field/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  219. package/dist/field/features/paragraph/feature.client.d.ts.map +1 -1
  220. package/dist/field/features/paragraph/feature.client.js +2 -4
  221. package/dist/field/features/paragraph/feature.client.js.map +1 -1
  222. package/dist/field/features/relationship/drawer/commands.d.ts.map +1 -1
  223. package/dist/field/features/relationship/drawer/commands.js +1 -2
  224. package/dist/field/features/relationship/drawer/commands.js.map +1 -1
  225. package/dist/field/features/relationship/drawer/index.d.ts.map +1 -1
  226. package/dist/field/features/relationship/drawer/index.js +7 -13
  227. package/dist/field/features/relationship/drawer/index.js.map +1 -1
  228. package/dist/field/features/relationship/feature.server.d.ts.map +1 -1
  229. package/dist/field/features/relationship/feature.server.js +3 -2
  230. package/dist/field/features/relationship/feature.server.js.map +1 -1
  231. package/dist/field/features/relationship/nodes/RelationshipNode.d.ts +3 -8
  232. package/dist/field/features/relationship/nodes/RelationshipNode.d.ts.map +1 -1
  233. package/dist/field/features/relationship/nodes/RelationshipNode.js +8 -8
  234. package/dist/field/features/relationship/nodes/RelationshipNode.js.map +1 -1
  235. package/dist/field/features/relationship/nodes/components/RelationshipComponent.d.ts.map +1 -1
  236. package/dist/field/features/relationship/nodes/components/RelationshipComponent.js +54 -7
  237. package/dist/field/features/relationship/nodes/components/RelationshipComponent.js.map +1 -1
  238. package/dist/field/features/relationship/plugins/index.d.ts.map +1 -1
  239. package/dist/field/features/relationship/plugins/index.js +3 -6
  240. package/dist/field/features/relationship/plugins/index.js.map +1 -1
  241. package/dist/field/features/relationship/populationPromise.js +7 -6
  242. package/dist/field/features/relationship/populationPromise.js.map +1 -1
  243. package/dist/field/features/typeUtilities.d.ts +8 -0
  244. package/dist/field/features/typeUtilities.d.ts.map +1 -0
  245. package/dist/field/features/typeUtilities.js +8 -0
  246. package/dist/field/features/typeUtilities.js.map +1 -0
  247. package/dist/field/features/types.d.ts +57 -33
  248. package/dist/field/features/types.d.ts.map +1 -1
  249. package/dist/field/features/types.js.map +1 -1
  250. package/dist/field/features/upload/component/ExtraFieldsDrawer/index.d.ts.map +1 -1
  251. package/dist/field/features/upload/component/ExtraFieldsDrawer/index.js +5 -6
  252. package/dist/field/features/upload/component/ExtraFieldsDrawer/index.js.map +1 -1
  253. package/dist/field/features/upload/component/index.d.ts.map +1 -1
  254. package/dist/field/features/upload/component/index.js +55 -9
  255. package/dist/field/features/upload/component/index.js.map +1 -1
  256. package/dist/field/features/upload/drawer/commands.d.ts.map +1 -1
  257. package/dist/field/features/upload/drawer/commands.js +1 -2
  258. package/dist/field/features/upload/drawer/commands.js.map +1 -1
  259. package/dist/field/features/upload/drawer/index.d.ts.map +1 -1
  260. package/dist/field/features/upload/drawer/index.js +8 -12
  261. package/dist/field/features/upload/drawer/index.js.map +1 -1
  262. package/dist/field/features/upload/feature.server.d.ts.map +1 -1
  263. package/dist/field/features/upload/feature.server.js +39 -11
  264. package/dist/field/features/upload/feature.server.js.map +1 -1
  265. package/dist/field/features/upload/nodes/UploadNode.d.ts +2 -14
  266. package/dist/field/features/upload/nodes/UploadNode.d.ts.map +1 -1
  267. package/dist/field/features/upload/nodes/UploadNode.js +6 -9
  268. package/dist/field/features/upload/nodes/UploadNode.js.map +1 -1
  269. package/dist/field/features/upload/plugin/index.d.ts +2 -2
  270. package/dist/field/features/upload/plugin/index.d.ts.map +1 -1
  271. package/dist/field/features/upload/plugin/index.js +4 -9
  272. package/dist/field/features/upload/plugin/index.js.map +1 -1
  273. package/dist/field/features/upload/populationPromise.js +11 -8
  274. package/dist/field/features/upload/populationPromise.js.map +1 -1
  275. package/dist/field/features/upload/validate.d.ts +2 -1
  276. package/dist/field/features/upload/validate.d.ts.map +1 -1
  277. package/dist/field/features/upload/validate.js +34 -12
  278. package/dist/field/features/upload/validate.js.map +1 -1
  279. package/dist/field/index.d.ts +1 -1
  280. package/dist/field/index.d.ts.map +1 -1
  281. package/dist/field/index.js.map +1 -1
  282. package/dist/field/lexical/LexicalEditor.d.ts.map +1 -1
  283. package/dist/field/lexical/LexicalEditor.js +6 -11
  284. package/dist/field/lexical/LexicalEditor.js.map +1 -1
  285. package/dist/field/lexical/LexicalProvider.d.ts +1 -1
  286. package/dist/field/lexical/LexicalProvider.d.ts.map +1 -1
  287. package/dist/field/lexical/LexicalProvider.js +1 -2
  288. package/dist/field/lexical/LexicalProvider.js.map +1 -1
  289. package/dist/field/lexical/config/client/default.d.ts +1 -1
  290. package/dist/field/lexical/config/client/default.d.ts.map +1 -1
  291. package/dist/field/lexical/config/client/default.js.map +1 -1
  292. package/dist/field/lexical/config/client/sanitize.d.ts +1 -1
  293. package/dist/field/lexical/config/client/sanitize.d.ts.map +1 -1
  294. package/dist/field/lexical/config/client/sanitize.js.map +1 -1
  295. package/dist/field/lexical/config/server/default.d.ts +2 -3
  296. package/dist/field/lexical/config/server/default.d.ts.map +1 -1
  297. package/dist/field/lexical/config/server/default.js +3 -3
  298. package/dist/field/lexical/config/server/default.js.map +1 -1
  299. package/dist/field/lexical/config/server/loader.d.ts +4 -2
  300. package/dist/field/lexical/config/server/loader.d.ts.map +1 -1
  301. package/dist/field/lexical/config/server/loader.js +3 -2
  302. package/dist/field/lexical/config/server/loader.js.map +1 -1
  303. package/dist/field/lexical/config/server/sanitize.d.ts +2 -1
  304. package/dist/field/lexical/config/server/sanitize.d.ts.map +1 -1
  305. package/dist/field/lexical/config/server/sanitize.js +23 -8
  306. package/dist/field/lexical/config/server/sanitize.js.map +1 -1
  307. package/dist/field/lexical/config/types.d.ts +1 -1
  308. package/dist/field/lexical/config/types.d.ts.map +1 -1
  309. package/dist/field/lexical/config/types.js.map +1 -1
  310. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarButton/index.d.ts.map +1 -1
  311. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarButton/index.js +3 -6
  312. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarButton/index.js.map +1 -1
  313. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarDropdown/DropDown.d.ts.map +1 -1
  314. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarDropdown/DropDown.js +3 -6
  315. package/dist/field/lexical/plugins/FloatingSelectToolbar/ToolbarDropdown/DropDown.js.map +1 -1
  316. package/dist/field/lexical/plugins/FloatingSelectToolbar/index.d.ts.map +1 -1
  317. package/dist/field/lexical/plugins/FloatingSelectToolbar/index.js +27 -29
  318. package/dist/field/lexical/plugins/FloatingSelectToolbar/index.js.map +1 -1
  319. package/dist/field/lexical/plugins/MarkdownShortcut/index.d.ts.map +1 -1
  320. package/dist/field/lexical/plugins/MarkdownShortcut/index.js +1 -2
  321. package/dist/field/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
  322. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts.map +1 -1
  323. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +3 -6
  324. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  325. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts.map +1 -1
  326. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +3 -6
  327. package/dist/field/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  328. package/dist/field/lexical/plugins/SlashMenu/index.d.ts.map +1 -1
  329. package/dist/field/lexical/plugins/SlashMenu/index.js +1 -2
  330. package/dist/field/lexical/plugins/SlashMenu/index.js.map +1 -1
  331. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.d.ts.map +1 -1
  332. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.js +13 -10
  333. package/dist/field/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  334. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.d.ts.map +1 -1
  335. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.js +1 -2
  336. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/getNodeCloseToPoint.js.map +1 -1
  337. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  338. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js +10 -7
  339. package/dist/field/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  340. package/dist/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.d.ts +9 -0
  341. package/dist/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.d.ts.map +1 -0
  342. package/dist/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.js +35 -0
  343. package/dist/field/lexical/plugins/handles/utils/doesLineHeightAffectElement.js.map +1 -0
  344. package/dist/field/lexical/plugins/handles/utils/getTopLevelNodeKeys.d.ts.map +1 -1
  345. package/dist/field/lexical/plugins/handles/utils/getTopLevelNodeKeys.js +1 -2
  346. package/dist/field/lexical/plugins/handles/utils/getTopLevelNodeKeys.js.map +1 -1
  347. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.d.ts +1 -1
  348. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.d.ts.map +1 -1
  349. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.js +17 -7
  350. package/dist/field/lexical/plugins/handles/utils/setHandlePosition.js.map +1 -1
  351. package/dist/field/lexical/theme/EditorTheme.scss +11 -8
  352. package/dist/field/lexical/ui/ContentEditable.d.ts.map +1 -1
  353. package/dist/field/lexical/ui/ContentEditable.js +1 -2
  354. package/dist/field/lexical/ui/ContentEditable.js.map +1 -1
  355. package/dist/field/lexical/ui/icons/HorizontalRule/index.d.ts +3 -0
  356. package/dist/field/lexical/ui/icons/HorizontalRule/index.d.ts.map +1 -0
  357. package/dist/field/lexical/ui/icons/HorizontalRule/index.js +19 -0
  358. package/dist/field/lexical/ui/icons/HorizontalRule/index.js.map +1 -0
  359. package/dist/field/lexical/utils/getSelectedNode.d.ts.map +1 -1
  360. package/dist/field/lexical/utils/getSelectedNode.js +1 -2
  361. package/dist/field/lexical/utils/getSelectedNode.js.map +1 -1
  362. package/dist/field/lexical/utils/nodeFormat.d.ts +2 -1
  363. package/dist/field/lexical/utils/nodeFormat.d.ts.map +1 -1
  364. package/dist/field/lexical/utils/nodeFormat.js.map +1 -1
  365. package/dist/field/lexical/utils/setFloatingElemPosition.d.ts +1 -1
  366. package/dist/field/lexical/utils/setFloatingElemPosition.d.ts.map +1 -1
  367. package/dist/field/lexical/utils/setFloatingElemPosition.js +15 -13
  368. package/dist/field/lexical/utils/setFloatingElemPosition.js.map +1 -1
  369. package/dist/field/lexical/utils/url.d.ts.map +1 -1
  370. package/dist/field/lexical/utils/url.js +3 -0
  371. package/dist/field/lexical/utils/url.js.map +1 -1
  372. package/dist/forEachNodeRecursively.d.ts +10 -0
  373. package/dist/forEachNodeRecursively.d.ts.map +1 -0
  374. package/dist/forEachNodeRecursively.js +24 -0
  375. package/dist/forEachNodeRecursively.js.map +1 -0
  376. package/dist/generateComponentMap.d.ts.map +1 -1
  377. package/dist/generateComponentMap.js +16 -22
  378. package/dist/generateComponentMap.js.map +1 -1
  379. package/dist/generateSchemaMap.d.ts.map +1 -1
  380. package/dist/generateSchemaMap.js +4 -12
  381. package/dist/generateSchemaMap.js.map +1 -1
  382. package/dist/index.d.ts +6 -5
  383. package/dist/index.d.ts.map +1 -1
  384. package/dist/index.js +260 -173
  385. package/dist/index.js.map +1 -1
  386. package/dist/populate/defaultValue.d.ts.map +1 -1
  387. package/dist/populate/defaultValue.js +1 -0
  388. package/dist/populate/defaultValue.js.map +1 -1
  389. package/dist/populate/populate.d.ts +3 -3
  390. package/dist/populate/populate.d.ts.map +1 -1
  391. package/dist/populate/populate.js.map +1 -1
  392. package/dist/populate/populateLexicalPopulationPromises.d.ts +12 -0
  393. package/dist/populate/populateLexicalPopulationPromises.d.ts.map +1 -0
  394. package/dist/populate/populateLexicalPopulationPromises.js +35 -0
  395. package/dist/populate/populateLexicalPopulationPromises.js.map +1 -0
  396. package/dist/populate/recurseNestedFields.d.ts +7 -4
  397. package/dist/populate/recurseNestedFields.d.ts.map +1 -1
  398. package/dist/populate/recurseNestedFields.js +3 -5
  399. package/dist/populate/recurseNestedFields.js.map +1 -1
  400. package/dist/scss/app.scss +2 -3
  401. package/dist/scss/vars.scss +0 -7
  402. package/dist/types.d.ts +11 -5
  403. package/dist/types.d.ts.map +1 -1
  404. package/dist/types.js.map +1 -1
  405. package/dist/validate/index.d.ts +1 -1
  406. package/dist/validate/index.d.ts.map +1 -1
  407. package/package.json +47 -46
  408. package/components.d.ts +0 -6
  409. package/components.js +0 -7
  410. package/dist/populate/richTextRelationshipPromise.d.ts +0 -23
  411. package/dist/populate/richTextRelationshipPromise.d.ts.map +0 -1
  412. package/dist/populate/richTextRelationshipPromise.js +0 -68
  413. package/dist/populate/richTextRelationshipPromise.js.map +0 -1
  414. package/dist/scss/fonts.scss +0 -75
  415. package/src/index.ts +0 -423
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/field/features/link/nodes/LinkNode.ts"],"sourcesContent":["import type { BaseSelection } from 'lexical'\n\nimport lexicalUtilsImport from '@lexical/utils'\nconst { addClassNamesToElement, isHTMLAnchorElement } = lexicalUtilsImport\n\nimport lexicalImport from 'lexical'\nconst {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n ElementNode,\n createCommand,\n} = lexicalImport\n\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport type { LinkPayload } from '../plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n\n constructor({\n fields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: undefined,\n },\n key,\n }: {\n fields: LinkFields\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n }\n\n static clone(node: LinkNode): LinkNode {\n return new LinkNode({\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static getType(): string {\n return 'link'\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static importJSON(serializedNode: SerializedLinkNode): LinkNode {\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n const node = $createLinkNode({\n fields: serializedNode.fields,\n })\n node.setFormat(serializedNode.format)\n node.setIndent(serializedNode.indent)\n node.setDirection(serializedNode.direction)\n return node\n }\n\n canBeEmpty(): false {\n return false\n }\n\n canInsertTextAfter(): false {\n return false\n }\n\n canInsertTextBefore(): false {\n return false\n }\n\n createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n exportJSON(): SerializedLinkNode {\n return {\n ...super.exportJSON(),\n type: this.getType(),\n fields: this.getFields(),\n version: 2,\n }\n }\n\n extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n insertNewAfter(selection: RangeSelection, restoreSelection = true): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n // eslint-disable-next-line no-script-url\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): void {\n const writable = this.getWritable()\n writable.__fields = fields\n }\n\n updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n}\n\nfunction convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ fields }: { fields: LinkFields }): LinkNode {\n return $applyNodeReplacement(new LinkNode({ fields }))\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function toggleLink(payload: LinkPayload): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && !payload.selectedNodes.length) {\n return\n }\n const nodes = $isRangeSelection(selection) ? selection.extract() : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n for (let i = 0; i < children.length; i += 1) {\n parent.insertBefore(children[i])\n }\n\n parent.remove()\n }\n })\n } else {\n // Add or merge LinkNodes\n if (nodes.length === 1) {\n const firstNode = nodes[0]\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n\n for (let i = 0; i < children.length; i += 1) {\n linkNode.append(children[i])\n }\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n }\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null && (parent = parent.getParent()) !== null && !predicate(parent));\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n"],"names":["lexicalUtilsImport","addClassNamesToElement","isHTMLAnchorElement","lexicalImport","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","ElementNode","createCommand","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","constructor","fields","doc","linkType","newTab","url","undefined","key","clone","node","__key","getType","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","version","value","id","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","target","rel","manageRel","theme","link","exportJSON","type","getFields","extractWithChild","child","selection","destination","anchorNode","anchor","getNode","focusNode","focus","isParentOf","getTextContent","length","getLatest","insertNewAfter","restoreSelection","getParentOrThrow","linkNode","append","isInline","parsedUrl","URL","has","protocol","e","setFields","writable","getWritable","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","i","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/field/features/link/nodes/LinkNode.ts"],"sourcesContent":["import type { BaseSelection } from 'lexical'\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from '@lexical/utils'\nimport {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n ElementNode,\n createCommand,\n} from 'lexical'\n\nimport type { LinkPayload } from '../plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n\n constructor({\n fields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: undefined,\n },\n key,\n }: {\n fields: LinkFields\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n }\n\n static clone(node: LinkNode): LinkNode {\n return new LinkNode({\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static getType(): string {\n return 'link'\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static importJSON(serializedNode: SerializedLinkNode): LinkNode {\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n const node = $createLinkNode({\n fields: serializedNode.fields,\n })\n node.setFormat(serializedNode.format)\n node.setIndent(serializedNode.indent)\n node.setDirection(serializedNode.direction)\n return node\n }\n\n canBeEmpty(): false {\n return false\n }\n\n canInsertTextAfter(): false {\n return false\n }\n\n canInsertTextBefore(): false {\n return false\n }\n\n createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n exportJSON(): SerializedLinkNode {\n return {\n ...super.exportJSON(),\n type: this.getType(),\n fields: this.getFields(),\n version: 2,\n }\n }\n\n extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n insertNewAfter(selection: RangeSelection, restoreSelection = true): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n // eslint-disable-next-line no-script-url\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): void {\n const writable = this.getWritable()\n writable.__fields = fields\n }\n\n updateDOM(prevNode: LinkNode, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n}\n\nfunction convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ fields }: { fields: LinkFields }): LinkNode {\n return $applyNodeReplacement(new LinkNode({ fields }))\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function toggleLink(payload: LinkPayload): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && !payload.selectedNodes.length) {\n return\n }\n const nodes = $isRangeSelection(selection) ? selection.extract() : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n for (let i = 0; i < children.length; i += 1) {\n parent.insertBefore(children[i])\n }\n\n parent.remove()\n }\n })\n } else {\n // Add or merge LinkNodes\n if (nodes.length === 1) {\n const firstNode = nodes[0]\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n\n for (let i = 0; i < children.length; i += 1) {\n linkNode.append(children[i])\n }\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n }\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null && (parent = parent.getParent()) !== null && !predicate(parent));\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n"],"names":["addClassNamesToElement","isHTMLAnchorElement","$applyNodeReplacement","$createTextNode","$getSelection","$isElementNode","$isRangeSelection","ElementNode","createCommand","SUPPORTED_URL_PROTOCOLS","Set","LinkNode","__fields","constructor","fields","doc","linkType","newTab","url","undefined","key","clone","node","__key","getType","importDOM","a","conversion","convertAnchorElement","priority","importJSON","serializedNode","version","value","id","$createLinkNode","setFormat","format","setIndent","indent","setDirection","direction","canBeEmpty","canInsertTextAfter","canInsertTextBefore","createDOM","config","element","document","createElement","href","sanitizeUrl","target","rel","manageRel","theme","link","exportJSON","type","getFields","extractWithChild","child","selection","destination","anchorNode","anchor","getNode","focusNode","focus","isParentOf","getTextContent","length","getLatest","insertNewAfter","restoreSelection","getParentOrThrow","linkNode","append","isInline","parsedUrl","URL","has","protocol","e","setFields","writable","getWritable","updateDOM","prevNode","removeAttribute","domNode","content","textContent","getAttribute","$isLinkNode","TOGGLE_LINK_COMMAND","toggleLink","payload","selectedNodes","nodes","extract","forEach","parent","getParent","children","getChildren","i","insertBefore","remove","firstNode","$getLinkAncestor","text","getLastChild","prevParent","is","getPreviousSibling","insertAfter","$getAncestor","ancestor","predicate","input","action","result","mutableInput","includes","re","RegExp","replace","trim"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/link/plugins/autoLink/index.tsx"],"names":[],"mappings":";AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQtD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;EAUrB;AA4XD,wBAAgB,cAAc,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAMnD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/link/plugins/autoLink/index.tsx"],"names":[],"mappings":";AAkBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAQtD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;EAUrB;AA4XD,wBAAgB,cAAc,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAMnD"}
@@ -1,10 +1,7 @@
1
1
  'use client';
2
- import lexicalComposerContextImport from '@lexical/react/LexicalComposerContext.js';
3
- const { useLexicalComposerContext } = lexicalComposerContextImport;
4
- import lexicalUtilsImport from '@lexical/utils';
5
- const { mergeRegister } = lexicalUtilsImport;
6
- import lexicalImport from 'lexical';
7
- const { $createTextNode, $getSelection, $isElementNode, $isLineBreakNode, $isNodeSelection, $isRangeSelection, $isTextNode, TextNode: TextNodeValue } = lexicalImport;
2
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
3
+ import { mergeRegister } from '@lexical/utils';
4
+ import { $createTextNode, $getSelection, $isElementNode, $isLineBreakNode, $isNodeSelection, $isRangeSelection, $isTextNode, TextNode as TextNodeValue } from 'lexical';
8
5
  import { useEffect } from 'react';
9
6
  import { invariant } from '../../../../lexical/utils/invariant.js';
10
7
  import { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../nodes/AutoLinkNode.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/field/features/link/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport lexicalComposerContextImport from '@lexical/react/LexicalComposerContext.js'\nconst { useLexicalComposerContext } = lexicalComposerContextImport\n\nimport lexicalUtilsImport from '@lexical/utils'\nconst { mergeRegister } = lexicalUtilsImport\n\nimport lexicalImport from 'lexical'\nconst {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode: TextNodeValue,\n} = lexicalImport\n\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\n\nimport { type TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { LinkFields } from '../../nodes/types.js'\n\nimport { invariant } from '../../../../lexical/utils/invariant.js'\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) return null\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (let i = 0; i < matchers.length; i++) {\n const match = matchers[i](text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string): boolean {\n return PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0])\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1])\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction createAutoLinkNode(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields: LinkFields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n }\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n let remainingTextNode = nodes[0]\n let linkTextNode\n if (startIndex === 0) {\n ;[linkTextNode, remainingTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode, remainingTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes = []\n let remainingTextNode\n for (let i = 1; i < nodes.length; i++) {\n const currentNode = nodes[i]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n linkNodes.push(linkTextNode)\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n }\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n return undefined\n}\n\nfunction handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = createAutoLinkNode(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j])\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport function AutoLinkPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"names":["lexicalComposerContextImport","useLexicalComposerContext","lexicalUtilsImport","mergeRegister","lexicalImport","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","invariant","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","i","PUNCTUATION_OR_SPACE","isSeparator","char","test","endsWithSeparator","textContent","startsWithSeparator","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","createAutoLinkNode","fields","linkType","linkNode","remainingTextNode","linkTextNode","splitText","textNode","setFormat","getFormat","setDetail","getDetail","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","endNode","selection","selectedTextNode","getNodes","find","undefined","select","anchor","focus","handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","hasNodes","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","startsWith","AutoLinkPlugin"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/field/features/link/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode as TextNodeValue,\n} from 'lexical'\nimport { type TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { LinkFields } from '../../nodes/types.js'\n\nimport { invariant } from '../../../../lexical/utils/invariant.js'\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) return null\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (let i = 0; i < matchers.length; i++) {\n const match = matchers[i](text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string): boolean {\n return PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0])\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1])\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction createAutoLinkNode(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields: LinkFields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n }\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n let remainingTextNode = nodes[0]\n let linkTextNode\n if (startIndex === 0) {\n ;[linkTextNode, remainingTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode, remainingTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes = []\n let remainingTextNode\n for (let i = 1; i < nodes.length; i++) {\n const currentNode = nodes[i]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n linkNodes.push(linkTextNode)\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n }\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n return undefined\n}\n\nfunction handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = createAutoLinkNode(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j])\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport function AutoLinkPlugin(): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"names":["useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","invariant","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","i","PUNCTUATION_OR_SPACE","isSeparator","char","test","endsWithSeparator","textContent","startsWithSeparator","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","createAutoLinkNode","fields","linkType","linkNode","remainingTextNode","linkTextNode","splitText","textNode","setFormat","getFormat","setDetail","getDetail","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","endNode","selection","selectedTextNode","getNodes","find","undefined","select","anchor","focus","handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","hasNodes","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","startsWith","AutoLinkPlugin"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAGA,SAASA,yBAAyB,QAAQ,2CAA0C;AACpF,SAASC,aAAa,QAAQ,iBAAgB;AAC9C,SACEC,eAAe,EACfC,aAAa,EACbC,cAAc,EACdC,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,WAAW,EACXC,YAAYC,aAAa,QACpB,UAAS;AAEhB,SAASC,SAAS,QAAQ,QAAO;AAIjC,SAASC,SAAS,QAAQ,yCAAwC;AAClE,SAASC,mBAAmB,EAAEC,eAAe,EAAEC,YAAY,QAAQ,8BAA6B;AAChG,SAASC,WAAW,QAAQ,0BAAyB;AAcrD,OAAO,SAASC,4BACdC,MAAc,EACdC,iBAA2C,CAACC,OAASA,IAAI;IAEzD,OAAO,CAACA;QACN,MAAMC,QAAQH,OAAOI,IAAI,CAACF;QAC1B,IAAIC,UAAU,MAAM,OAAO;QAC3B,OAAO;YACLE,OAAOF,MAAME,KAAK;YAClBC,QAAQH,KAAK,CAAC,EAAE,CAACG,MAAM;YACvBJ,MAAMC,KAAK,CAAC,EAAE;YACdI,KAAKN,eAAeE,KAAK,CAAC,EAAE;QAC9B;IACF;AACF;AAEA,SAASK,eAAeN,IAAY,EAAEO,QAAuB;IAC3D,IAAK,IAAIC,IAAI,GAAGA,IAAID,SAASH,MAAM,EAAEI,IAAK;QACxC,MAAMP,QAAQM,QAAQ,CAACC,EAAE,CAACR;QAE1B,IAAIC,SAAS,MAAM;YACjB,OAAOA;QACT;IACF;IAEA,OAAO;AACT;AAEA,MAAMQ,uBAAuB;AAE7B,SAASC,YAAYC,IAAY;IAC/B,OAAOF,qBAAqBG,IAAI,CAACD;AACnC;AAEA,SAASE,kBAAkBC,WAAmB;IAC5C,OAAOJ,YAAYI,WAAW,CAACA,YAAYV,MAAM,GAAG,EAAE;AACxD;AAEA,SAASW,oBAAoBD,WAAmB;IAC9C,OAAOJ,YAAYI,WAAW,CAAC,EAAE;AACnC;AAEA,SAASE,oBAAoBC,IAAiB;IAC5C,IAAIC,eAAeD,KAAKE,kBAAkB;IAC1C,IAAInC,eAAekC,eAAe;QAChCA,eAAeA,aAAaE,iBAAiB;IAC/C;IACA,OACEF,iBAAiB,QACjBjC,iBAAiBiC,iBAChB9B,YAAY8B,iBAAiBL,kBAAkBK,aAAaG,cAAc;AAE/E;AAEA,SAASC,gBAAgBL,IAAiB;IACxC,IAAIM,WAAWN,KAAKO,cAAc;IAClC,IAAIxC,eAAeuC,WAAW;QAC5BA,WAAWA,SAASE,kBAAkB;IACxC;IACA,OACEF,aAAa,QACbtC,iBAAiBsC,aAChBnC,YAAYmC,aAAaR,oBAAoBQ,SAASF,cAAc;AAEzE;AAEA,SAASK,uBACPC,UAAkB,EAClBC,QAAgB,EAChB5B,IAAY,EACZ6B,KAAiB;IAEjB,MAAMC,uBACJH,aAAa,IAAIjB,YAAYV,IAAI,CAAC2B,aAAa,EAAE,IAAIX,oBAAoBa,KAAK,CAAC,EAAE;IACnF,IAAI,CAACC,sBAAsB;QACzB,OAAO;IACT;IAEA,MAAMC,sBACJH,WAAW5B,KAAKI,MAAM,GAAGM,YAAYV,IAAI,CAAC4B,SAAS,IAAIN,gBAAgBO,KAAK,CAACA,MAAMzB,MAAM,GAAG,EAAE;IAChG,OAAO2B;AACT;AAEA,SAASC,qBACPH,KAAiB,EACjBI,UAAkB,EAClBC,QAAgB;IAOhB,MAAMC,wBAAoC,EAAE;IAC5C,MAAMC,gBAA4B,EAAE;IACpC,MAAMC,uBAAmC,EAAE;IAC3C,IAAIC,iBAAiB;IAErB,IAAIC,gBAAgB;IACpB,MAAMC,eAAe;WAAIX;KAAM;IAE/B,MAAOW,aAAapC,MAAM,GAAG,EAAG;QAC9B,MAAMqC,cAAcD,YAAY,CAAC,EAAE;QACnC,MAAME,kBAAkBD,YAAYpB,cAAc;QAClD,MAAMsB,oBAAoBD,gBAAgBtC,MAAM;QAChD,MAAMwC,mBAAmBL;QACzB,MAAMM,iBAAiBN,gBAAgBI;QAEvC,IAAIE,kBAAkBZ,YAAY;YAChCE,sBAAsBW,IAAI,CAACL;YAC3BH,kBAAkBK;QACpB,OAAO,IAAIC,oBAAoBV,UAAU;YACvCG,qBAAqBS,IAAI,CAACL;QAC5B,OAAO;YACLL,cAAcU,IAAI,CAACL;QACrB;QACAF,iBAAiBI;QACjBH,aAAaO,KAAK;IACpB;IACA,OAAO;QAACT;QAAgBH;QAAuBC;QAAeC;KAAqB;AACrF;AAEA,SAASW,mBACPnB,KAAiB,EACjBI,UAAkB,EAClBC,QAAgB,EAChBjC,KAAwB;IAExB,MAAMgD,SAAqB;QACzBC,UAAU;QACV7C,KAAKJ,MAAMI,GAAG;QACd,GAAGJ,MAAMgD,MAAM;IACjB;IAEA,MAAME,WAAW1D,oBAAoB;QAAEwD;IAAO;IAC9C,IAAIpB,MAAMzB,MAAM,KAAK,GAAG;QACtB,IAAIgD,oBAAoBvB,KAAK,CAAC,EAAE;QAChC,IAAIwB;QACJ,IAAIpB,eAAe,GAAG;YACnB,CAACoB,cAAcD,kBAAkB,GAAGA,kBAAkBE,SAAS,CAACpB;QACnE,OAAO;YACJ,GAAGmB,cAAcD,kBAAkB,GAAGA,kBAAkBE,SAAS,CAACrB,YAAYC;QACjF;QACA,MAAMqB,WAAWzE,gBAAgBmB,MAAMD,IAAI;QAC3CuD,SAASC,SAAS,CAACH,aAAaI,SAAS;QACzCF,SAASG,SAAS,CAACL,aAAaM,SAAS;QACzCR,SAASS,MAAM,CAACL;QAChBF,aAAaQ,OAAO,CAACV;QACrB,OAAOC;IACT,OAAO,IAAIvB,MAAMzB,MAAM,GAAG,GAAG;QAC3B,MAAM0D,gBAAgBjC,KAAK,CAAC,EAAE;QAC9B,IAAIkC,SAASD,cAAczC,cAAc,GAAGjB,MAAM;QAClD,IAAI4D;QACJ,IAAI/B,eAAe,GAAG;YACpB+B,oBAAoBF;QACtB,OAAO;YACJ,GAAGE,kBAAkB,GAAGF,cAAcR,SAAS,CAACrB;QACnD;QACA,MAAMgC,YAAY,EAAE;QACpB,IAAIb;QACJ,IAAK,IAAI5C,IAAI,GAAGA,IAAIqB,MAAMzB,MAAM,EAAEI,IAAK;YACrC,MAAMiC,cAAcZ,KAAK,CAACrB,EAAE;YAC5B,MAAMkC,kBAAkBD,YAAYpB,cAAc;YAClD,MAAMsB,oBAAoBD,gBAAgBtC,MAAM;YAChD,MAAMwC,mBAAmBmB;YACzB,MAAMlB,iBAAiBkB,SAASpB;YAChC,IAAIC,mBAAmBV,UAAU;gBAC/B,IAAIW,kBAAkBX,UAAU;oBAC9B+B,UAAUnB,IAAI,CAACL;gBACjB,OAAO;oBACL,MAAM,CAACY,cAAca,QAAQ,GAAGzB,YAAYa,SAAS,CAACpB,WAAWU;oBACjEqB,UAAUnB,IAAI,CAACO;oBACfD,oBAAoBc;gBACtB;YACF;YACAH,UAAUpB;QACZ;QACA,MAAMwB,YAAYpF;QAClB,MAAMqF,mBAAmBD,YAAYA,UAAUE,QAAQ,GAAGC,IAAI,CAAClF,eAAemF;QAC9E,MAAMhB,WAAWzE,gBAAgBkF,kBAAkB3C,cAAc;QACjEkC,SAASC,SAAS,CAACQ,kBAAkBP,SAAS;QAC9CF,SAASG,SAAS,CAACM,kBAAkBL,SAAS;QAC9CR,SAASS,MAAM,CAACL,aAAaU;QAC7B,0EAA0E;QAC1E,uCAAuC;QACvC,IAAIG,oBAAoBA,qBAAqBJ,mBAAmB;YAC9D,IAAI7E,kBAAkBgF,YAAY;gBAChCZ,SAASiB,MAAM,CAACL,UAAUM,MAAM,CAACV,MAAM,EAAEI,UAAUO,KAAK,CAACX,MAAM;YACjE,OAAO,IAAI7E,iBAAiBiF,YAAY;gBACtCZ,SAASiB,MAAM,CAAC,GAAGjB,SAASlC,cAAc,GAAGjB,MAAM;YACrD;QACF;QACA4D,kBAAkBH,OAAO,CAACV;QAC1B,OAAOC;IACT;IACA,OAAOmB;AACT;AAEA,SAASI,mBACP9C,KAAiB,EACjBtB,QAAuB,EACvBqE,QAAuB;IAEvB,IAAIpC,eAAe;WAAIX;KAAM;IAC7B,MAAMgD,cAAcrC,aAAasC,GAAG,CAAC,CAAC7D,OAASA,KAAKI,cAAc,IAAI0D,IAAI,CAAC;IAC3E,IAAI/E,OAAO6E;IAEX,IAAI5E;IACJ,IAAI+E,kBAAkB;IAEtB,MAAO,AAAC/E,CAAAA,QAAQK,eAAeN,MAAMO,SAAQ,KAAM,QAAQN,UAAU,KAAM;QACzE,MAAM0B,aAAqB1B,MAAME,KAAK;QACtC,MAAM8E,cAAsBhF,MAAMG,MAAM;QACxC,MAAMwB,WAAWD,aAAasD;QAC9B,MAAMC,UAAUxD,uBACdsD,kBAAkBrD,YAClBqD,kBAAkBpD,UAClBiD,aACArC;QAGF,IAAI0C,SAAS;YACX,MAAM,CAAC5C,kBAAkBF,eAAeC,qBAAqB,GAAGL,qBAC9DQ,cACAwC,kBAAkBrD,YAClBqD,kBAAkBpD;YAGpB,MAAMuD,mBAAmBH,kBAAkBrD,aAAaW;YACxD,MAAM8C,iBAAiBJ,kBAAkBpD,WAAWU;YACpD,MAAMc,oBAAoBJ,mBACxBZ,eACA+C,kBACAC,gBACAnF;YAEFuC,eAAeY,oBACX;gBAACA;mBAAsBf;aAAqB,GAC5CA;YACJuC,SAAS3E,MAAMI,GAAG,EAAE;YACpB2E,kBAAkB;QACpB,OAAO;YACLA,mBAAmBpD;QACrB;QAEA5B,OAAOA,KAAKqF,SAAS,CAACzD;IACxB;AACF;AAEA,SAAS0D,eACPnC,QAAsB,EACtB5C,QAAuB,EACvBqE,QAAuB;IAEvB,iCAAiC;IACjC,MAAMW,WAAWpC,SAASqC,WAAW;IACrC,MAAMC,iBAAiBF,SAASnF,MAAM;IACtC,IAAK,IAAII,IAAI,GAAGA,IAAIiF,gBAAgBjF,IAAK;QACvC,MAAMkF,QAAQH,QAAQ,CAAC/E,EAAE;QACzB,IAAI,CAACpB,YAAYsG,UAAU,CAACA,MAAMC,YAAY,IAAI;YAChDC,oBAAoBzC;YACpByB,SAAS,MAAMzB,SAAS0C,SAAS,IAAIxF,OAAO;YAC5C;QACF;IACF;IAEA,mCAAmC;IACnC,MAAML,OAAOmD,SAAS9B,cAAc;IACpC,MAAMpB,QAAQK,eAAeN,MAAMO;IACnC,IAAIN,UAAU,QAAQA,MAAMD,IAAI,KAAKA,MAAM;QACzC4F,oBAAoBzC;QACpByB,SAAS,MAAMzB,SAAS0C,SAAS,IAAIxF,OAAO;QAC5C;IACF;IAEA,kBAAkB;IAClB,IAAI,CAACW,oBAAoBmC,aAAa,CAAC7B,gBAAgB6B,WAAW;QAChEyC,oBAAoBzC;QACpByB,SAAS,MAAMzB,SAAS0C,SAAS,IAAIxF,OAAO;QAC5C;IACF;IAEA,MAAMA,MAAM8C,SAAS0C,SAAS,IAAIxF;IAClC,IAAIA,QAAQJ,OAAOI,KAAK;QACtB,MAAMyF,OAAO3C,SAAS0C,SAAS;QAC/BC,KAAKzF,GAAG,GAAGJ,OAAOI;QAClB8C,SAAS4C,SAAS,CAACD;QACnBlB,SAAS3E,MAAMI,GAAG,EAAEA,OAAO;IAC7B;AACF;AAEA,8EAA8E;AAC9E,yEAAyE;AACzE,SAAS2F,mBACPzC,QAAkB,EAClBhD,QAAuB,EACvBqE,QAAuB;IAEvB,MAAMqB,kBAAkB1C,SAASpC,kBAAkB;IACnD,MAAM+E,cAAc3C,SAAS/B,cAAc;IAC3C,MAAMxB,OAAOuD,SAASlC,cAAc;IAEpC,IAAI3B,gBAAgBuG,oBAAoB,CAAClF,oBAAoBf,OAAO;QAClEiG,gBAAgBrC,MAAM,CAACL;QACvB+B,eAAeW,iBAAiB1F,UAAUqE;QAC1CA,SAAS,MAAMqB,gBAAgBJ,SAAS,IAAIxF,OAAO;IACrD;IAEA,IAAIX,gBAAgBwG,gBAAgB,CAACrF,kBAAkBb,OAAO;QAC5D4F,oBAAoBM;QACpBZ,eAAeY,aAAa3F,UAAUqE;QACtCA,SAAS,MAAMsB,YAAYL,SAAS,IAAIxF,OAAO;IACjD;AACF;AAEA,SAASuF,oBAAoB3E,IAAiB;IAC5C,MAAMsE,WAAWtE,KAAKuE,WAAW;IACjC,MAAMC,iBAAiBF,SAASnF,MAAM;IAEtC,IAAK,IAAI+F,IAAIV,iBAAiB,GAAGU,KAAK,GAAGA,IAAK;QAC5ClF,KAAKmF,WAAW,CAACb,QAAQ,CAACY,EAAE;IAC9B;IAEAlF,KAAKoF,MAAM;IACX,OAAOd,SAAST,GAAG,CAAC,CAACY,QAAUA,MAAMY,SAAS;AAChD;AAEA,SAASC,oBAAoBhD,QAAkB;IAC7C,sFAAsF;IACtF,MAAMiD,mBAAmB;QAACjD;KAAS;IACnC,IAAI2C,cAAc3C,SAAS/B,cAAc;IACzC,MAAO0E,gBAAgB,QAAQ9G,YAAY8G,gBAAgBA,YAAYP,YAAY,GAAI;QACrFa,iBAAiB1D,IAAI,CAACoD;QACtB,IAAI,KAAKtF,IAAI,CAACsF,YAAY7E,cAAc,KAAK;YAC3C;QACF;QACA6E,cAAcA,YAAY1E,cAAc;IAC1C;IACA,OAAOgF;AACT;AAEA,SAASC,YACPC,MAAqB,EACrBnG,QAAuB,EACvBqE,QAAwB;IAExBrF,UAAU;QACR,IAAI,CAACmH,OAAOC,QAAQ,CAAC;YAAChH;SAAa,GAAG;YACpCH,UAAU,OAAO;QACnB;QAEA,MAAMoH,kBAAkB,CAACvG,KAAoBwG;YAC3C,IAAIjC,YAAY,MAAM;gBACpBA,SAASvE,KAAKwG;YAChB;QACF;QAEA,OAAOhI,cACL6H,OAAOI,qBAAqB,CAACxH,eAAe,CAACiE;YAC3C,MAAMwD,SAASxD,SAASyD,gBAAgB;YACxC,MAAMC,WAAW1D,SAASpC,kBAAkB;YAC5C,IAAIzB,gBAAgBqH,SAAS;gBAC3BzB,eAAeyB,QAAQxG,UAAUqG;YACnC,OAAO,IAAI,CAAChH,YAAYmH,SAAS;gBAC/B,IACExD,SAASoC,YAAY,MACpB5E,CAAAA,oBAAoBwC,SAASlC,cAAc,OAAO,CAAC3B,gBAAgBuH,SAAQ,GAC5E;oBACA,MAAMT,mBAAmBD,oBAAoBhD;oBAC7CoB,mBAAmB6B,kBAAkBjG,UAAUqG;gBACjD;gBAEAZ,mBAAmBzC,UAAUhD,UAAUqG;YACzC;QACF;IAEJ,GAAG;QAACF;QAAQnG;QAAUqE;KAAS;AACjC;AAEA,MAAMsC,YACJ;AAEF,MAAMC,cACJ;AAEF,MAAMC,WAAW;IACfvH,4BAA4BqH,WAAW,CAAClH;QACtC,OAAOA,KAAKqH,UAAU,CAAC,UAAUrH,OAAO,CAAC,QAAQ,EAAEA,KAAK,CAAC;IAC3D;IACAH,4BAA4BsH,aAAa,CAACnH;QACxC,OAAO,CAAC,OAAO,EAAEA,KAAK,CAAC;IACzB;CACD;AAED,OAAO,SAASsH;IACd,MAAM,CAACZ,OAAO,GAAG9H;IAEjB6H,YAAYC,QAAQU;IAEpB,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,8BAA8B,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAE7E,CAAA"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,8BAA8B,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAE7E,CAAA"}
@@ -1,5 +1,4 @@
1
- import lexicalImport from 'lexical';
2
- const { createCommand } = lexicalImport;
1
+ import { createCommand } from 'lexical';
3
2
  export const TOGGLE_LINK_WITH_MODAL_COMMAND = createCommand('TOGGLE_LINK_WITH_MODAL_COMMAND');
4
3
 
5
4
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.ts"],"sourcesContent":["import type { LexicalCommand } from 'lexical'\n\nimport lexicalImport from 'lexical'\nconst { createCommand } = lexicalImport\n\nimport type { LinkPayload } from '../types.js'\n\nexport const TOGGLE_LINK_WITH_MODAL_COMMAND: LexicalCommand<LinkPayload | null> = createCommand(\n 'TOGGLE_LINK_WITH_MODAL_COMMAND',\n)\n"],"names":["lexicalImport","createCommand","TOGGLE_LINK_WITH_MODAL_COMMAND"],"rangeMappings":";;","mappings":"AAEA,OAAOA,mBAAmB,UAAS;AACnC,MAAM,EAAEC,aAAa,EAAE,GAAGD;AAI1B,OAAO,MAAME,iCAAqED,cAChF,kCACD"}
1
+ {"version":3,"sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/commands.ts"],"sourcesContent":["import type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { LinkPayload } from '../types.js'\n\nexport const TOGGLE_LINK_WITH_MODAL_COMMAND: LexicalCommand<LinkPayload | null> = createCommand(\n 'TOGGLE_LINK_WITH_MODAL_COMMAND',\n)\n"],"names":["createCommand","TOGGLE_LINK_WITH_MODAL_COMMAND"],"rangeMappings":";","mappings":"AAEA,SAASA,aAAa,QAAQ,UAAS;AAIvC,OAAO,MAAMC,iCAAqED,cAChF,kCACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAcvE,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAiSvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAevE,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAmUvF"}
@@ -1,16 +1,14 @@
1
1
  'use client';
2
2
  import * as facelessUIImport from '@faceless-ui/modal';
3
- import lexicalComposerContextImport from '@lexical/react/LexicalComposerContext.js';
4
- const { useLexicalComposerContext } = lexicalComposerContextImport;
5
- import lexicalUtilsImport from '@lexical/utils';
6
- const { $findMatchingParent, mergeRegister } = lexicalUtilsImport;
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
+ import { $findMatchingParent, mergeRegister } from '@lexical/utils';
7
5
  import { getTranslation } from '@payloadcms/translations';
8
- import lexicalImport from 'lexical';
9
- const { $getSelection, $isRangeSelection, COMMAND_PRIORITY_HIGH, COMMAND_PRIORITY_LOW, KEY_ESCAPE_COMMAND, SELECTION_CHANGE_COMMAND } = lexicalImport;
10
6
  import { formatDrawerSlug } from '@payloadcms/ui/elements/Drawer';
11
7
  import { useConfig } from '@payloadcms/ui/providers/Config';
12
8
  import { useEditDepth } from '@payloadcms/ui/providers/EditDepth';
13
9
  import { useTranslation } from '@payloadcms/ui/providers/Translation';
10
+ import { $isLineBreakNode } from 'lexical';
11
+ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_HIGH, COMMAND_PRIORITY_LOW, KEY_ESCAPE_COMMAND, SELECTION_CHANGE_COMMAND } from 'lexical';
14
12
  import React, { useCallback, useEffect, useRef, useState } from 'react';
15
13
  import { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js';
16
14
  import { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js';
@@ -24,8 +22,8 @@ export function LinkEditor({ anchorElem }) {
24
22
  const { useModal } = facelessUIImport;
25
23
  const [editor] = useLexicalComposerContext();
26
24
  const editorRef = useRef(null);
27
- const [linkUrl, setLinkUrl] = useState('');
28
- const [linkLabel, setLinkLabel] = useState('');
25
+ const [linkUrl, setLinkUrl] = useState(null);
26
+ const [linkLabel, setLinkLabel] = useState(null);
29
27
  const { uuid } = useEditorConfigContext();
30
28
  const config = useConfig();
31
29
  const { i18n, t } = useTranslation();
@@ -44,44 +42,54 @@ export function LinkEditor({ anchorElem }) {
44
42
  let selectedNodeDomRect = null;
45
43
  // Handle the data displayed in the floating link editor & drawer when you click on a link node
46
44
  if ($isRangeSelection(selection)) {
47
- const node = getSelectedNode(selection);
48
- selectedNodeDomRect = editor.getElementByKey(node.getKey())?.getBoundingClientRect();
49
- const linkParent = $findMatchingParent(node, $isLinkNode);
50
- if (linkParent == null) {
45
+ const focusNode = getSelectedNode(selection);
46
+ selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect();
47
+ const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode);
48
+ // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064
49
+ const badNode = selection.getNodes().filter((node)=>!$isLineBreakNode(node)).find((node)=>{
50
+ const linkNode = $findMatchingParent(node, $isLinkNode);
51
+ return focusLinkParent && !focusLinkParent.is(linkNode) || linkNode && !linkNode.is(focusLinkParent);
52
+ });
53
+ if (focusLinkParent == null || badNode) {
51
54
  setIsLink(false);
52
55
  setIsAutoLink(false);
53
- setLinkUrl('');
54
- setLinkLabel('');
56
+ setLinkUrl(null);
57
+ setLinkLabel(null);
55
58
  setSelectedNodes([]);
56
59
  return;
57
60
  }
58
61
  // Initial state:
59
62
  const data = {
60
- fields: {
61
- doc: undefined,
62
- linkType: undefined,
63
- newTab: undefined,
64
- url: '',
65
- ...linkParent.getFields()
66
- },
67
- text: linkParent.getTextContent()
63
+ doc: undefined,
64
+ linkType: undefined,
65
+ newTab: undefined,
66
+ url: '',
67
+ ...focusLinkParent.getFields(),
68
+ text: focusLinkParent.getTextContent()
68
69
  };
69
- if (linkParent.getFields()?.linkType === 'custom') {
70
- setLinkUrl(linkParent.getFields()?.url ?? '');
71
- setLinkLabel('');
70
+ if (focusLinkParent.getFields()?.linkType === 'custom') {
71
+ setLinkUrl(focusLinkParent.getFields()?.url ?? null);
72
+ setLinkLabel(null);
72
73
  } else {
73
74
  // internal link
74
- setLinkUrl(`/admin/collections/${linkParent.getFields()?.doc?.relationTo}/${linkParent.getFields()?.doc?.value}`);
75
- const relatedField = config.collections.find((coll)=>coll.slug === linkParent.getFields()?.doc?.relationTo);
76
- const label = t('fields:linkedTo', {
77
- label: getTranslation(relatedField.labels.singular, i18n)
78
- }).replace(/<[^>]*>?/g, '');
79
- setLinkLabel(label);
75
+ setLinkUrl(`/admin/collections/${focusLinkParent.getFields()?.doc?.relationTo}/${focusLinkParent.getFields()?.doc?.value}`);
76
+ const relatedField = config.collections.find((coll)=>coll.slug === focusLinkParent.getFields()?.doc?.relationTo);
77
+ if (!relatedField) {
78
+ // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.
79
+ // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.
80
+ setLinkLabel(focusLinkParent.getFields()?.label ? String(focusLinkParent.getFields()?.label) : null);
81
+ setLinkUrl(focusLinkParent.getFields()?.url ? String(focusLinkParent.getFields()?.url) : null);
82
+ } else {
83
+ const label = t('fields:linkedTo', {
84
+ label: getTranslation(relatedField.labels.singular, i18n)
85
+ }).replace(/<[^>]*>?/g, '');
86
+ setLinkLabel(label);
87
+ }
80
88
  }
81
89
  setStateData(data);
82
90
  setIsLink(true);
83
91
  setSelectedNodes(selection ? selection?.getNodes() : []);
84
- if ($isAutoLinkNode(linkParent)) {
92
+ if ($isAutoLinkNode(focusLinkParent)) {
85
93
  setIsAutoLink(true);
86
94
  } else {
87
95
  setIsAutoLink(false);
@@ -108,8 +116,8 @@ export function LinkEditor({ anchorElem }) {
108
116
  if (rootElement !== null) {
109
117
  setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem);
110
118
  }
111
- setLinkUrl('');
112
- setLinkLabel('');
119
+ setLinkUrl(null);
120
+ setLinkLabel(null);
113
121
  }
114
122
  return true;
115
123
  }, [
@@ -198,11 +206,13 @@ export function LinkEditor({ anchorElem }) {
198
206
  ref: editorRef
199
207
  }, /*#__PURE__*/ React.createElement("div", {
200
208
  className: "link-input"
201
- }, /*#__PURE__*/ React.createElement("a", {
209
+ }, linkUrl && linkUrl.length > 0 ? /*#__PURE__*/ React.createElement("a", {
202
210
  href: linkUrl,
203
211
  rel: "noopener noreferrer",
204
212
  target: "_blank"
205
- }, linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl), editor.isEditable() && /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("button", {
213
+ }, linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl) : linkLabel != null && linkLabel.length > 0 ? /*#__PURE__*/ React.createElement("span", {
214
+ className: "link-input__label-pure"
215
+ }, linkLabel) : null, editor.isEditable() && /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("button", {
206
216
  "aria-label": "Edit link",
207
217
  className: "link-edit",
208
218
  onClick: ()=>{
@@ -229,7 +239,10 @@ export function LinkEditor({ anchorElem }) {
229
239
  handleModalSubmit: (fields, data)=>{
230
240
  closeModal(drawerSlug);
231
241
  const newLinkPayload = data;
232
- newLinkPayload.selectedNodes = selectedNodes;
242
+ const bareLinkFields = {
243
+ ...newLinkPayload
244
+ };
245
+ delete bareLinkFields.text;
233
246
  // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).
234
247
  editor.update(()=>{
235
248
  const selection = $getSelection();
@@ -243,14 +256,18 @@ export function LinkEditor({ anchorElem }) {
243
256
  }
244
257
  if (linkParent && $isAutoLinkNode(linkParent)) {
245
258
  const linkNode = $createLinkNode({
246
- fields: newLinkPayload.fields
259
+ fields: bareLinkFields
247
260
  });
248
261
  linkParent.replace(linkNode, true);
249
262
  }
250
263
  });
251
264
  // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to
252
265
  // it being applied to the auto link node instead of the link node.
253
- editor.dispatchCommand(TOGGLE_LINK_COMMAND, newLinkPayload);
266
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, {
267
+ fields: bareLinkFields,
268
+ selectedNodes,
269
+ text: newLinkPayload.text
270
+ });
254
271
  },
255
272
  stateData: stateData
256
273
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload/types'\nimport type { Data } from 'payload/types'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport lexicalComposerContextImport from '@lexical/react/LexicalComposerContext.js'\nconst { useLexicalComposerContext } = lexicalComposerContextImport\n\nimport lexicalUtilsImport from '@lexical/utils'\nconst { $findMatchingParent, mergeRegister } = lexicalUtilsImport\nimport type { LexicalNode } from 'lexical'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport lexicalImport from 'lexical'\nconst {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} = lexicalImport\n\nimport { formatDrawerSlug } from '@payloadcms/ui/elements/Drawer'\nimport { useConfig } from '@payloadcms/ui/providers/Config'\nimport { useEditDepth } from '@payloadcms/ui/providers/EditDepth'\nimport { useTranslation } from '@payloadcms/ui/providers/Translation'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../nodes/LinkNode.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { LinkDrawer } from '../../../drawer/index.js'\nimport { $isAutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode } from '../../../nodes/LinkNode.js'\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const { useModal } = facelessUIImport\n\n const [editor] = useLexicalComposerContext()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState('')\n const [linkLabel, setLinkLabel] = useState('')\n\n const { uuid } = useEditorConfigContext()\n\n const config = useConfig()\n\n const { i18n, t } = useTranslation()\n\n const [stateData, setStateData] = useState<LinkPayload>(null)\n\n const { closeModal, toggleModal } = useModal()\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined = null\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(node.getKey())?.getBoundingClientRect()\n const linkParent: LinkNode = $findMatchingParent(node, $isLinkNode)\n if (linkParent == null) {\n setIsLink(false)\n setIsAutoLink(false)\n setLinkUrl('')\n setLinkLabel('')\n setSelectedNodes([])\n return\n }\n\n // Initial state:\n const data: LinkPayload = {\n fields: {\n doc: undefined,\n linkType: undefined,\n newTab: undefined,\n url: '',\n ...linkParent.getFields(),\n },\n text: linkParent.getTextContent(),\n }\n\n if (linkParent.getFields()?.linkType === 'custom') {\n setLinkUrl(linkParent.getFields()?.url ?? '')\n setLinkLabel('')\n } else {\n // internal link\n setLinkUrl(\n `/admin/collections/${linkParent.getFields()?.doc?.relationTo}/${\n linkParent.getFields()?.doc?.value\n }`,\n )\n\n const relatedField = config.collections.find(\n (coll) => coll.slug === linkParent.getFields()?.doc?.relationTo,\n )\n const label = t('fields:linkedTo', {\n label: getTranslation(relatedField.labels.singular, i18n),\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(linkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n }\n\n const editorElem = editorRef.current\n const nativeSelection = window.getSelection()\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n selection !== null &&\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem)\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl('')\n setLinkLabel('')\n }\n\n return true\n }, [anchorElem, editor, config, t, i18n])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n updateLinkEditor()\n toggleModal(drawerSlug)\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateLinkEditor, toggleModal, drawerSlug])\n\n useEffect(() => {\n if (!isLink && editorRef) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n }, [isLink])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false)\n setIsAutoLink(false)\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, updateLinkEditor, setIsLink, isLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void updateLinkEditor()\n })\n }, [editor, updateLinkEditor])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n {editor.isEditable() && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={() => {\n toggleModal(drawerSlug)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <LinkDrawer\n drawerSlug={drawerSlug}\n handleModalSubmit={(fields: FormState, data: Data) => {\n closeModal(drawerSlug)\n\n const newLinkPayload: LinkPayload = data as LinkPayload\n\n newLinkPayload.selectedNodes = selectedNodes\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0].getParent()\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: newLinkPayload.fields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, newLinkPayload)\n }}\n stateData={stateData}\n />\n </React.Fragment>\n )\n}\n"],"names":["facelessUIImport","lexicalComposerContextImport","useLexicalComposerContext","lexicalUtilsImport","$findMatchingParent","mergeRegister","getTranslation","lexicalImport","$getSelection","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatDrawerSlug","useConfig","useEditDepth","useTranslation","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","LinkDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkEditor","anchorElem","useModal","editor","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","uuid","config","i18n","t","stateData","setStateData","closeModal","toggleModal","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","updateLinkEditor","selection","selectedNodeDomRect","node","getElementByKey","getKey","getBoundingClientRect","linkParent","data","fields","doc","undefined","linkType","newTab","url","getFields","text","getTextContent","relationTo","value","relatedField","collections","find","coll","label","labels","singular","replace","getNodes","editorElem","current","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","style","opacity","transform","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","a","href","rel","target","length","isEditable","button","aria-label","onClick","onMouseDown","event","preventDefault","tabIndex","type","handleModalSubmit","newLinkPayload","getParent","linkNode"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/field/features/link/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalNode } from 'lexical'\nimport type { FormState } from 'payload/types'\nimport type { Data } from 'payload/types'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport { formatDrawerSlug } from '@payloadcms/ui/elements/Drawer'\nimport { useConfig } from '@payloadcms/ui/providers/Config'\nimport { useEditDepth } from '@payloadcms/ui/providers/EditDepth'\nimport { useTranslation } from '@payloadcms/ui/providers/Translation'\nimport { $isLineBreakNode } from 'lexical'\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { LinkDrawer } from '../../../drawer/index.js'\nimport { $isAutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode } from '../../../nodes/LinkNode.js'\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const { useModal } = facelessUIImport\n\n const [editor] = useLexicalComposerContext()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState(null)\n const [linkLabel, setLinkLabel] = useState(null)\n\n const { uuid } = useEditorConfigContext()\n\n const config = useConfig()\n\n const { i18n, t } = useTranslation()\n\n const [stateData, setStateData] = useState<LinkFields & { text: string }>(null)\n\n const { closeModal, toggleModal } = useModal()\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined = null\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n if ($isRangeSelection(selection)) {\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent: LinkNode = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setIsLink(false)\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n return\n }\n\n // Initial state:\n const data: LinkFields & { text: string } = {\n doc: undefined,\n linkType: undefined,\n newTab: undefined,\n url: '',\n ...focusLinkParent.getFields(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (focusLinkParent.getFields()?.linkType === 'custom') {\n setLinkUrl(focusLinkParent.getFields()?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `/admin/collections/${focusLinkParent.getFields()?.doc?.relationTo}/${\n focusLinkParent.getFields()?.doc?.value\n }`,\n )\n\n const relatedField = config.collections.find(\n (coll) => coll.slug === focusLinkParent.getFields()?.doc?.relationTo,\n )\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(\n focusLinkParent.getFields()?.label ? String(focusLinkParent.getFields()?.label) : null,\n )\n setLinkUrl(\n focusLinkParent.getFields()?.url ? String(focusLinkParent.getFields()?.url) : null,\n )\n } else {\n const label = t('fields:linkedTo', {\n label: getTranslation(relatedField.labels.singular, i18n),\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n }\n\n const editorElem = editorRef.current\n const nativeSelection = window.getSelection()\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n selection !== null &&\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n setFloatingElemPositionForLinkEditor(selectedNodeDomRect, editorElem, anchorElem)\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [anchorElem, editor, config, t, i18n])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n updateLinkEditor()\n toggleModal(drawerSlug)\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateLinkEditor, toggleModal, drawerSlug])\n\n useEffect(() => {\n if (!isLink && editorRef) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n }, [isLink])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false)\n setIsAutoLink(false)\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, updateLinkEditor, setIsLink, isLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void updateLinkEditor()\n })\n }, [editor, updateLinkEditor])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n ) : null}\n\n {editor.isEditable() && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={() => {\n toggleModal(drawerSlug)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={(event) => {\n event.preventDefault()\n }}\n tabIndex={0}\n type=\"button\"\n />\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <LinkDrawer\n drawerSlug={drawerSlug}\n handleModalSubmit={(fields: FormState, data: Data) => {\n closeModal(drawerSlug)\n\n const newLinkPayload = data as LinkFields & { text: string }\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0].getParent()\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n stateData={stateData}\n />\n </React.Fragment>\n )\n}\n"],"names":["facelessUIImport","useLexicalComposerContext","$findMatchingParent","mergeRegister","getTranslation","formatDrawerSlug","useConfig","useEditDepth","useTranslation","$isLineBreakNode","$getSelection","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","LinkDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkEditor","anchorElem","useModal","editor","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","uuid","config","i18n","t","stateData","setStateData","closeModal","toggleModal","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","linkNode","is","data","doc","undefined","linkType","newTab","url","getFields","text","getTextContent","relationTo","value","relatedField","collections","coll","label","String","labels","singular","replace","editorElem","current","nativeSelection","window","getSelection","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","style","opacity","transform","scrollerElem","parentElement","update","getEditorState","read","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","length","a","href","rel","target","span","isEditable","button","aria-label","onClick","onMouseDown","event","preventDefault","tabIndex","type","handleModalSubmit","fields","newLinkPayload","bareLinkFields","linkParent","getParent"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -36,12 +36,20 @@ html[data-theme='light'] {
36
36
  position: relative;
37
37
  font-family: var(--font-body);
38
38
 
39
+ &__label-pure {
40
+ color: var(--color-base-1000);
41
+ margin-right: 15px;
42
+ display: block;
43
+ white-space: nowrap;
44
+ overflow: hidden;
45
+ }
46
+
39
47
  a {
40
48
  text-decoration: none;
41
49
  display: block;
42
50
  white-space: nowrap;
43
51
  overflow: hidden;
44
- margin-right: 30px;
52
+ margin-right: 15px;
45
53
  text-overflow: ellipsis;
46
54
  color: var(--color-blue-600);
47
55
  border-bottom: 1px dotted;
@@ -1,12 +1,10 @@
1
- import type { I18n } from '@payloadcms/translations';
2
1
  import type { SanitizedConfig } from 'payload/config';
3
- import type { Field } from 'payload/types';
2
+ import type { FieldWithRichTextRequiredEditor } from 'payload/types';
4
3
  /**
5
4
  * This function is run to enrich the basefields which every link has with potential, custom user-added fields.
6
5
  */
7
6
  export declare function transformExtraFields(customFieldSchema: ((args: {
8
7
  config: SanitizedConfig;
9
- defaultFields: Field[];
10
- i18n: I18n;
11
- }) => Field[]) | Field[], config: SanitizedConfig, i18n: I18n, enabledCollections?: false | string[], disabledCollections?: false | string[]): Field[];
8
+ defaultFields: FieldWithRichTextRequiredEditor[];
9
+ }) => FieldWithRichTextRequiredEditor[]) | FieldWithRichTextRequiredEditor[], config: SanitizedConfig, enabledCollections?: false | string[], disabledCollections?: false | string[]): FieldWithRichTextRequiredEditor[];
12
10
  //# sourceMappingURL=utilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/link/plugins/floatingLinkEditor/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,eAAe,CAAA;AAItD;;GAEG;AAEH,wBAAgB,oBAAoB,CAClC,iBAAiB,EACb,CAAC,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,aAAa,EAAE,KAAK,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,KAAK,KAAK,EAAE,CAAC,GACpF,KAAK,EAAE,EACX,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,IAAI,EACV,kBAAkB,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,EACrC,mBAAmB,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,GACrC,KAAK,EAAE,CA0CT"}
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../../../../../src/field/features/link/plugins/floatingLinkEditor/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,eAAe,CAAA;AAIpE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,iBAAiB,EACb,CAAC,CAAC,IAAI,EAAE;IACN,MAAM,EAAE,eAAe,CAAA;IACvB,aAAa,EAAE,+BAA+B,EAAE,CAAA;CACjD,KAAK,+BAA+B,EAAE,CAAC,GACxC,+BAA+B,EAAE,EACrC,MAAM,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,EACrC,mBAAmB,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,GACrC,+BAA+B,EAAE,CAkBnC"}