@payloadcms/richtext-lexical 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ee5d8bd

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 (177) hide show
  1. package/dist/exports/client/Field-334JNLRF.js +2 -0
  2. package/dist/exports/client/Field-334JNLRF.js.map +7 -0
  3. package/dist/exports/client/{RelationshipComponent-YCPAKOL7.js → RelationshipComponent-TVK6I4W4.js} +2 -2
  4. package/dist/exports/client/chunk-BEKGION5.js +2 -0
  5. package/dist/exports/client/chunk-BEKGION5.js.map +7 -0
  6. package/dist/exports/client/{chunk-WSAPGI3Z.js → chunk-EA5BHQ2T.js} +1 -1
  7. package/dist/exports/client/{chunk-WSAPGI3Z.js.map → chunk-EA5BHQ2T.js.map} +1 -1
  8. package/dist/exports/client/chunk-FAJJXXCW.js +2 -0
  9. package/dist/exports/client/{chunk-3LRZDIIG.js.map → chunk-FAJJXXCW.js.map} +2 -2
  10. package/dist/exports/client/{chunk-5VIL27GI.js → chunk-IYBYNEKX.js} +1 -1
  11. package/dist/exports/client/{chunk-5VIL27GI.js.map → chunk-IYBYNEKX.js.map} +1 -1
  12. package/dist/exports/client/chunk-SE5IITBK.js +2 -0
  13. package/dist/exports/client/chunk-SE5IITBK.js.map +7 -0
  14. package/dist/exports/client/{component-6DQLENIE.js → component-QENB4QTS.js} +2 -2
  15. package/dist/exports/client/componentInline-AU7IBNY7.js +2 -0
  16. package/dist/exports/client/index.js +26 -26
  17. package/dist/exports/client/index.js.map +4 -4
  18. package/dist/features/align/client/index.js.map +1 -1
  19. package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
  20. package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
  21. package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
  22. package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
  23. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  24. package/dist/features/blocks/client/component/index.js +38 -16
  25. package/dist/features/blocks/client/component/index.js.map +1 -1
  26. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  27. package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
  28. package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
  29. package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
  30. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  31. package/dist/features/blocks/client/componentInline/index.js +5 -11
  32. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  33. package/dist/features/blocks/client/getCachedFormStateIfDataMatches.js.map +1 -1
  34. package/dist/features/blocks/client/plugin/index.js.map +1 -1
  35. package/dist/features/blocks/premade/CodeBlock/Component/Block.js +121 -78
  36. package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
  37. package/dist/features/blocks/premade/CodeBlock/Component/Code.js +142 -87
  38. package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
  39. package/dist/features/converters/lexicalToHtml/sync/types.d.ts.map +1 -1
  40. package/dist/features/converters/lexicalToHtml/sync/types.js.map +1 -1
  41. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  42. package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
  43. package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
  44. package/dist/features/heading/client/index.js.map +1 -1
  45. package/dist/features/horizontalRule/client/plugin/index.js.map +1 -1
  46. package/dist/features/indent/client/index.d.ts.map +1 -1
  47. package/dist/features/indent/client/index.js +0 -2
  48. package/dist/features/indent/client/index.js.map +1 -1
  49. package/dist/features/indent/server/i18n.d.ts.map +1 -1
  50. package/dist/features/indent/server/i18n.js.map +1 -1
  51. package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
  52. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
  53. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +10 -2
  54. package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
  55. package/dist/features/link/client/plugins/link/index.js.map +1 -1
  56. package/dist/features/link/markdownTransformer.js +2 -2
  57. package/dist/features/link/markdownTransformer.js.map +1 -1
  58. package/dist/features/link/server/baseFields.js.map +1 -1
  59. package/dist/features/lists/shared/schema.d.ts.map +1 -1
  60. package/dist/features/lists/shared/schema.js.map +1 -1
  61. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  62. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  63. package/dist/features/relationship/client/utils/useEnabledRelationships.js.map +1 -1
  64. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.css +1 -1
  65. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  66. package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js +6 -6
  67. package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  68. package/dist/features/table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  69. package/dist/features/table/client/plugins/TablePlugin/index.js +54 -18
  70. package/dist/features/table/client/plugins/TablePlugin/index.js.map +1 -1
  71. package/dist/features/table/client/utils/useDebounce.js.map +1 -1
  72. package/dist/features/textState/defaultColors.js +1 -1
  73. package/dist/features/textState/defaultColors.js.map +1 -1
  74. package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.js.map +1 -1
  75. package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts.map +1 -1
  76. package/dist/features/toolbars/fixed/client/Toolbar/index.js +141 -70
  77. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  78. package/dist/features/toolbars/inline/client/Toolbar/index.d.ts.map +1 -1
  79. package/dist/features/toolbars/inline/client/Toolbar/index.js +82 -35
  80. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  81. package/dist/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
  82. package/dist/features/toolbars/shared/ToolbarButton/index.js +26 -2
  83. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  84. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +137 -72
  85. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  86. package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
  87. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +22 -6
  88. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  89. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.d.ts +5 -0
  90. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.d.ts.map +1 -0
  91. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js +109 -0
  92. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js.map +1 -0
  93. package/dist/features/upload/client/drawer/index.js.map +1 -1
  94. package/dist/features/upload/client/plugin/index.js.map +1 -1
  95. package/dist/field/RenderLexical/index.js.map +1 -1
  96. package/dist/field/ViewSelector.js +12 -4
  97. package/dist/field/ViewSelector.js.map +1 -1
  98. package/dist/field/bundled.css +1 -1
  99. package/dist/field/index.js.map +1 -1
  100. package/dist/field/rscEntry.d.ts +2 -2
  101. package/dist/field/rscEntry.d.ts.map +1 -1
  102. package/dist/field/rscEntry.js.map +1 -1
  103. package/dist/i18n.d.ts.map +1 -1
  104. package/dist/i18n.js +44 -0
  105. package/dist/i18n.js.map +1 -1
  106. package/dist/index.d.ts +3 -3
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/lexical/LexicalEditor.js.map +1 -1
  110. package/dist/lexical/plugins/ClipboardPlugin/index.js.map +1 -1
  111. package/dist/lexical/plugins/DecoratorPlugin/index.js.map +1 -1
  112. package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
  113. package/dist/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
  114. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +1 -1
  115. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +234 -87
  116. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  117. package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js.map +1 -1
  118. package/dist/lexical/plugins/TextPlugin/index.js.map +1 -1
  119. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  120. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.css +16 -0
  121. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
  122. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +126 -38
  123. package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
  124. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.d.ts +7 -0
  125. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.d.ts.map +1 -0
  126. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.js +15 -0
  127. package/dist/lexical/plugins/handles/DraggableBlockPlugin/moveBlock.js.map +1 -0
  128. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.d.ts.map +1 -1
  129. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js +9 -12
  130. package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js.map +1 -1
  131. package/dist/lexical/ui/ContentEditable.d.ts.map +1 -1
  132. package/dist/lexical/ui/ContentEditable.js +16 -9
  133. package/dist/lexical/ui/ContentEditable.js.map +1 -1
  134. package/dist/lexical/utils/nodeFormat.d.ts.map +1 -1
  135. package/dist/lexical/utils/nodeFormat.js +0 -2
  136. package/dist/lexical/utils/nodeFormat.js.map +1 -1
  137. package/dist/lexical/utils/url.d.ts.map +1 -1
  138. package/dist/lexical/utils/url.js +1 -1
  139. package/dist/lexical/utils/url.js.map +1 -1
  140. package/dist/populateGraphQL/populate.d.ts.map +1 -1
  141. package/dist/populateGraphQL/populate.js +1 -2
  142. package/dist/populateGraphQL/populate.js.map +1 -1
  143. package/dist/types/index.d.ts +1 -4
  144. package/dist/types/index.d.ts.map +1 -1
  145. package/dist/types/index.js.map +1 -1
  146. package/dist/utilities/buildEditorState.d.ts.map +1 -1
  147. package/dist/utilities/buildEditorState.js.map +1 -1
  148. package/dist/utilities/fieldsDrawer/Drawer.js +36 -36
  149. package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
  150. package/dist/utilities/fieldsDrawer/DrawerContent.d.ts.map +1 -1
  151. package/dist/utilities/fieldsDrawer/DrawerContent.js +6 -9
  152. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  153. package/dist/utilities/fieldsDrawer/useDrawerSubmit.js.map +1 -1
  154. package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
  155. package/dist/utilities/fieldsDrawer/useLexicalDrawer.js.map +1 -1
  156. package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
  157. package/dist/utilities/generateImportMap.d.ts +2 -2
  158. package/dist/utilities/generateImportMap.d.ts.map +1 -1
  159. package/dist/utilities/generateImportMap.js.map +1 -1
  160. package/dist/utilities/initLexicalFeatures.d.ts.map +1 -1
  161. package/dist/utilities/initLexicalFeatures.js +38 -4
  162. package/dist/utilities/initLexicalFeatures.js.map +1 -1
  163. package/dist/utilities/useLexicalFeature.js +15 -6
  164. package/dist/utilities/useLexicalFeature.js.map +1 -1
  165. package/dist/utilities/useRunDeprioritized.js.map +1 -1
  166. package/package.json +32 -35
  167. package/dist/exports/client/Field-MT4FK3IP.js +0 -2
  168. package/dist/exports/client/Field-MT4FK3IP.js.map +0 -7
  169. package/dist/exports/client/chunk-3LRZDIIG.js +0 -2
  170. package/dist/exports/client/chunk-E6LSRRP2.js +0 -2
  171. package/dist/exports/client/chunk-E6LSRRP2.js.map +0 -7
  172. package/dist/exports/client/chunk-ZQX5HXUL.js +0 -2
  173. package/dist/exports/client/chunk-ZQX5HXUL.js.map +0 -7
  174. package/dist/exports/client/componentInline-HNE5G4TE.js +0 -2
  175. /package/dist/exports/client/{RelationshipComponent-YCPAKOL7.js.map → RelationshipComponent-TVK6I4W4.js.map} +0 -0
  176. /package/dist/exports/client/{component-6DQLENIE.js.map → component-QENB4QTS.js.map} +0 -0
  177. /package/dist/exports/client/{componentInline-HNE5G4TE.js.map → componentInline-AU7IBNY7.js.map} +0 -0
