@payloadcms/richtext-lexical 3.68.0-internal-debug.2eb12b9 → 3.68.0-internal-debug.dafc24d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/dist/cell/rscEntry.js +13 -5
  2. package/dist/cell/rscEntry.js.map +1 -1
  3. package/dist/features/blocks/client/component/BlockContent.js +29 -9
  4. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  5. package/dist/features/blocks/client/component/components/BlockCollapsible.js +7 -3
  6. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  7. package/dist/features/blocks/client/component/components/BlockEditButton.js +6 -2
  8. package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
  9. package/dist/features/blocks/client/component/components/BlockRemoveButton.js +6 -2
  10. package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
  11. package/dist/features/blocks/client/component/index.js +124 -43
  12. package/dist/features/blocks/client/component/index.js.map +1 -1
  13. package/dist/features/blocks/client/component/index.scss +188 -0
  14. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js +7 -3
  15. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  16. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js +6 -2
  17. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
  18. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js +6 -2
  19. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
  20. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js +6 -2
  21. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
  22. package/dist/features/blocks/client/componentInline/index.js +118 -37
  23. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  24. package/dist/features/blocks/client/componentInline/index.scss +90 -0
  25. package/dist/features/blocks/client/getBlockImageComponent.js +7 -3
  26. package/dist/features/blocks/client/getBlockImageComponent.js.map +1 -1
  27. package/dist/features/blocks/client/markdown/markdownTransformer.js +1 -0
  28. package/dist/features/blocks/client/markdown/markdownTransformer.js.map +1 -1
  29. package/dist/features/blocks/client/nodes/BlocksNode.js +7 -3
  30. package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
  31. package/dist/features/blocks/client/nodes/InlineBlocksNode.js +7 -3
  32. package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
  33. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +88 -27
  34. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
  35. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +7 -3
  36. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
  37. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +13 -4
  38. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -1
  39. package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.scss +6 -0
  40. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +19 -6
  41. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -1
  42. package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.scss +29 -0
  43. package/dist/features/blocks/premade/CodeBlock/Component/index.scss +97 -0
  44. package/dist/features/blocks/server/markdown/markdownTransformer.js +1 -0
  45. package/dist/features/blocks/server/markdown/markdownTransformer.js.map +1 -1
  46. package/dist/features/converters/lexicalToJSX/Component/index.js +9 -5
  47. package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
  48. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js +7 -3
  49. package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js.map +1 -1
  50. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +7 -3
  51. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
  52. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js +6 -2
  53. package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js.map +1 -1
  54. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js +6 -2
  55. package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js.map +1 -1
  56. package/dist/features/converters/lexicalToJSX/converter/converters/link.js +13 -5
  57. package/dist/features/converters/lexicalToJSX/converter/converters/link.js.map +1 -1
  58. package/dist/features/converters/lexicalToJSX/converter/converters/list.js +38 -14
  59. package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
  60. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js +18 -6
  61. package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js.map +1 -1
  62. package/dist/features/converters/lexicalToJSX/converter/converters/table.js +31 -11
  63. package/dist/features/converters/lexicalToJSX/converter/converters/table.js.map +1 -1
  64. package/dist/features/converters/lexicalToJSX/converter/converters/text.js +43 -15
  65. package/dist/features/converters/lexicalToJSX/converter/converters/text.js.map +1 -1
  66. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +31 -11
  67. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
  68. package/dist/features/converters/lexicalToJSX/converter/index.js +8 -4
  69. package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
  70. package/dist/features/debug/jsxConverter/client/plugin/index.js +14 -5
  71. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  72. package/dist/features/debug/jsxConverter/client/plugin/style.scss +12 -0
  73. package/dist/features/debug/testRecorder/client/plugin/index.js +62 -21
  74. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  75. package/dist/features/debug/testRecorder/client/plugin/index.scss +53 -0
  76. package/dist/features/debug/treeView/client/plugin/index.js +8 -3
  77. package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
  78. package/dist/features/debug/treeView/client/plugin/index.scss +80 -0
  79. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +225 -72
  80. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  81. package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss +87 -0
  82. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +32 -11
  83. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  84. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.scss +11 -0
  85. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +21 -9
  86. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  87. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +26 -9
  88. package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
  89. package/dist/features/experimental_table/client/plugins/TablePlugin/index.scss +233 -0
  90. package/dist/features/horizontalRule/client/plugin/index.js +1 -0
  91. package/dist/features/horizontalRule/client/plugin/index.js.map +1 -1
  92. package/dist/features/horizontalRule/client/plugin/index.scss +23 -0
  93. package/dist/features/indent/client/IndentPlugin.js +6 -2
  94. package/dist/features/indent/client/IndentPlugin.js.map +1 -1
  95. package/dist/features/link/client/plugins/autoLink/index.js +3 -0
  96. package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
  97. package/dist/features/link/client/plugins/clickableLink/index.js +6 -2
  98. package/dist/features/link/client/plugins/clickableLink/index.js.map +1 -1
  99. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +76 -24
  100. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  101. package/dist/features/link/client/plugins/floatingLinkEditor/index.js +8 -3
  102. package/dist/features/link/client/plugins/floatingLinkEditor/index.js.map +1 -1
  103. package/dist/features/link/client/plugins/floatingLinkEditor/index.scss +92 -0
  104. package/dist/features/link/server/baseFields.js +1 -0
  105. package/dist/features/link/server/baseFields.js.map +1 -1
  106. package/dist/features/lists/checklist/client/plugin/index.js +6 -2
  107. package/dist/features/lists/checklist/client/plugin/index.js.map +1 -1
  108. package/dist/features/lists/plugin/index.js +6 -2
  109. package/dist/features/lists/plugin/index.js.map +1 -1
  110. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +14 -5
  111. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  112. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +7 -3
  113. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  114. package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.scss +16 -0
  115. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +14 -5
  116. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
  117. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +7 -3
  118. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
  119. package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.scss +16 -0
  120. package/dist/features/relationship/client/components/RelationshipComponent.js +56 -19
  121. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  122. package/dist/features/relationship/client/components/index.scss +95 -0
  123. package/dist/features/relationship/client/drawer/index.js +18 -6
  124. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  125. package/dist/features/relationship/client/nodes/RelationshipNode.js +7 -3
  126. package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
  127. package/dist/features/relationship/client/plugins/index.js +7 -3
  128. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  129. package/dist/features/textState/feature.client.js +18 -6
  130. package/dist/features/textState/feature.client.js.map +1 -1
  131. package/dist/features/toolbars/fixed/client/Toolbar/index.js +72 -23
  132. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  133. package/dist/features/toolbars/fixed/client/Toolbar/index.scss +113 -0
  134. package/dist/features/toolbars/inline/client/Toolbar/index.js +72 -23
  135. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  136. package/dist/features/toolbars/inline/client/Toolbar/index.scss +58 -0
  137. package/dist/features/toolbars/shared/ToolbarButton/index.js +8 -3
  138. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  139. package/dist/features/toolbars/shared/ToolbarButton/index.scss +46 -0
  140. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +60 -20
  141. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  142. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +37 -12
  143. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  144. package/dist/features/toolbars/shared/ToolbarDropdown/index.scss +129 -0
  145. package/dist/features/upload/client/component/index.js +92 -31
  146. package/dist/features/upload/client/component/index.js.map +1 -1
  147. package/dist/features/upload/client/component/index.scss +191 -0
  148. package/dist/features/upload/client/component/pending/index.js +14 -5
  149. package/dist/features/upload/client/component/pending/index.js.map +1 -1
  150. package/dist/features/upload/client/drawer/index.js +18 -6
  151. package/dist/features/upload/client/drawer/index.js.map +1 -1
  152. package/dist/features/upload/client/nodes/UploadNode.js +12 -4
  153. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  154. package/dist/features/upload/client/plugin/index.js +7 -3
  155. package/dist/features/upload/client/plugin/index.js.map +1 -1
  156. package/dist/field/Diff/converters/listitem/index.js +37 -12
  157. package/dist/field/Diff/converters/listitem/index.js.map +1 -1
  158. package/dist/field/Diff/converters/listitem/index.scss +47 -0
  159. package/dist/field/Diff/converters/relationship/index.js +37 -12
  160. package/dist/field/Diff/converters/relationship/index.js.map +1 -1
  161. package/dist/field/Diff/converters/relationship/index.scss +73 -0
  162. package/dist/field/Diff/converters/unknown/index.js +31 -10
  163. package/dist/field/Diff/converters/unknown/index.js.map +1 -1
  164. package/dist/field/Diff/converters/unknown/index.scss +40 -0
  165. package/dist/field/Diff/converters/upload/index.js +60 -19
  166. package/dist/field/Diff/converters/upload/index.js.map +1 -1
  167. package/dist/field/Diff/converters/upload/index.scss +115 -0
  168. package/dist/field/Diff/index.js +8 -3
  169. package/dist/field/Diff/index.js.map +1 -1
  170. package/dist/field/Diff/index.scss +102 -0
  171. package/dist/field/Field.js +81 -27
  172. package/dist/field/Field.js.map +1 -1
  173. package/dist/field/RenderLexical/index.js +36 -12
  174. package/dist/field/RenderLexical/index.js.map +1 -1
  175. package/dist/field/index.js +19 -7
  176. package/dist/field/index.js.map +1 -1
  177. package/dist/field/index.scss +41 -0
  178. package/dist/field/rscEntry.js +7 -3
  179. package/dist/field/rscEntry.js.map +1 -1
  180. package/dist/index.js +2 -0
  181. package/dist/index.js.map +1 -1
  182. package/dist/lexical/EditorPlugin.js +13 -5
  183. package/dist/lexical/EditorPlugin.js.map +1 -1
  184. package/dist/lexical/LexicalEditor.js +163 -50
  185. package/dist/lexical/LexicalEditor.js.map +1 -1
  186. package/dist/lexical/LexicalEditor.scss +54 -0
  187. package/dist/lexical/LexicalProvider.js +49 -17
  188. package/dist/lexical/LexicalProvider.js.map +1 -1
  189. package/dist/lexical/config/client/EditorConfigProvider.js +7 -3
  190. package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
  191. package/dist/lexical/plugins/DecoratorPlugin/index.js +1 -0
  192. package/dist/lexical/plugins/DecoratorPlugin/index.js.map +1 -1
  193. package/dist/lexical/plugins/DecoratorPlugin/index.scss +13 -0
  194. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +20 -7
  195. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  196. package/dist/lexical/plugins/InsertParagraphAtEnd/index.scss +54 -0
  197. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +2 -0
  198. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  199. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +7 -3
  200. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  201. package/dist/lexical/plugins/SlashMenu/index.js +50 -16
  202. package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
  203. package/dist/lexical/plugins/SlashMenu/index.scss +68 -0
  204. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +20 -7
  205. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  206. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.scss +35 -0
  207. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +32 -11
  208. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  209. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.scss +80 -0
  210. package/dist/lexical/theme/EditorTheme.scss +357 -0
  211. package/dist/lexical/ui/ContentEditable.js +14 -5
  212. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  213. package/dist/lexical/ui/ContentEditable.scss +105 -0
  214. package/dist/lexical/ui/icons/AI/index.js +37 -13
  215. package/dist/lexical/ui/icons/AI/index.js.map +1 -1
  216. package/dist/lexical/ui/icons/Add/index.js +19 -7
  217. package/dist/lexical/ui/icons/Add/index.js.map +1 -1
  218. package/dist/lexical/ui/icons/AlignCenter/index.js +25 -9
  219. package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
  220. package/dist/lexical/ui/icons/AlignJustify/index.js +25 -9
  221. package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
  222. package/dist/lexical/ui/icons/AlignLeft/index.js +25 -9
  223. package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
  224. package/dist/lexical/ui/icons/AlignRight/index.js +25 -9
  225. package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
  226. package/dist/lexical/ui/icons/Block/index.js +25 -9
  227. package/dist/lexical/ui/icons/Block/index.js.map +1 -1
  228. package/dist/lexical/ui/icons/Blockquote/index.js +13 -5
  229. package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
  230. package/dist/lexical/ui/icons/Bold/index.js +13 -5
  231. package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
  232. package/dist/lexical/ui/icons/Checklist/index.js +19 -7
  233. package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
  234. package/dist/lexical/ui/icons/Code/index.js +19 -7
  235. package/dist/lexical/ui/icons/Code/index.js.map +1 -1
  236. package/dist/lexical/ui/icons/CodeBlock/index.js +13 -5
  237. package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
  238. package/dist/lexical/ui/icons/Collapse/index.js +13 -5
  239. package/dist/lexical/ui/icons/Collapse/index.js.map +1 -1
  240. package/dist/lexical/ui/icons/H1/index.js +13 -5
  241. package/dist/lexical/ui/icons/H1/index.js.map +1 -1
  242. package/dist/lexical/ui/icons/H2/index.js +13 -5
  243. package/dist/lexical/ui/icons/H2/index.js.map +1 -1
  244. package/dist/lexical/ui/icons/H3/index.js +13 -5
  245. package/dist/lexical/ui/icons/H3/index.js.map +1 -1
  246. package/dist/lexical/ui/icons/H4/index.js +13 -5
  247. package/dist/lexical/ui/icons/H4/index.js.map +1 -1
  248. package/dist/lexical/ui/icons/H5/index.js +13 -5
  249. package/dist/lexical/ui/icons/H5/index.js.map +1 -1
  250. package/dist/lexical/ui/icons/H6/index.js +13 -5
  251. package/dist/lexical/ui/icons/H6/index.js.map +1 -1
  252. package/dist/lexical/ui/icons/HorizontalRule/index.js +13 -5
  253. package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
  254. package/dist/lexical/ui/icons/IndentDecrease/index.js +31 -11
  255. package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
  256. package/dist/lexical/ui/icons/IndentIncrease/index.js +31 -11
  257. package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
  258. package/dist/lexical/ui/icons/InlineBlocks/index.js +13 -5
  259. package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -1
  260. package/dist/lexical/ui/icons/Italic/index.js +13 -5
  261. package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
  262. package/dist/lexical/ui/icons/Link/index.js +13 -5
  263. package/dist/lexical/ui/icons/Link/index.js.map +1 -1
  264. package/dist/lexical/ui/icons/Meatballs/index.js +25 -9
  265. package/dist/lexical/ui/icons/Meatballs/index.js.map +1 -1
  266. package/dist/lexical/ui/icons/OrderedList/index.js +37 -13
  267. package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
  268. package/dist/lexical/ui/icons/Relationship/index.js +37 -13
  269. package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
  270. package/dist/lexical/ui/icons/Strikethrough/index.js +19 -7
  271. package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
  272. package/dist/lexical/ui/icons/Subscript/index.js +13 -5
  273. package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
  274. package/dist/lexical/ui/icons/Superscript/index.js +13 -5
  275. package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
  276. package/dist/lexical/ui/icons/Table/index.js +13 -5
  277. package/dist/lexical/ui/icons/Table/index.js.map +1 -1
  278. package/dist/lexical/ui/icons/Text/index.js +13 -5
  279. package/dist/lexical/ui/icons/Text/index.js.map +1 -1
  280. package/dist/lexical/ui/icons/TextState/index.js +7 -3
  281. package/dist/lexical/ui/icons/TextState/index.js.map +1 -1
  282. package/dist/lexical/ui/icons/Underline/index.js +19 -7
  283. package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
  284. package/dist/lexical/ui/icons/UnorderedList/index.js +43 -15
  285. package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
  286. package/dist/lexical/ui/icons/Upload/index.js +25 -9
  287. package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
  288. package/dist/packages/@lexical/markdown/MarkdownShortcuts.js +2 -0
  289. package/dist/packages/@lexical/markdown/MarkdownShortcuts.js.map +1 -1
  290. package/dist/packages/@lexical/markdown/importTextFormatTransformer.js +2 -0
  291. package/dist/packages/@lexical/markdown/importTextFormatTransformer.js.map +1 -1
  292. package/dist/packages/@lexical/markdown/importTextMatchTransformer.js +2 -0
  293. package/dist/packages/@lexical/markdown/importTextMatchTransformer.js.map +1 -1
  294. package/dist/utilities/fieldsDrawer/Drawer.js +19 -7
  295. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  296. package/dist/utilities/fieldsDrawer/DrawerContent.js +19 -7
  297. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  298. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +7 -3
  299. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  300. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +7 -3
  301. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  302. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js +2 -0
  303. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -1
  304. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js +2 -0
  305. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -1
  306. package/package.json +8 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } 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 { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\n\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) {\n return null\n }\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 (const matcher of matchers) {\n const match = matcher(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 | undefined): boolean {\n return char !== undefined && 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\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\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 = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n const remainingTextNode = nodes[0]!\n let linkTextNode: TextNode | undefined\n if (startIndex === 0) {\n ;[linkTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n if (linkTextNode) {\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n }\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: LexicalNode[] = []\n let remainingTextNode\n nodes.forEach((currentNode) => {\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 if (linkTextNode) {\n linkNodes.push(linkTextNode)\n }\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n })\n\n if (firstLinkTextNode) {\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 textNode.setStyle(firstLinkTextNode.getStyle())\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 }\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)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? (previousSibling.getFields()?.url?.startsWith('mailto:') ?? false)\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\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 throw new Error('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 const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\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","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","matcher","PUNCTUATION_OR_SPACE","isSeparator","char","undefined","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","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","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","forEach","endNode","selection","selectedTextNode","getNodes","find","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","i","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } 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 { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\n\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) {\n return null\n }\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 (const matcher of matchers) {\n const match = matcher(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 | undefined): boolean {\n return char !== undefined && 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\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\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 = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n const remainingTextNode = nodes[0]!\n let linkTextNode: TextNode | undefined\n if (startIndex === 0) {\n ;[linkTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n if (linkTextNode) {\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n }\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: LexicalNode[] = []\n let remainingTextNode\n nodes.forEach((currentNode) => {\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 if (linkTextNode) {\n linkNodes.push(linkTextNode)\n }\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n })\n\n if (firstLinkTextNode) {\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 textNode.setStyle(firstLinkTextNode.getStyle())\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 }\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)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? (previousSibling.getFields()?.url?.startsWith('mailto:') ?? false)\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\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 throw new Error('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 const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\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","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","matcher","PUNCTUATION_OR_SPACE","isSeparator","char","undefined","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","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","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","forEach","endNode","selection","selectedTextNode","getNodes","find","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","i","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"mappings":"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"}
@@ -1,9 +1,13 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import { ClickableLinkPlugin as LexicalClickableLinkPlugin } from '@lexical/react/LexicalClickableLinkPlugin.js';
4
4
  import React from 'react';
5
5
  export const ClickableLinkPlugin = ()=>{
6
- return /*#__PURE__*/ _jsx(LexicalClickableLinkPlugin, {});
6
+ return /*#__PURE__*/ _jsxDEV(LexicalClickableLinkPlugin, {}, void 0, false, {
7
+ fileName: "src/features/link/client/plugins/clickableLink/index.tsx",
8
+ lineNumber: 9,
9
+ columnNumber: 10
10
+ }, this);
7
11
  };
8
12
 
9
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/features/link/client/plugins/clickableLink/index.tsx"],"sourcesContent":["'use client'\nimport { ClickableLinkPlugin as LexicalClickableLinkPlugin } from '@lexical/react/LexicalClickableLinkPlugin.js'\nimport React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ClientProps } from '../../index.js'\n\nexport const ClickableLinkPlugin: PluginComponent<ClientProps> = () => {\n return <LexicalClickableLinkPlugin />\n}\n"],"names":["ClickableLinkPlugin","LexicalClickableLinkPlugin","React"],"mappings":"AAAA;;AACA,SAASA,uBAAuBC,0BAA0B,QAAQ,+CAA8C;AAChH,OAAOC,WAAW,QAAO;AAKzB,OAAO,MAAMF,sBAAoD;IAC/D,qBAAO,KAACC;AACV,EAAC"}
1
+ {"version":3,"sources":["../../../../../../src/features/link/client/plugins/clickableLink/index.tsx"],"sourcesContent":["'use client'\nimport { ClickableLinkPlugin as LexicalClickableLinkPlugin } from '@lexical/react/LexicalClickableLinkPlugin.js'\nimport React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ClientProps } from '../../index.js'\n\nexport const ClickableLinkPlugin: PluginComponent<ClientProps> = () => {\n return <LexicalClickableLinkPlugin />\n}\n"],"names":["ClickableLinkPlugin","LexicalClickableLinkPlugin","React"],"mappings":"AAAA;;AACA,SAASA,uBAAuBC,0BAA0B,QAAQ,+CAA8C;AAChH,OAAOC,WAAW,QAAO;AAKzB,OAAO,MAAMF,sBAAoD;IAC/D,qBAAO,QAACC;;;;;AACV,EAAC"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV, Fragment as _Fragment } from "react/jsx-dev-runtime";
3
3
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
4
4
  import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
5
5
  import { $findMatchingParent, mergeRegister } from '@lexical/utils';
@@ -248,34 +248,50 @@ export function LinkEditor({ anchorElem }) {
248
248
  editor,
249
249
  $updateLinkEditor
250
250
  ]);
251
- return /*#__PURE__*/ _jsxs(React.Fragment, {
251
+ return /*#__PURE__*/ _jsxDEV(React.Fragment, {
252
252
  children: [
253
- /*#__PURE__*/ _jsx("div", {
253
+ /*#__PURE__*/ _jsxDEV("div", {
254
254
  className: "link-editor",
255
255
  ref: editorRef,
256
- children: /*#__PURE__*/ _jsxs("div", {
256
+ children: /*#__PURE__*/ _jsxDEV("div", {
257
257
  className: "link-input",
258
258
  children: [
259
- linkUrl && linkUrl.length > 0 ? /*#__PURE__*/ _jsxs("a", {
259
+ linkUrl && linkUrl.length > 0 ? /*#__PURE__*/ _jsxDEV("a", {
260
260
  href: linkUrl,
261
261
  rel: "noopener noreferrer",
262
262
  target: "_blank",
263
263
  children: [
264
- linkNode?.__fields.newTab ? /*#__PURE__*/ _jsx(ExternalLinkIcon, {}) : null,
264
+ linkNode?.__fields.newTab ? /*#__PURE__*/ _jsxDEV(ExternalLinkIcon, {}, void 0, false, {
265
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
266
+ lineNumber: 348,
267
+ columnNumber: 44
268
+ }, this) : null,
265
269
  linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl
266
270
  ]
267
- }) : linkLabel != null && linkLabel.length > 0 ? /*#__PURE__*/ _jsxs(_Fragment, {
271
+ }, void 0, true, {
272
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
273
+ lineNumber: 347,
274
+ columnNumber: 13
275
+ }, this) : linkLabel != null && linkLabel.length > 0 ? /*#__PURE__*/ _jsxDEV(_Fragment, {
268
276
  children: [
269
- linkNode?.__fields.newTab ? /*#__PURE__*/ _jsx(ExternalLinkIcon, {}) : null,
270
- /*#__PURE__*/ _jsx("span", {
277
+ linkNode?.__fields.newTab ? /*#__PURE__*/ _jsxDEV(ExternalLinkIcon, {}, void 0, false, {
278
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
279
+ lineNumber: 353,
280
+ columnNumber: 44
281
+ }, this) : null,
282
+ /*#__PURE__*/ _jsxDEV("span", {
271
283
  className: "link-input__label-pure",
272
284
  children: linkLabel
273
- })
285
+ }, void 0, false, {
286
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
287
+ lineNumber: 354,
288
+ columnNumber: 15
289
+ }, this)
274
290
  ]
275
- }) : null,
276
- isEditable && /*#__PURE__*/ _jsxs(React.Fragment, {
291
+ }, void 0, true) : null,
292
+ isEditable && /*#__PURE__*/ _jsxDEV(React.Fragment, {
277
293
  children: [
278
- /*#__PURE__*/ _jsx("button", {
294
+ /*#__PURE__*/ _jsxDEV("button", {
279
295
  "aria-label": "Edit link",
280
296
  className: "link-edit",
281
297
  onClick: (event)=>{
@@ -285,9 +301,17 @@ export function LinkEditor({ anchorElem }) {
285
301
  onMouseDown: preventDefault,
286
302
  tabIndex: 0,
287
303
  type: "button",
288
- children: /*#__PURE__*/ _jsx(EditIcon, {})
289
- }),
290
- !isAutoLink && /*#__PURE__*/ _jsx("button", {
304
+ children: /*#__PURE__*/ _jsxDEV(EditIcon, {}, void 0, false, {
305
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
306
+ lineNumber: 371,
307
+ columnNumber: 17
308
+ }, this)
309
+ }, void 0, false, {
310
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
311
+ lineNumber: 360,
312
+ columnNumber: 15
313
+ }, this),
314
+ !isAutoLink && /*#__PURE__*/ _jsxDEV("button", {
291
315
  "aria-label": "Remove link",
292
316
  className: "link-trash",
293
317
  onClick: ()=>{
@@ -296,14 +320,34 @@ export function LinkEditor({ anchorElem }) {
296
320
  onMouseDown: preventDefault,
297
321
  tabIndex: 0,
298
322
  type: "button",
299
- children: /*#__PURE__*/ _jsx(CloseMenuIcon, {})
300
- })
323
+ children: /*#__PURE__*/ _jsxDEV(CloseMenuIcon, {}, void 0, false, {
324
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
325
+ lineNumber: 384,
326
+ columnNumber: 19
327
+ }, this)
328
+ }, void 0, false, {
329
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
330
+ lineNumber: 374,
331
+ columnNumber: 17
332
+ }, this)
301
333
  ]
302
- })
334
+ }, void 0, true, {
335
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
336
+ lineNumber: 359,
337
+ columnNumber: 13
338
+ }, this)
303
339
  ]
304
- })
305
- }),
306
- /*#__PURE__*/ _jsx(FieldsDrawer, {
340
+ }, void 0, true, {
341
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
342
+ lineNumber: 345,
343
+ columnNumber: 9
344
+ }, this)
345
+ }, void 0, false, {
346
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
347
+ lineNumber: 344,
348
+ columnNumber: 7
349
+ }, this),
350
+ /*#__PURE__*/ _jsxDEV(FieldsDrawer, {
307
351
  className: "lexical-link-edit-drawer",
308
352
  data: stateData,
309
353
  drawerSlug: drawerSlug,
@@ -343,9 +387,17 @@ export function LinkEditor({ anchorElem }) {
343
387
  },
344
388
  schemaPath: schemaPath,
345
389
  schemaPathSuffix: "fields"
346
- })
390
+ }, void 0, false, {
391
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
392
+ lineNumber: 391,
393
+ columnNumber: 7
394
+ }, this)
347
395
  ]
348
- });
396
+ }, void 0, true, {
397
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx",
398
+ lineNumber: 343,
399
+ columnNumber: 5
400
+ }, this);
349
401
  }
350
402
 
351
403
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\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 { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\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 { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $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 setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\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(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(`${config.serverURL}${config.routes.api}/${collection}/${id}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\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 const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\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 }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\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 toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\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 setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\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 {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\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={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\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: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\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 schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","serverURL","api","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","length","a","href","rel","target","__fields","newTab","span","button","aria-label","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\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 { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\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 { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $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 setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\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(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(`${config.serverURL}${config.routes.api}/${collection}/${id}`, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n })\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\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 const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\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 }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\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 toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\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 setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\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 {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\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={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\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: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\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 schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","serverURL","api","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","Fragment","div","ref","length","a","href","rel","target","__fields","newTab","span","button","aria-label","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"mappings":"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"}
@@ -1,13 +1,18 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
3
3
  import * as React from 'react';
4
4
  import { createPortal } from 'react-dom';
5
+ import './index.scss';
5
6
  import { LinkEditor } from './LinkEditor/index.js';
6
7
  export const FloatingLinkEditorPlugin = (props)=>{
7
8
  const { anchorElem = document.body } = props;
8
- return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsx(LinkEditor, {
9
+ return /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsxDEV(LinkEditor, {
9
10
  anchorElem: anchorElem
10
- }), anchorElem);
11
+ }, void 0, false, {
12
+ fileName: "src/features/link/client/plugins/floatingLinkEditor/index.tsx",
13
+ lineNumber: 14,
14
+ columnNumber: 23
15
+ }, this), anchorElem);
11
16
  };
12
17
 
13
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ClientProps } from '../../index.js'\n\nimport './index.scss'\nimport { LinkEditor } from './LinkEditor/index.js'\n\nexport const FloatingLinkEditorPlugin: PluginComponentWithAnchor<ClientProps> = (props) => {\n const { anchorElem = document.body } = props\n\n return createPortal(<LinkEditor anchorElem={anchorElem} />, anchorElem)\n}\n"],"names":["React","createPortal","LinkEditor","FloatingLinkEditorPlugin","props","anchorElem","document","body"],"mappings":"AAAA;;AACA,YAAYA,WAAW,QAAO;AAC9B,SAASC,YAAY,QAAQ,YAAW;AAMxC,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,2BAAmE,CAACC;IAC/E,MAAM,EAAEC,aAAaC,SAASC,IAAI,EAAE,GAAGH;IAEvC,qBAAOH,2BAAa,KAACC;QAAWG,YAAYA;QAAgBA;AAC9D,EAAC"}
1
+ {"version":3,"sources":["../../../../../../src/features/link/client/plugins/floatingLinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ClientProps } from '../../index.js'\n\nimport './index.scss'\nimport { LinkEditor } from './LinkEditor/index.js'\n\nexport const FloatingLinkEditorPlugin: PluginComponentWithAnchor<ClientProps> = (props) => {\n const { anchorElem = document.body } = props\n\n return createPortal(<LinkEditor anchorElem={anchorElem} />, anchorElem)\n}\n"],"names":["React","createPortal","LinkEditor","FloatingLinkEditorPlugin","props","anchorElem","document","body"],"mappings":"AAAA;;AACA,YAAYA,WAAW,QAAO;AAC9B,SAASC,YAAY,QAAQ,YAAW;AAKxC,OAAO,eAAc;AACrB,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,2BAAmE,CAACC;IAC/E,MAAM,EAAEC,aAAaC,SAASC,IAAI,EAAE,GAAGH;IAEvC,qBAAOH,2BAAa,QAACC;QAAWG,YAAYA;;;;;cAAgBA;AAC9D,EAAC"}
@@ -0,0 +1,92 @@
1
+ @import '~@payloadcms/ui/scss';
2
+
3
+ @layer payload-default {
4
+ .link-editor {
5
+ z-index: 1;
6
+ display: flex;
7
+ align-items: center;
8
+ background: var(--theme-input-bg);
9
+ padding: 4px 4px 4px 12px;
10
+ vertical-align: middle;
11
+ position: absolute;
12
+ top: 0;
13
+ left: 0;
14
+ opacity: 0;
15
+ border-radius: $style-radius-m;
16
+ transition: opacity 0.2s;
17
+ will-change: transform;
18
+ box-shadow:
19
+ 0px 1px 2px 1px rgba(0, 0, 0, 0.1),
20
+ 0px 4px 16px 0px rgba(0, 0, 0, 0.1),
21
+ 0px -4px 16px 0px rgba(0, 0, 0, 0.1);
22
+
23
+ .link-input {
24
+ display: flex;
25
+ align-items: center;
26
+ flex-direction: row;
27
+ flex-wrap: nowrap;
28
+ min-height: 28px;
29
+ box-sizing: border-box;
30
+ @extend %body;
31
+ border: 0;
32
+ outline: 0;
33
+ position: relative;
34
+ font-family: var(--font-body);
35
+
36
+ .icon--externalLink {
37
+ margin-right: 5px;
38
+ }
39
+
40
+ &__label-pure {
41
+ color: var(--theme-elevation-1000);
42
+ margin-right: 15px;
43
+ display: block;
44
+ white-space: nowrap;
45
+ overflow: hidden;
46
+ }
47
+
48
+ a {
49
+ text-decoration: underline;
50
+ display: block;
51
+ white-space: nowrap;
52
+ overflow: hidden;
53
+ margin-right: base(0.4);
54
+ text-overflow: ellipsis;
55
+ color: var(--theme-success-750);
56
+
57
+ &:hover {
58
+ color: var(--theme-success-850);
59
+ }
60
+ }
61
+ }
62
+
63
+ button {
64
+ all: unset;
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ background-size: 16px;
69
+ background-position: center;
70
+ background-repeat: no-repeat;
71
+ width: 30px;
72
+ height: 30px;
73
+ cursor: pointer;
74
+ color: var(--theme-elevation-600);
75
+ border-radius: $style-radius-m;
76
+
77
+ &:hover:not([disabled]) {
78
+ color: var(--theme-elevation-800);
79
+ background-color: var(--theme-elevation-100);
80
+ }
81
+ }
82
+ }
83
+
84
+ html[data-theme='light'] {
85
+ .link-editor {
86
+ box-shadow:
87
+ 0px 1px 2px 1px rgba(0, 0, 0, 0.05),
88
+ 0px 4px 8px 0px rgba(0, 0, 0, 0.05),
89
+ 0px -4px 16px 0px rgba(0, 0, 0, 0.05);
90
+ }
91
+ }
92
+ }
@@ -70,6 +70,7 @@ export const getBaseFields = (config, enabledCollections, disabledCollections, m
70
70
  ];
71
71
  // Only display internal link-specific fields / options / conditions if there are enabled relations
72
72
  if (enabledRelations?.length) {
73
+ ;
73
74
  baseFields[1].options.push({
74
75
  label: ({ t })=>t('fields:internalLink'),
75
76
  value: 'internal'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/features/link/server/baseFields.ts"],"sourcesContent":["import type {\n CollectionSlug,\n FieldAffectingData,\n RadioField,\n SanitizedConfig,\n TextField,\n TextFieldSingleValidation,\n TypedUser,\n} from 'payload'\n\nimport type { LinkFields } from '../nodes/types.js'\n\nimport { validateUrl, validateUrlMinimal } from '../../../lexical/utils/url.js'\n\nexport const getBaseFields = (\n config: SanitizedConfig,\n enabledCollections?: CollectionSlug[],\n disabledCollections?: CollectionSlug[],\n maxDepth?: number,\n): FieldAffectingData[] => {\n let enabledRelations: CollectionSlug[]\n\n /**\n * Figure out which relations should be enabled (enabledRelations) based on a collection's admin.enableRichTextLink property,\n * or the Link Feature's enabledCollections and disabledCollections properties which override it.\n */\n if (enabledCollections) {\n enabledRelations = enabledCollections\n } else if (disabledCollections) {\n enabledRelations = config.collections\n .filter(({ slug }) => !disabledCollections.includes(slug))\n .map(({ slug }) => slug)\n } else {\n enabledRelations = config.collections\n .filter(({ admin: { enableRichTextLink, hidden } }) => {\n if (typeof hidden !== 'function' && hidden) {\n return false\n }\n return enableRichTextLink\n })\n .map(({ slug }) => slug)\n }\n\n const baseFields: FieldAffectingData[] = [\n {\n name: 'text',\n type: 'text',\n label: ({ t }) => t('fields:textToDisplay'),\n required: true,\n },\n {\n name: 'linkType',\n type: 'radio',\n admin: {\n description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'),\n },\n defaultValue: 'custom',\n label: ({ t }) => t('fields:linkType'),\n options: [\n {\n label: ({ t }) => t('fields:customURL'),\n value: 'custom',\n },\n ],\n required: true,\n } as RadioField,\n {\n name: 'url',\n type: 'text',\n hooks: {\n beforeChange: [\n ({ value }) => {\n if (!value) {\n return\n }\n\n if (!validateUrl(value)) {\n return encodeURIComponent(value)\n }\n return value\n },\n ],\n },\n label: ({ t }) => t('fields:enterURL'),\n required: true,\n validate: ((value: string, options) => {\n if ((options?.siblingData as LinkFields)?.linkType === 'internal') {\n return // no validation needed, as no url should exist for internal links\n }\n if (!validateUrlMinimal(value)) {\n return 'Invalid URL'\n }\n }) as TextFieldSingleValidation,\n },\n ]\n\n // Only display internal link-specific fields / options / conditions if there are enabled relations\n if (enabledRelations?.length) {\n ;(baseFields[1] as RadioField).options.push({\n label: ({ t }) => t('fields:internalLink'),\n value: 'internal',\n })\n ;(baseFields[2] as TextField).admin = {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType !== 'internal'\n },\n }\n\n baseFields.push({\n name: 'doc',\n admin: {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType === 'internal'\n },\n },\n // when admin.hidden is a function we need to dynamically call hidden with the user to know if the collection should be shown\n type: 'relationship',\n filterOptions:\n !enabledCollections && !disabledCollections\n ? async ({ relationTo, req, user }) => {\n const admin = config.collections.find(({ slug }) => slug === relationTo)?.admin\n\n const hidden = admin?.hidden\n if (typeof hidden === 'function' && hidden({ user } as { user: TypedUser })) {\n return false\n }\n\n const baseFilter = admin?.baseFilter ?? admin?.baseListFilter\n return (\n (await baseFilter?.({\n limit: 0,\n page: 1,\n req,\n sort: 'id',\n })) ?? true\n )\n }\n : null,\n label: ({ t }) => t('fields:chooseDocumentToLink'),\n maxDepth,\n relationTo: enabledRelations,\n required: true,\n })\n }\n\n baseFields.push({\n name: 'newTab',\n type: 'checkbox',\n label: ({ t }) => t('fields:openInNewTab'),\n })\n\n return baseFields\n}\n"],"names":["validateUrl","validateUrlMinimal","getBaseFields","config","enabledCollections","disabledCollections","maxDepth","enabledRelations","collections","filter","slug","includes","map","admin","enableRichTextLink","hidden","baseFields","name","type","label","t","required","description","defaultValue","options","value","hooks","beforeChange","encodeURIComponent","validate","siblingData","linkType","length","push","condition","_data","_siblingData","filterOptions","relationTo","req","user","find","baseFilter","baseListFilter","limit","page","sort"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/features/link/server/baseFields.ts"],"sourcesContent":["import type {\n CollectionSlug,\n FieldAffectingData,\n RadioField,\n SanitizedConfig,\n TextField,\n TextFieldSingleValidation,\n TypedUser,\n} from 'payload'\n\nimport type { LinkFields } from '../nodes/types.js'\n\nimport { validateUrl, validateUrlMinimal } from '../../../lexical/utils/url.js'\n\nexport const getBaseFields = (\n config: SanitizedConfig,\n enabledCollections?: CollectionSlug[],\n disabledCollections?: CollectionSlug[],\n maxDepth?: number,\n): FieldAffectingData[] => {\n let enabledRelations: CollectionSlug[]\n\n /**\n * Figure out which relations should be enabled (enabledRelations) based on a collection's admin.enableRichTextLink property,\n * or the Link Feature's enabledCollections and disabledCollections properties which override it.\n */\n if (enabledCollections) {\n enabledRelations = enabledCollections\n } else if (disabledCollections) {\n enabledRelations = config.collections\n .filter(({ slug }) => !disabledCollections.includes(slug))\n .map(({ slug }) => slug)\n } else {\n enabledRelations = config.collections\n .filter(({ admin: { enableRichTextLink, hidden } }) => {\n if (typeof hidden !== 'function' && hidden) {\n return false\n }\n return enableRichTextLink\n })\n .map(({ slug }) => slug)\n }\n\n const baseFields: FieldAffectingData[] = [\n {\n name: 'text',\n type: 'text',\n label: ({ t }) => t('fields:textToDisplay'),\n required: true,\n },\n {\n name: 'linkType',\n type: 'radio',\n admin: {\n description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'),\n },\n defaultValue: 'custom',\n label: ({ t }) => t('fields:linkType'),\n options: [\n {\n label: ({ t }) => t('fields:customURL'),\n value: 'custom',\n },\n ],\n required: true,\n } as RadioField,\n {\n name: 'url',\n type: 'text',\n hooks: {\n beforeChange: [\n ({ value }) => {\n if (!value) {\n return\n }\n\n if (!validateUrl(value)) {\n return encodeURIComponent(value)\n }\n return value\n },\n ],\n },\n label: ({ t }) => t('fields:enterURL'),\n required: true,\n validate: ((value: string, options) => {\n if ((options?.siblingData as LinkFields)?.linkType === 'internal') {\n return // no validation needed, as no url should exist for internal links\n }\n if (!validateUrlMinimal(value)) {\n return 'Invalid URL'\n }\n }) as TextFieldSingleValidation,\n },\n ]\n\n // Only display internal link-specific fields / options / conditions if there are enabled relations\n if (enabledRelations?.length) {\n ;(baseFields[1] as RadioField).options.push({\n label: ({ t }) => t('fields:internalLink'),\n value: 'internal',\n })\n ;(baseFields[2] as TextField).admin = {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType !== 'internal'\n },\n }\n\n baseFields.push({\n name: 'doc',\n admin: {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType === 'internal'\n },\n },\n // when admin.hidden is a function we need to dynamically call hidden with the user to know if the collection should be shown\n type: 'relationship',\n filterOptions:\n !enabledCollections && !disabledCollections\n ? async ({ relationTo, req, user }) => {\n const admin = config.collections.find(({ slug }) => slug === relationTo)?.admin\n\n const hidden = admin?.hidden\n if (typeof hidden === 'function' && hidden({ user } as { user: TypedUser })) {\n return false\n }\n\n const baseFilter = admin?.baseFilter ?? admin?.baseListFilter\n return (\n (await baseFilter?.({\n limit: 0,\n page: 1,\n req,\n sort: 'id',\n })) ?? true\n )\n }\n : null,\n label: ({ t }) => t('fields:chooseDocumentToLink'),\n maxDepth,\n relationTo: enabledRelations,\n required: true,\n })\n }\n\n baseFields.push({\n name: 'newTab',\n type: 'checkbox',\n label: ({ t }) => t('fields:openInNewTab'),\n })\n\n return baseFields\n}\n"],"names":["validateUrl","validateUrlMinimal","getBaseFields","config","enabledCollections","disabledCollections","maxDepth","enabledRelations","collections","filter","slug","includes","map","admin","enableRichTextLink","hidden","baseFields","name","type","label","t","required","description","defaultValue","options","value","hooks","beforeChange","encodeURIComponent","validate","siblingData","linkType","length","push","condition","_data","_siblingData","filterOptions","relationTo","req","user","find","baseFilter","baseListFilter","limit","page","sort"],"mappings":"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"}