@@ -137,95 +137,182 @@ export function useDynamicPositioning(resolution, targetElementRef, onReposition
137
137
  useEffect(t0, t1);
138
138
  }
139
139
  export const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND');
140
- export function LexicalMenu({
141
- anchorElementRef,
142
- close,
143
- editor,
144
- // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.
145
- groups,
146
- menuRenderFn,
147
- resolution,
148
- shouldSplitNodeWithQuery = false
149
- }) {
140
+ export function LexicalMenu(t0) {
141
+ const $ = _c(50);
142
+ const {
143
+ anchorElementRef,
144
+ close,
145
+ editor,
146
+ groups,
147
+ menuRenderFn,
148
+ resolution,
149
+ shouldSplitNodeWithQuery: t1
150
+ } = t0;
151
+ const shouldSplitNodeWithQuery = t1 === undefined ? false : t1;
150
152
  const [selectedItemKey, setSelectedItemKey] = useState(null);
151
- const matchingString = resolution.match && resolution.match.matchingString || '';
152
- const updateSelectedItem = useCallback(item => {
153
- const rootElem = editor.getRootElement();
154
- if (rootElem !== null) {
155
- rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`);
156
- setSelectedItemKey(item.key);
157
- }
158
- }, [editor]);
159
- const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {
160
- // set selected item to the first of the matching ones
161
- if (groups !== null && matchingString != null) {
162
- // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.
163
- const allItems = groups.flatMap(group => group.items);
164
- if (allItems.length) {
165
- const firstMatchingItem = allItems[0];
166
- updateSelectedItem(firstMatchingItem);
153
+ const matchingString = resolution.match && resolution.match.matchingString || "";
154
+ let t2;
155
+ if ($[0] !== editor) {
156
+ t2 = item => {
157
+ const rootElem = editor.getRootElement();
158
+ if (rootElem !== null) {
159
+ rootElem.setAttribute("aria-activedescendant", `${baseClass}__item-${item.key}`);
160
+ setSelectedItemKey(item.key);
167
161
  }
168
- }
169
- }, [groups, updateSelectedItem, matchingString]);
170
- useEffect(() => {
171
- setSelectedItemKeyToFirstMatchingItem();
172
- }, [matchingString, setSelectedItemKeyToFirstMatchingItem]);
173
- const selectItemAndCleanUp = useCallback(selectedItem => {
174
- close();
175
- editor.update(() => {
176
- const textNodeContainingQuery = resolution.match != null && shouldSplitNodeWithQuery ? $splitNodeContainingQuery(resolution.match) : null;
177
- if (textNodeContainingQuery) {
178
- textNodeContainingQuery.remove();
162
+ };
163
+ $[0] = editor;
164
+ $[1] = t2;
165
+ } else {
166
+ t2 = $[1];
167
+ }
168
+ const updateSelectedItem = t2;
169
+ let t3;
170
+ if ($[2] !== groups || $[3] !== matchingString || $[4] !== updateSelectedItem) {
171
+ t3 = () => {
172
+ if (groups !== null && matchingString != null) {
173
+ const allItems = groups.flatMap(_temp);
174
+ if (allItems.length) {
175
+ const firstMatchingItem = allItems[0];
176
+ updateSelectedItem(firstMatchingItem);
177
+ }
179
178
  }
180
- });
181
- setTimeout(() => {
182
- // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724
183
- let selection;
184
- editor.read(() => {
185
- selection = $getSelection()?.clone();
186
- });
179
+ };
180
+ $[2] = groups;
181
+ $[3] = matchingString;
182
+ $[4] = updateSelectedItem;
183
+ $[5] = t3;
184
+ } else {
185
+ t3 = $[5];
186
+ }
187
+ const setSelectedItemKeyToFirstMatchingItem = t3;
188
+ let t4;
189
+ if ($[6] !== setSelectedItemKeyToFirstMatchingItem) {
190
+ t4 = () => {
191
+ setSelectedItemKeyToFirstMatchingItem();
192
+ };
193
+ $[6] = setSelectedItemKeyToFirstMatchingItem;
194
+ $[7] = t4;
195
+ } else {
196
+ t4 = $[7];
197
+ }
198
+ let t5;
199
+ if ($[8] !== matchingString || $[9] !== setSelectedItemKeyToFirstMatchingItem) {
200
+ t5 = [matchingString, setSelectedItemKeyToFirstMatchingItem];
201
+ $[8] = matchingString;
202
+ $[9] = setSelectedItemKeyToFirstMatchingItem;
203
+ $[10] = t5;
204
+ } else {
205
+ t5 = $[10];
206
+ }
207
+ useEffect(t4, t5);
208
+ let t6;
209
+ if ($[11] !== close || $[12] !== editor || $[13] !== resolution.match || $[14] !== shouldSplitNodeWithQuery) {
210
+ t6 = selectedItem => {
211
+ close();
187
212
  editor.update(() => {
188
- if (selection) {
189
- $setSelection(selection);
213
+ const textNodeContainingQuery = resolution.match != null && shouldSplitNodeWithQuery ? $splitNodeContainingQuery(resolution.match) : null;
214
+ if (textNodeContainingQuery) {
215
+ textNodeContainingQuery.remove();
190
216
  }
191
217
  });
192
- selectedItem.onSelect({
193
- editor,
194
- queryString: resolution.match ? resolution.match.matchingString : ''
195
- });
196
- }, 0);
197
- }, [editor, shouldSplitNodeWithQuery, resolution.match, close]);
198
- useEffect(() => {
199
- return () => {
218
+ setTimeout(() => {
219
+ let selection;
220
+ editor.read(() => {
221
+ selection = $getSelection()?.clone();
222
+ });
223
+ editor.update(() => {
224
+ if (selection) {
225
+ $setSelection(selection);
226
+ }
227
+ });
228
+ selectedItem.onSelect({
229
+ editor,
230
+ queryString: resolution.match ? resolution.match.matchingString : ""
231
+ });
232
+ }, 0);
233
+ };
234
+ $[11] = close;
235
+ $[12] = editor;
236
+ $[13] = resolution.match;
237
+ $[14] = shouldSplitNodeWithQuery;
238
+ $[15] = t6;
239
+ } else {
240
+ t6 = $[15];
241
+ }
242
+ const selectItemAndCleanUp = t6;
243
+ let t7;
244
+ let t8;
245
+ if ($[16] !== editor) {
246
+ t7 = () => () => {
200
247
  const rootElem_0 = editor.getRootElement();
201
248
  if (rootElem_0 !== null) {
202
- rootElem_0.removeAttribute('aria-activedescendant');
249
+ rootElem_0.removeAttribute("aria-activedescendant");
203
250
  }
204
251
  };
205
- }, [editor]);
206
- useLayoutEffect(() => {
207
- if (groups === null) {
208
- setSelectedItemKey(null);
209
- } else if (selectedItemKey === null) {
210
- setSelectedItemKeyToFirstMatchingItem();
211
- }
212
- }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem]);
213
- useEffect(() => {
214
- return mergeRegister(editor.registerCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, ({
215
- item: item_0
216
- }) => {
217
- if (item_0.ref && item_0.ref.current != null) {
218
- scrollIntoViewIfNeeded(item_0.ref.current);
219
- return true;
252
+ t8 = [editor];
253
+ $[16] = editor;
254
+ $[17] = t7;
255
+ $[18] = t8;
256
+ } else {
257
+ t7 = $[17];
258
+ t8 = $[18];
259
+ }
260
+ useEffect(t7, t8);
261
+ let t9;
262
+ if ($[19] !== groups || $[20] !== selectedItemKey || $[21] !== setSelectedItemKeyToFirstMatchingItem) {
263
+ t9 = () => {
264
+ if (groups === null) {
265
+ setSelectedItemKey(null);
266
+ } else {
267
+ if (selectedItemKey === null) {
268
+ setSelectedItemKeyToFirstMatchingItem();
269
+ }
220
270
  }
221
- return false;
222
- }, COMMAND_PRIORITY_LOW));
223
- }, [editor, updateSelectedItem]);
224
- useEffect(() => {
225
- return mergeRegister(editor.registerCommand(KEY_ARROW_DOWN_COMMAND, payload => {
271
+ };
272
+ $[19] = groups;
273
+ $[20] = selectedItemKey;
274
+ $[21] = setSelectedItemKeyToFirstMatchingItem;
275
+ $[22] = t9;
276
+ } else {
277
+ t9 = $[22];
278
+ }
279
+ let t10;
280
+ if ($[23] !== groups || $[24] !== selectedItemKey || $[25] !== setSelectedItemKeyToFirstMatchingItem || $[26] !== updateSelectedItem) {
281
+ t10 = [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem];
282
+ $[23] = groups;
283
+ $[24] = selectedItemKey;
284
+ $[25] = setSelectedItemKeyToFirstMatchingItem;
285
+ $[26] = updateSelectedItem;
286
+ $[27] = t10;
287
+ } else {
288
+ t10 = $[27];
289
+ }
290
+ useLayoutEffect(t9, t10);
291
+ let t11;
292
+ if ($[28] !== editor) {
293
+ t11 = () => mergeRegister(editor.registerCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, _temp2, COMMAND_PRIORITY_LOW));
294
+ $[28] = editor;
295
+ $[29] = t11;
296
+ } else {
297
+ t11 = $[29];
298
+ }
299
+ let t12;
300
+ if ($[30] !== editor || $[31] !== updateSelectedItem) {
301
+ t12 = [editor, updateSelectedItem];
302
+ $[30] = editor;
303
+ $[31] = updateSelectedItem;
304
+ $[32] = t12;
305
+ } else {
306
+ t12 = $[32];
307
+ }
308
+ useEffect(t11, t12);
309
+ let t13;
310
+ let t14;
311
+ if ($[33] !== close || $[34] !== editor || $[35] !== groups || $[36] !== selectItemAndCleanUp || $[37] !== selectedItemKey || $[38] !== updateSelectedItem) {
312
+ t13 = () => mergeRegister(editor.registerCommand(KEY_ARROW_DOWN_COMMAND, payload => {
226
313
  const event = payload;
227
314
  if (groups !== null && groups.length && selectedItemKey !== null) {
228
- const allItems_0 = groups.flatMap(group_0 => group_0.items);
315
+ const allItems_0 = groups.flatMap(_temp3);
229
316
  const selectedIndex = allItems_0.findIndex(item_1 => item_1.key === selectedItemKey);
230
317
  const newSelectedIndex = selectedIndex !== allItems_0.length - 1 ? selectedIndex + 1 : 0;
231
318
  const newSelectedItem = allItems_0[newSelectedIndex];
@@ -246,7 +333,7 @@ export function LexicalMenu({
246
333
  }, COMMAND_PRIORITY_NORMAL), editor.registerCommand(KEY_ARROW_UP_COMMAND, payload_0 => {
247
334
  const event_0 = payload_0;
248
335
  if (groups !== null && groups.length && selectedItemKey !== null) {
249
- const allItems_1 = groups.flatMap(group_1 => group_1.items);
336
+ const allItems_1 = groups.flatMap(_temp4);
250
337
  const selectedIndex_0 = allItems_1.findIndex(item_2 => item_2.key === selectedItemKey);
251
338
  const newSelectedIndex_0 = selectedIndex_0 !== 0 ? selectedIndex_0 - 1 : allItems_1.length - 1;
252
339
  const newSelectedItem_0 = allItems_1[newSelectedIndex_0];
@@ -272,7 +359,7 @@ export function LexicalMenu({
272
359
  if (groups === null || selectedItemKey === null) {
273
360
  return false;
274
361
  }
275
- const allItems_2 = groups.flatMap(group_2 => group_2.items);
362
+ const allItems_2 = groups.flatMap(_temp5);
276
363
  const selectedItem_0 = allItems_2.find(item_3 => item_3.key === selectedItemKey);
277
364
  if (!selectedItem_0) {
278
365
  return false;
@@ -285,7 +372,7 @@ export function LexicalMenu({
285
372
  if (groups === null || selectedItemKey === null) {
286
373
  return false;
287
374
  }
288
- const allItems_3 = groups.flatMap(group_3 => group_3.items);
375
+ const allItems_3 = groups.flatMap(_temp6);
289
376
  const selectedItem_1 = allItems_3.find(item_4 => item_4.key === selectedItemKey);
290
377
  if (!selectedItem_1) {
291
378
  return false;
@@ -297,14 +384,74 @@ export function LexicalMenu({
297
384
  selectItemAndCleanUp(selectedItem_1);
298
385
  return true;
299
386
  }, COMMAND_PRIORITY_NORMAL));
300
- }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem]);
301
- const listItemProps = useMemo(() => ({
302
- groups,
303
- selectedItemKey,
304
- selectItemAndCleanUp,
305
- setSelectedItemKey
306
- }), [selectItemAndCleanUp, selectedItemKey, groups]);
307
- return menuRenderFn(anchorElementRef, listItemProps, resolution.match ? resolution.match.matchingString : '');
387
+ t14 = [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem];
388
+ $[33] = close;
389
+ $[34] = editor;
390
+ $[35] = groups;
391
+ $[36] = selectItemAndCleanUp;
392
+ $[37] = selectedItemKey;
393
+ $[38] = updateSelectedItem;
394
+ $[39] = t13;
395
+ $[40] = t14;
396
+ } else {
397
+ t13 = $[39];
398
+ t14 = $[40];
399
+ }
400
+ useEffect(t13, t14);
401
+ let t15;
402
+ if ($[41] !== groups || $[42] !== selectItemAndCleanUp || $[43] !== selectedItemKey) {
403
+ t15 = {
404
+ groups,
405
+ selectedItemKey,
406
+ selectItemAndCleanUp,
407
+ setSelectedItemKey
408
+ };
409
+ $[41] = groups;
410
+ $[42] = selectItemAndCleanUp;
411
+ $[43] = selectedItemKey;
412
+ $[44] = t15;
413
+ } else {
414
+ t15 = $[44];
415
+ }
416
+ const listItemProps = t15;
417
+ const t16 = resolution.match ? resolution.match.matchingString : "";
418
+ let t17;
419
+ if ($[45] !== anchorElementRef || $[46] !== listItemProps || $[47] !== menuRenderFn || $[48] !== t16) {
420
+ t17 = menuRenderFn(anchorElementRef, listItemProps, t16);
421
+ $[45] = anchorElementRef;
422
+ $[46] = listItemProps;
423
+ $[47] = menuRenderFn;
424
+ $[48] = t16;
425
+ $[49] = t17;
426
+ } else {
427
+ t17 = $[49];
428
+ }
429
+ return t17;
430
+ }
431
+ function _temp6(group_3) {
432
+ return group_3.items;
433
+ }
434
+ function _temp5(group_2) {
435
+ return group_2.items;
436
+ }
437
+ function _temp4(group_1) {
438
+ return group_1.items;
439
+ }
440
+ function _temp3(group_0) {
441
+ return group_0.items;
442
+ }
443
+ function _temp2(t0) {
444
+ const {
445
+ item: item_0
446
+ } = t0;
447
+ if (item_0.ref && item_0.ref.current != null) {
448
+ scrollIntoViewIfNeeded(item_0.ref.current);
449
+ return true;
450
+ }
451
+ return false;
452
+ }
453
+ function _temp(group) {
454
+ return group.items;
308
455
  }
309
456
  function setContainerDivAttributes(containerDiv, className) {
310
457
  if (className != null) {
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","getScrollParent","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","t1","current","rootElement","getRootElement","rootScrollParent","body","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","selectedItemKey","setSelectedItemKey","updateSelectedItem","item","rootElem","setAttribute","key","setSelectedItemKeyToFirstMatchingItem","allItems","flatMap","group","items","firstMatchingItem","selectItemAndCleanUp","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","removeAttribute","registerCommand","ref","payload","event","selectedIndex","findIndex","newSelectedIndex","newSelectedItem","dispatchCommand","index","preventDefault","stopImmediatePropagation","find","listItemProps","setContainerDivAttributes","containerDiv","className","style","display","position","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","undefined","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","append","positionMenu","t2","t3","rootElement_0","containerDiv_0","t4"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { getScrollParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"LexicalMenu.js","names":["c","_c","useLexicalComposerContext","getScrollParent","mergeRegister","$getSelection","$isRangeSelection","$setSelection","COMMAND_PRIORITY_LOW","COMMAND_PRIORITY_NORMAL","createCommand","KEY_ARROW_DOWN_COMMAND","KEY_ARROW_UP_COMMAND","KEY_ENTER_COMMAND","KEY_ESCAPE_COMMAND","KEY_TAB_COMMAND","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","CAN_USE_DOM","baseClass","scrollIntoViewIfNeeded","target","typeaheadContainerNode","document","getElementById","typeaheadRect","getBoundingClientRect","top","height","window","innerHeight","scrollIntoView","block","getFullMatchOffset","documentText","entryText","offset","triggerOffset","i","length","substring","$splitNodeContainingQuery","match","selection","isCollapsed","anchor","type","anchorNode","getNode","isSimpleText","selectionOffset","textContent","getTextContent","slice","characterOffset","replaceableString","queryOffset","matchingString","startOffset","newNode","splitText","isTriggerVisibleInNearestScrollContainer","targetElement","containerElement","tRect","cRect","bottom","useDynamicPositioning","resolution","targetElementRef","onReposition","onVisibilityChange","$","editor","t0","t1","current","rootElement","getRootElement","rootScrollParent","body","ticking","previousIsInView","handleScroll","requestAnimationFrame","isInView","resizeObserver","ResizeObserver","addEventListener","capture","passive","observe","disconnect","removeEventListener","SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND","LexicalMenu","anchorElementRef","close","groups","menuRenderFn","shouldSplitNodeWithQuery","undefined","selectedItemKey","setSelectedItemKey","t2","item","rootElem","setAttribute","key","updateSelectedItem","t3","allItems","flatMap","_temp","firstMatchingItem","setSelectedItemKeyToFirstMatchingItem","t4","t5","t6","selectedItem","update","textNodeContainingQuery","remove","setTimeout","read","clone","onSelect","queryString","selectItemAndCleanUp","t7","t8","rootElem_0","removeAttribute","t9","t10","t11","registerCommand","_temp2","t12","t13","t14","payload","event","allItems_0","_temp3","selectedIndex","findIndex","item_1","newSelectedIndex","newSelectedItem","ref","dispatchCommand","index","preventDefault","stopImmediatePropagation","payload_0","event_0","allItems_1","_temp4","selectedIndex_0","item_2","newSelectedIndex_0","newSelectedItem_0","payload_1","event_1","payload_2","event_2","allItems_2","_temp5","selectedItem_0","find","item_3","event_3","allItems_3","_temp6","selectedItem_1","item_4","t15","listItemProps","t16","t17","group_3","group","items","group_2","group_1","group_0","item_0","setContainerDivAttributes","containerDiv","className","style","display","position","useMenuAnchorRef","anchorElem","setResolution","Symbol","for","createElement","parent","menuEle","firstChild","width","getRect","left","rawTop","scrollY","scrollX","menuRect","menuHeight","menuWidth","rootElementRect","isRTL","dir","documentElement","anchorRect","leftBoundary","Math","max","right","newLeft","wouldGoOffBottomOfScreen","wouldGoOffTopOfScreen","isConnected","append","positionMenu","rootElement_0","containerDiv_0"],"sources":["../../../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { getScrollParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_LOW,\n COMMAND_PRIORITY_NORMAL,\n createCommand,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nimport { CAN_USE_DOM } from '../../../utils/canUseDOM.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectedItemKey: null | string\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | null | ReactPortal\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) {\n return\n }\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | undefined {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElementRef: RefObject<HTMLElement | null>,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n const targetElement = targetElementRef.current\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.disconnect()\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [editor, onVisibilityChange, onReposition, resolution, targetElementRef])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement | null>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]!\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n close()\n\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n if (textNodeContainingQuery) {\n textNodeContainingQuery.remove()\n }\n })\n\n setTimeout(() => {\n // Needed in Firefox. See https://github.com/payloadcms/payload/issues/10724\n let selection: BaseSelection | undefined\n editor.read(() => {\n selection = $getSelection()?.clone()\n })\n editor.update(() => {\n if (selection) {\n $setSelection(selection)\n }\n })\n\n selectedItem.onSelect({\n editor,\n queryString: resolution.match ? resolution.match.matchingString : '',\n })\n }, 0)\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n if (!newSelectedItem) {\n return false\n }\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_NORMAL,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectedItemKey,\n selectItemAndCleanUp,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nfunction setContainerDivAttributes(containerDiv: HTMLElement, className?: string) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement | null> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement | null>(\n CAN_USE_DOM ? document.createElement('div') : null,\n )\n const positionMenu = useCallback(() => {\n if (anchorElementRef.current === null || parent === undefined) {\n return\n }\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n const isRTL = document.dir === 'rtl' || document.documentElement.dir === 'rtl'\n const anchorRect = anchorElem.getBoundingClientRect()\n const leftBoundary = Math.max(0, rootElementRect.left)\n\n if (!isRTL && left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n } else if (isRTL && menuRect.left < leftBoundary) {\n const newLeft = leftBoundary + menuWidth - anchorRect.left\n containerDiv.style.left = `${newLeft + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n setContainerDivAttributes(containerDiv, className)\n anchorElem.append(containerDiv)\n }\n containerDiv.setAttribute('id', 'slash-menu')\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n containerDiv.removeAttribute('id')\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTriggerMatch.js","names":["c","_c","useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","t0","$","maxLength","t1","minLength","t2","undefined","t3","t4","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]!\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]!\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2]!, // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,WAAW,QAAQ;AAE5B,SAASC,WAAW,QAAQ;AAiB5B;;;AAGA,OAAO,SAAAC,oBAAAC,OAAA,EAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAKL;IAAAO,SAAA,EAAAC,EAAA;IAAAC,SAAA,EAAAC;EAAA,IAAAL,EAA6E;EAA3E,MAAAE,SAAA,GAAAC,EAAc,KAAAG,SAAA,QAAdH,EAAc;EAAE,MAAAC,SAAA,GAAAC,EAAa,KAAAC,SAAA,OAAbD,EAAa;EAAA,IAAAE,EAAA;EAAA,IAAAN,CAAA,QAAAC,SAAA,IAAAD,CAAA,QAAAG,SAAA,IAAAH,CAAA,QAAAF,OAAA;IAG7BQ,EAAA,GAAAC,EAAA;MAAC;QAAAC;MAAA,IAAAD,EAAS;MACR,MAAAE,UAAA,GAAmB,OAAOX,OAAA,GAAAF,WAAU,GAAc;MAClD,MAAAc,qBAAA,OAAAC,MAAA,CACE,eACE,GACAb,OAAA,GACA,MACA,SACAW,UAAA,GACA,SACAR,SAAA,GACA,OACA;MAEJ,MAAAW,KAAA,GAAcF,qBAAA,CAAAG,IAAA,CAA2BL,KAAA;MAAA,IACrCI,KAAA,SAAU;QACZ,MAAAE,sBAAA,GAA+BF,KAAK;QAKpC,MAAAG,cAAA,GAAuBH,KAAK;QAAG,IAE3BG,cAAA,CAAAC,MAAA,IAAyBb,SAAA;UAAA;YAAAc,UAAA,EAEbL,KAAA,CAAAM,KAAA,GAAcJ,sBAAA,CAAAE,MAA6B;YAAAD,cAAA;YAAAI,iBAAA,EAEpCP,KAAK;UAAA;QAAA;MAAA;MAAA;IAAA;IAKhCZ,CAAA,MAAAC,SAAA;IAAAD,CAAA,MAAAG,SAAA;IAAAH,CAAA,MAAAF,OAAA;IAAAE,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAAA,OAjCKM,EAkC0B;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"useMenuTriggerMatch.js","names":["c","_c","useCallback","PUNCTUATION","useMenuTriggerMatch","trigger","t0","$","maxLength","t1","minLength","t2","undefined","t3","t4","query","validChars","TypeaheadTriggerRegex","RegExp","match","exec","maybeLeadingWhitespace","matchingString","length","leadOffset","index","replaceableString"],"sources":["../../../../src/lexical/plugins/SlashMenu/useMenuTriggerMatch.ts"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useCallback } from 'react'\n\nimport { PUNCTUATION } from './LexicalTypeaheadMenuPlugin/index.js'\n\nexport type TriggerFn = ({\n editor,\n query,\n}: {\n editor: LexicalEditor\n /** The query string is the POTENTIAL trigger AND the text after the trigger text. */\n query: string\n}) => MenuTextMatch | null\n\nexport type MenuTextMatch = {\n leadOffset: number\n matchingString: string\n replaceableString: string\n}\n\n/**\n * Returns a function which checks if the trigger (e.g. '/') is present in the query and, if so, returns the matching string (text after the trigger)\n */\nexport function useMenuTriggerMatch(\n /**\n * Text which triggers the menu. Everything after this text will be used as the query.\n */\n trigger: string,\n { maxLength = 75, minLength = 1 }: { maxLength?: number; minLength?: number },\n): TriggerFn {\n return useCallback(\n ({ query }) => {\n const validChars = '[^' + trigger + PUNCTUATION + '\\\\s]'\n const TypeaheadTriggerRegex = new RegExp(\n '(^|\\\\s|\\\\()(' +\n '[' +\n trigger +\n ']' +\n '((?:' +\n validChars +\n '){0,' +\n maxLength +\n '})' +\n ')$',\n )\n const match = TypeaheadTriggerRegex.exec(query)\n if (match !== null) {\n const maybeLeadingWhitespace = match[1]!\n\n /**\n * matchingString is only the text AFTER the trigger text. (So everything after the /)\n */\n const matchingString = match[3]!\n\n if (matchingString.length >= minLength) {\n return {\n leadOffset: match.index + maybeLeadingWhitespace.length,\n matchingString,\n replaceableString: match[2]!, // replaceableString is the trigger text + the matching string\n }\n }\n }\n return null\n },\n [maxLength, minLength, trigger],\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,WAAW,QAAQ;AAE5B,SAASC,WAAW,QAAQ;AAiB5B;;;AAGA,OAAO,SAAAC,oBAAAC,OAAA,EAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAKL;IAAAO,SAAA,EAAAC,EAAA;IAAAC,SAAA,EAAAC;EAAA,IAAAL,EAA6E;EAA3E,MAAAE,SAAA,GAAAC,EAAc,KAAdG,SAAc,GAAd,EAAc,GAAdH,EAAc;EAAE,MAAAC,SAAA,GAAAC,EAAa,KAAbC,SAAa,GAAb,CAAa,GAAbD,EAAa;EAAA,IAAAE,EAAA;EAAA,IAAAN,CAAA,QAAAC,SAAA,IAAAD,CAAA,QAAAG,SAAA,IAAAH,CAAA,QAAAF,OAAA;IAG7BQ,EAAA,GAAAC,EAAA;MAAC;QAAAC;MAAA,IAAAD,EAAS;MACR,MAAAE,UAAA,GAAmB,OAAOX,OAAA,GAAUF,WAAA,GAAc;MAClD,MAAAc,qBAAA,GAA8B,IAAIC,MAAA,CAChC,eACE,GACAb,OAAA,GACA,MACA,SACAW,UAAA,GACA,SACAR,SAAA,GACA,OACA;MAEJ,MAAAW,KAAA,GAAcF,qBAAA,CAAAG,IAA0B,CAACL,KAAA;MACzC,IAAII,KAAA,KAAU;QACZ,MAAAE,sBAAA,GAA+BF,KAAK,GAAG;QAKvC,MAAAG,cAAA,GAAuBH,KAAK,GAAG;QAE/B,IAAIG,cAAA,CAAAC,MAAqB,IAAIb,SAAA;UAAA,OACpB;YAAAc,UAAA,EACOL,KAAA,CAAAM,KAAW,GAAGJ,sBAAA,CAAAE,MAA6B;YAAAD,cAAA;YAAAI,iBAAA,EAEpCP,KAAK;UAC1B;QAAA;MACF;MACF,OACO;IAAA,CACT;IAAAZ,CAAA,MAAAC,SAAA;IAAAD,CAAA,MAAAG,SAAA;IAAAH,CAAA,MAAAF,OAAA;IAAAE,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAAA,OAjCKM,EAkC0B;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TEXT_TYPE_TO_FORMAT","TextNode","useEffect","TextPlugin","t0","$","features","editor","t1","enabledFormats","disabledFormats","getDisabledFormats","length","registerNodeTransform","textNode","forEach","disabledFormat","hasFormat","toggleFormat","t2","allFormats","Object","keys","enabledSet","Set","filter","format","has"],"sources":["../../../../src/lexical/plugins/TextPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { TextFormatType } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TEXT_TYPE_TO_FORMAT, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { SanitizedClientFeatures } from '../../../features/typesClient.js'\n\nexport function TextPlugin({ features }: { features: SanitizedClientFeatures }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n const disabledFormats = getDisabledFormats(features.enabledFormats)\n if (disabledFormats.length === 0) {\n return\n }\n // Ideally override the TextNode with our own TextNode (changing its setFormat or toggleFormat methods),\n // would be more performant. If we find a noticeable perf regression we can switch to that option.\n // Overriding the FORMAT_TEXT_COMMAND and PASTE_COMMAND commands is not an option I considered because\n // there might be other forms of mutation that we might not be considering. For example:\n // browser extensions or Payload/Lexical plugins that have their own commands.\n return editor.registerNodeTransform(TextNode, (textNode) => {\n disabledFormats.forEach((disabledFormat) => {\n if (textNode.hasFormat(disabledFormat)) {\n textNode.toggleFormat(disabledFormat)\n }\n })\n })\n }, [editor, features])\n\n return null\n}\n\nfunction getDisabledFormats(enabledFormats: TextFormatType[]): TextFormatType[] {\n const allFormats = Object.keys(TEXT_TYPE_TO_FORMAT) as TextFormatType[]\n const enabledSet = new Set(enabledFormats)\n\n return allFormats.filter((format) => !enabledSet.has(format))\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,mBAAmB,EAAEC,QAAQ,QAAQ;AAC9C,SAASC,SAAS,QAAQ;AAI1B,OAAO,SAAAC,WAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAoB;IAAAQ;EAAA,IAAAF,EAAmD;EAC5E,OAAAG,MAAA,IAAiBR,yBAAA;EAAA,IAAAS,EAAA;EAAA,IAAAH,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA,CAAAG,cAAA;IAEPD,EAAA,GAAAA,CAAA;MACR,MAAAE,eAAA,GAAwBC,kBAAA,CAAmBL,QAAA,CAAAG,cAAuB;MAAA,IAC9DC,eAAA,CAAAE,MAAA,MAA2B;QAAA;MAAA;MAAA,OAQxBL,MAAA,CAAAM,qBAAA,CAAAZ,QAAA,EAAAa,QAAA;QACLJ,eAAA,CAAAK,OAAA,CAAAC,cAAA;UAAA,IACMF,QAAA,CAAAG,SAAA,CAAmBD,cAAA;YACrBF,QAAA,CAAAI,YAAA,CAAsBF,cAAA;UAAA;QAAA,CAE1B;MAAA,CACF;IAAA;IACFX,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA,CAAAG,cAAA;IAAAJ,CAAA,MAAAG,EAAA;EAAA;IAAAA,EAAA,GAAAH,CAAA;EAAA;EAAA,IAAAc,EAAA;EAAA,IAAAd,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA;IAAGa,EAAA,IAACZ,MAAA,EAAQD,QAAA;IAASD,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA;IAAAD,CAAA,MAAAc,EAAA;EAAA;IAAAA,EAAA,GAAAd,CAAA;EAAA;EAjBrBH,SAAA,CAAUM,EAiBV,EAAGW,EAAkB;EAAA;AAAA;AAKvB,SAASR,mBAAmBF,cAAgC;EAC1D,MAAMW,UAAA,GAAaC,MAAA,CAAOC,IAAI,CAACtB,mBAAA;EAC/B,MAAMuB,UAAA,GAAa,IAAIC,GAAA,CAAIf,cAAA;EAE3B,OAAOW,UAAA,CAAWK,MAAM,CAAEC,MAAA,IAAW,CAACH,UAAA,CAAWI,GAAG,CAACD,MAAA;AACvD","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","TEXT_TYPE_TO_FORMAT","TextNode","useEffect","TextPlugin","t0","$","features","editor","t1","enabledFormats","disabledFormats","getDisabledFormats","length","registerNodeTransform","textNode","forEach","disabledFormat","hasFormat","toggleFormat","t2","allFormats","Object","keys","enabledSet","Set","filter","format","has"],"sources":["../../../../src/lexical/plugins/TextPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { TextFormatType } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TEXT_TYPE_TO_FORMAT, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { SanitizedClientFeatures } from '../../../features/typesClient.js'\n\nexport function TextPlugin({ features }: { features: SanitizedClientFeatures }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n const disabledFormats = getDisabledFormats(features.enabledFormats)\n if (disabledFormats.length === 0) {\n return\n }\n // Ideally override the TextNode with our own TextNode (changing its setFormat or toggleFormat methods),\n // would be more performant. If we find a noticeable perf regression we can switch to that option.\n // Overriding the FORMAT_TEXT_COMMAND and PASTE_COMMAND commands is not an option I considered because\n // there might be other forms of mutation that we might not be considering. For example:\n // browser extensions or Payload/Lexical plugins that have their own commands.\n return editor.registerNodeTransform(TextNode, (textNode) => {\n disabledFormats.forEach((disabledFormat) => {\n if (textNode.hasFormat(disabledFormat)) {\n textNode.toggleFormat(disabledFormat)\n }\n })\n })\n }, [editor, features])\n\n return null\n}\n\nfunction getDisabledFormats(enabledFormats: TextFormatType[]): TextFormatType[] {\n const allFormats = Object.keys(TEXT_TYPE_TO_FORMAT) as TextFormatType[]\n const enabledSet = new Set(enabledFormats)\n\n return allFormats.filter((format) => !enabledSet.has(format))\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,mBAAmB,EAAEC,QAAQ,QAAQ;AAC9C,SAASC,SAAS,QAAQ;AAI1B,OAAO,SAAAC,WAAAC,EAAA;EAAA,MAAAC,CAAA,GAAAP,EAAA;EAAoB;IAAAQ;EAAA,IAAAF,EAAmD;EAC5E,OAAAG,MAAA,IAAiBR,yBAAA;EAAA,IAAAS,EAAA;EAAA,IAAAH,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA,CAAAG,cAAA;IAEPD,EAAA,GAAAA,CAAA;MACR,MAAAE,eAAA,GAAwBC,kBAAA,CAAmBL,QAAA,CAAAG,cAAuB;MAClE,IAAIC,eAAA,CAAAE,MAAsB,KAAK;QAAA;MAAA;MAE/B,OAMOL,MAAA,CAAAM,qBAA4B,CAACZ,QAAA,EAAUa,QAAA;QAC5CJ,eAAA,CAAAK,OAAuB,CAACC,cAAA;UACtB,IAAIF,QAAA,CAAAG,SAAkB,CAACD,cAAA;YACrBF,QAAA,CAAAI,YAAqB,CAACF,cAAA;UAAA;QACxB,CACF;MAAA,CACF;IAAA,CACF;IAAAX,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA,CAAAG,cAAA;IAAAJ,CAAA,MAAAG,EAAA;EAAA;IAAAA,EAAA,GAAAH,CAAA;EAAA;EAAA,IAAAc,EAAA;EAAA,IAAAd,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,QAAA;IAAGa,EAAA,IAACZ,MAAA,EAAQD,QAAA,CAAS;IAAAD,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,QAAA;IAAAD,CAAA,MAAAc,EAAA;EAAA;IAAAA,EAAA,GAAAd,CAAA;EAAA;EAjBrBH,SAAA,CAAUM,EAiBV,EAAGW,EAAkB;EAAA,OAEd;AAAA;AAGT,SAASR,mBAAmBF,cAAgC;EAC1D,MAAMW,UAAA,GAAaC,MAAA,CAAOC,IAAI,CAACtB,mBAAA;EAC/B,MAAMuB,UAAA,GAAa,IAAIC,GAAA,CAAIf,cAAA;EAE3B,OAAOW,UAAA,CAAWK,MAAM,CAAEC,MAAA,IAAW,CAACH,UAAA,CAAWI,GAAG,CAACD,MAAA;AACvD","ignoreList":[]}