@payloadcms/richtext-lexical 3.73.0 → 3.74.0-internal.097fb57

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 (87) hide show
  1. package/dist/exports/client/Field-OX545XLB.js +2 -0
  2. package/dist/exports/client/Field-OX545XLB.js.map +7 -0
  3. package/dist/exports/client/bundled.css +1 -1
  4. package/dist/exports/client/chunk-3KBZSLPR.js +12 -0
  5. package/dist/exports/client/chunk-3KBZSLPR.js.map +7 -0
  6. package/dist/exports/client/index.d.ts +1 -0
  7. package/dist/exports/client/index.d.ts.map +1 -1
  8. package/dist/exports/client/index.js +20 -20
  9. package/dist/exports/client/index.js.map +3 -3
  10. package/dist/exports/client/internal-client.d.ts +3 -0
  11. package/dist/exports/client/internal-client.d.ts.map +1 -0
  12. package/dist/exports/react/index.d.ts +1 -1
  13. package/dist/exports/react/index.d.ts.map +1 -1
  14. package/dist/exports/react/index.js.map +1 -1
  15. package/dist/features/converters/lexicalToJSX/Component/index.d.ts +2 -14
  16. package/dist/features/converters/lexicalToJSX/Component/index.d.ts.map +1 -1
  17. package/dist/features/converters/lexicalToJSX/Component/index.js +4 -2
  18. package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
  19. package/dist/features/converters/lexicalToJSX/converter/index.d.ts +16 -1
  20. package/dist/features/converters/lexicalToJSX/converter/index.d.ts.map +1 -1
  21. package/dist/features/converters/lexicalToJSX/converter/index.js +76 -4
  22. package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
  23. package/dist/features/converters/lexicalToJSX/converter/types.d.ts +14 -10
  24. package/dist/features/converters/lexicalToJSX/converter/types.d.ts.map +1 -1
  25. package/dist/features/converters/lexicalToJSX/converter/types.js.map +1 -1
  26. package/dist/features/debug/jsxConverter/client/plugin/index.js +1 -1
  27. package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
  28. package/dist/field/Field.d.ts.map +1 -1
  29. package/dist/field/Field.js +11 -6
  30. package/dist/field/Field.js.map +1 -1
  31. package/dist/field/RichTextViewProvider.d.ts +83 -0
  32. package/dist/field/RichTextViewProvider.d.ts.map +1 -0
  33. package/dist/field/RichTextViewProvider.js +87 -0
  34. package/dist/field/RichTextViewProvider.js.map +1 -0
  35. package/dist/field/ViewSelector.d.ts +4 -0
  36. package/dist/field/ViewSelector.d.ts.map +1 -0
  37. package/dist/field/ViewSelector.js +89 -0
  38. package/dist/field/ViewSelector.js.map +1 -0
  39. package/dist/field/bundled.css +1 -1
  40. package/dist/field/index.d.ts +1 -0
  41. package/dist/field/index.d.ts.map +1 -1
  42. package/dist/field/index.js +47 -29
  43. package/dist/field/index.js.map +1 -1
  44. package/dist/field/rscEntry.d.ts +1 -1
  45. package/dist/field/rscEntry.d.ts.map +1 -1
  46. package/dist/field/rscEntry.js +12 -0
  47. package/dist/field/rscEntry.js.map +1 -1
  48. package/dist/index.d.ts +1 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +3 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/lexical/LexicalEditor.d.ts.map +1 -1
  53. package/dist/lexical/LexicalEditor.js +2 -1
  54. package/dist/lexical/LexicalEditor.js.map +1 -1
  55. package/dist/lexical/LexicalProvider.d.ts.map +1 -1
  56. package/dist/lexical/LexicalProvider.js +12 -3
  57. package/dist/lexical/LexicalProvider.js.map +1 -1
  58. package/dist/lexical/config/client/sanitize.d.ts +1 -1
  59. package/dist/lexical/config/client/sanitize.d.ts.map +1 -1
  60. package/dist/lexical/config/client/sanitize.js +3 -2
  61. package/dist/lexical/config/client/sanitize.js.map +1 -1
  62. package/dist/lexical/config/types.d.ts +4 -0
  63. package/dist/lexical/config/types.d.ts.map +1 -1
  64. package/dist/lexical/config/types.js.map +1 -1
  65. package/dist/lexical/nodes/index.d.ts +12 -2
  66. package/dist/lexical/nodes/index.d.ts.map +1 -1
  67. package/dist/lexical/nodes/index.js +195 -2
  68. package/dist/lexical/nodes/index.js.map +1 -1
  69. package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts +2 -0
  70. package/dist/lexical/plugins/NodeViewOverridePlugin/index.d.ts.map +1 -0
  71. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js +48 -0
  72. package/dist/lexical/plugins/NodeViewOverridePlugin/index.js.map +1 -0
  73. package/dist/types.d.ts +152 -2
  74. package/dist/types.d.ts.map +1 -1
  75. package/dist/types.js.map +1 -1
  76. package/dist/utilities/generateImportMap.d.ts.map +1 -1
  77. package/dist/utilities/generateImportMap.js +1 -0
  78. package/dist/utilities/generateImportMap.js.map +1 -1
  79. package/dist/validate/hasText.d.ts +6 -1
  80. package/dist/validate/hasText.d.ts.map +1 -1
  81. package/dist/validate/hasText.js +10 -4
  82. package/dist/validate/hasText.js.map +1 -1
  83. package/package.json +11 -6
  84. package/dist/exports/client/Field-HJGV32KA.js +0 -2
  85. package/dist/exports/client/Field-HJGV32KA.js.map +0 -7
  86. package/dist/exports/client/chunk-EZX4YW7S.js +0 -12
  87. package/dist/exports/client/chunk-EZX4YW7S.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/features/shared/slashMenu/basicGroup.ts", "../../../src/features/align/client/index.tsx", "../../../src/lexical/ui/icons/AlignCenter/index.tsx", "../../../src/lexical/ui/icons/AlignJustify/index.tsx", "../../../src/lexical/ui/icons/AlignLeft/index.tsx", "../../../src/lexical/ui/icons/AlignRight/index.tsx", "../../../src/utilities/createClientFeature.ts", "../../../src/features/align/client/toolbarAlignGroup.ts", "../../../src/features/blockquote/client/index.tsx", "../../../src/lexical/ui/icons/Blockquote/index.tsx", "../../../src/lexical/ui/icons/Text/index.tsx", "../../../src/features/shared/toolbar/textDropdownGroup.ts", "../../../src/features/blockquote/markdownTransformer.ts", "../../../src/features/blocks/client/index.tsx", "../../../src/lexical/ui/icons/Block/index.tsx", "../../../src/lexical/ui/icons/InlineBlocks/index.tsx", "../../../src/features/blocks/client/getBlockImageComponent.tsx", "../../../src/features/blocks/client/markdown/markdownTransformer.ts", "../../../src/utilities/jsx/extractPropsFromJSXPropsString.ts", "../../../src/utilities/jsx/jsx.ts", "../../../src/features/blocks/server/markdown/linesFromMatchToContentAndPropsString.ts", "../../../src/features/blocks/client/nodes/BlocksNode.tsx", "../../../src/features/blocks/server/nodes/BlocksNode.tsx", "../../../src/features/blocks/client/component/index.tsx", "../../../src/features/blocks/client/component/BlockContent.tsx", "../../../src/features/blocks/client/component/removeEmptyArrayValues.ts", "../../../src/features/blocks/client/markdown/getLexicalToMarkdown.ts", "../../../src/features/blocks/client/markdown/getMarkdownToLexical.ts", "../../../src/features/blocks/client/plugin/commands.ts", "../../../src/features/blocks/client/plugin/index.tsx", "../../../src/features/debug/testRecorder/client/plugin/index.tsx", "../../../src/lexical/utils/environment.ts", "../../../src/features/debug/testRecorder/client/index.tsx", "../../../src/features/debug/treeView/client/plugin/index.tsx", "../../../src/features/debug/treeView/client/index.tsx", "../../../src/features/format/bold/feature.client.tsx", "../../../src/lexical/ui/icons/Bold/index.tsx", "../../../src/features/format/shared/toolbarFormatGroup.ts", "../../../src/features/format/bold/markdownTransformers.ts", "../../../src/features/format/inlineCode/feature.client.tsx", "../../../src/lexical/ui/icons/Code/index.tsx", "../../../src/features/format/inlineCode/markdownTransformers.ts", "../../../src/features/format/italic/feature.client.tsx", "../../../src/lexical/ui/icons/Italic/index.tsx", "../../../src/features/format/italic/markdownTransformers.ts", "../../../src/features/format/strikethrough/feature.client.tsx", "../../../src/lexical/ui/icons/Strikethrough/index.tsx", "../../../src/features/format/strikethrough/markdownTransformers.ts", "../../../src/features/format/subscript/feature.client.tsx", "../../../src/lexical/ui/icons/Subscript/index.tsx", "../../../src/features/format/superscript/feature.client.tsx", "../../../src/lexical/ui/icons/Superscript/index.tsx", "../../../src/features/format/underline/feature.client.tsx", "../../../src/lexical/ui/icons/Underline/index.tsx", "../../../src/lexical/ui/icons/TextState/index.tsx", "../../../src/features/textState/textState.ts", "../../../src/features/textState/feature.client.tsx", "../../../src/features/heading/client/index.tsx", "../../../src/lexical/ui/icons/H1/index.tsx", "../../../src/lexical/ui/icons/H2/index.tsx", "../../../src/lexical/ui/icons/H3/index.tsx", "../../../src/lexical/ui/icons/H4/index.tsx", "../../../src/lexical/ui/icons/H5/index.tsx", "../../../src/lexical/ui/icons/H6/index.tsx", "../../../src/features/heading/markdownTransformer.ts", "../../../src/lexical/utils/markdown/createBlockNode.ts", "../../../src/features/horizontalRule/client/index.tsx", "../../../src/lexical/ui/icons/HorizontalRule/index.tsx", "../../../src/lexical/ui/icons/Add/index.tsx", "../../../src/features/shared/toolbar/addDropdownGroup.ts", "../../../src/features/horizontalRule/server/nodes/HorizontalRuleNode.tsx", "../../../src/features/horizontalRule/client/nodes/HorizontalRuleNode.tsx", "../../../src/features/horizontalRule/client/markdownTransformer.ts", "../../../src/features/horizontalRule/client/plugin/index.tsx", "../../../src/features/indent/client/index.tsx", "../../../src/lexical/ui/icons/IndentDecrease/index.tsx", "../../../src/lexical/ui/icons/IndentIncrease/index.tsx", "../../../src/features/indent/client/IndentPlugin.tsx", "../../../src/features/indent/client/toolbarIndentGroup.ts", "../../../src/features/link/client/index.tsx", "../../../src/lexical/ui/icons/Link/index.tsx", "../../../src/lexical/utils/getSelectedNode.ts", "../../../src/features/shared/toolbar/featureButtonsGroup.ts", "../../../src/features/link/markdownTransformer.ts", "../../../src/features/link/nodes/LinkNode.ts", "../../../src/features/link/nodes/AutoLinkNode.ts", "../../../src/features/link/client/plugins/autoLink/index.tsx", "../../../src/features/link/client/plugins/clickableLink/index.tsx", "../../../src/features/link/client/plugins/floatingLinkEditor/index.tsx", "../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx", "../../../src/lexical/utils/setFloatingElemPositionForLinkEditor.ts", "../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/commands.ts", "../../../src/features/link/client/plugins/link/index.tsx", "../../../src/lexical/utils/url.ts", "../../../src/features/lists/checklist/client/index.tsx", "../../../src/lexical/ui/icons/Checklist/index.tsx", "../../../src/features/lists/plugin/index.tsx", "../../../src/features/lists/shared/shouldRegisterListBaseNodes.ts", "../../../src/features/lists/shared/slashMenuListGroup.ts", "../../../src/features/lists/checklist/markdownTransformers.ts", "../../../src/features/lists/shared/markdown.ts", "../../../src/features/lists/checklist/client/plugin/index.tsx", "../../../src/features/lists/orderedList/client/index.tsx", "../../../src/lexical/ui/icons/OrderedList/index.tsx", "../../../src/features/lists/orderedList/markdownTransformer.ts", "../../../src/features/lists/unorderedList/client/index.tsx", "../../../src/lexical/ui/icons/UnorderedList/index.tsx", "../../../src/features/lists/unorderedList/markdownTransformer.ts", "../../../src/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.tsx", "../../../src/features/migrations/lexicalPluginToLexical/feature.client.tsx", "../../../src/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.tsx", "../../../src/features/migrations/slateToLexical/feature.client.tsx", "../../../src/features/paragraph/client/index.tsx", "../../../src/features/debug/jsxConverter/client/plugin/index.tsx", "../../../src/features/converters/lexicalToJSX/Component/index.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/blockquote.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/heading.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/horizontalRule.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/linebreak.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/link.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/list.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/paragraph.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/tab.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/table.tsx", "../../../src/features/converters/lexicalToJSX/converter/converters/text.tsx", "../../../src/lexical/utils/nodeFormat.ts", "../../../src/features/converters/lexicalToJSX/converter/converters/upload.tsx", "../../../src/features/converters/lexicalToJSX/converter/defaultConverters.ts", "../../../src/features/converters/lexicalToJSX/converter/index.tsx", "../../../src/validate/hasText.ts", "../../../src/features/debug/jsxConverter/client/index.tsx", "../../../src/features/textState/defaultColors.ts", "../../../src/features/relationship/client/index.tsx", "../../../src/lexical/ui/icons/Relationship/index.tsx", "../../../src/features/relationship/client/nodes/RelationshipNode.tsx", "../../../src/features/relationship/server/nodes/RelationshipNode.tsx", "../../../src/features/relationship/client/plugins/index.tsx", "../../../src/features/relationship/client/drawer/index.tsx", "../../../src/utilities/fieldsDrawer/useLexicalListDrawer.tsx", "../../../src/features/relationship/client/utils/useEnabledRelationships.tsx", "../../../src/features/toolbars/fixed/client/Toolbar/index.tsx", "../../../src/features/toolbars/shared/ToolbarButton/index.tsx", "../../../src/features/toolbars/shared/ToolbarDropdown/index.tsx", "../../../src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx", "../../../src/features/toolbars/fixed/client/index.tsx", "../../../src/features/toolbars/inline/client/Toolbar/index.tsx", "../../../src/lexical/utils/getDOMRangeRect.ts", "../../../src/lexical/utils/setFloatingElemPosition.ts", "../../../src/features/toolbars/inline/client/index.tsx", "../../../src/features/experimental_table/client/index.ts", "../../../src/lexical/ui/icons/Table/index.tsx", "../../../src/features/experimental_table/markdownTransformer.ts", "../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx", "../../../src/lexical/ui/icons/Meatballs/index.tsx", "../../../src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx", "../../../src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx", "../../../src/features/experimental_table/client/utils/useDebounce.ts", "../../../src/features/experimental_table/client/utils/debounce.ts", "../../../src/features/experimental_table/client/plugins/TablePlugin/index.tsx", "../../../src/features/upload/client/index.tsx", "../../../src/lexical/ui/icons/Upload/index.tsx", "../../../src/features/upload/client/nodes/UploadNode.tsx", "../../../src/features/upload/server/nodes/conversions.ts", "../../../src/features/upload/server/nodes/UploadNode.tsx", "../../../src/features/upload/client/component/pending/index.tsx", "../../../src/features/upload/client/plugin/index.tsx", "../../../src/features/upload/client/drawer/index.tsx", "../../../src/field/index.tsx", "../../../src/lexical/theme/EditorTheme.tsx", "../../../src/lexical/config/client/default.ts", "../../../src/lexical/config/client/loader.ts", "../../../src/lexical/config/client/sanitize.ts", "../../../src/lexical/utils/guard.ts", "../../../src/lexical/utils/joinClasses.ts", "../../../src/lexical/utils/swipe.ts", "../../../src/features/blocks/client/componentInline/components/InlineBlockEditButton.tsx", "../../../src/features/blocks/client/componentInline/components/InlineBlockRemoveButton.tsx", "../../../src/features/blocks/client/componentInline/components/InlineBlockLabel.tsx", "../../../src/features/blocks/client/componentInline/components/InlineBlockContainer.tsx", "../../../src/features/blocks/client/component/components/BlockCollapsible.tsx", "../../../src/features/blocks/client/component/components/BlockEditButton.tsx", "../../../src/features/blocks/client/component/components/BlockRemoveButton.tsx", "../../../src/features/converters/utilities/restPopulateFn.ts", "../../../src/features/blocks/premade/CodeBlock/converter.ts", "../../../src/features/blocks/premade/CodeBlock/Component/Code.tsx", "../../../src/features/blocks/premade/CodeBlock/Component/defaultLanguages.ts", "../../../src/features/blocks/premade/CodeBlock/Component/Block.tsx", "../../../src/lexical/ui/icons/CodeBlock/index.tsx", "../../../src/features/blocks/premade/CodeBlock/Component/Collapse/index.tsx", "../../../src/lexical/ui/icons/Collapse/index.tsx", "../../../src/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.tsx", "../../../src/field/RenderLexical/index.tsx", "../../../src/utilities/buildEditorState.ts"],
4
- "sourcesContent": ["import type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\n\nexport function slashMenuBasicGroupWithItems(items: SlashMenuItem[]): SlashMenuGroup {\n return {\n items,\n key: 'basic',\n label: ({ i18n }) => {\n return i18n.t('lexical:general:slashMenuBasicGroupLabel')\n },\n }\n}\n", "'use client'\n\nimport type { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode'\nimport type { ElementFormatType, ElementNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $isDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode'\nimport { $findMatchingParent } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isNodeSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n FORMAT_ELEMENT_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { AlignCenterIcon } from '../../../lexical/ui/icons/AlignCenter/index.js'\nimport { AlignJustifyIcon } from '../../../lexical/ui/icons/AlignJustify/index.js'\nimport { AlignLeftIcon } from '../../../lexical/ui/icons/AlignLeft/index.js'\nimport { AlignRightIcon } from '../../../lexical/ui/icons/AlignRight/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarAlignGroupWithItems } from './toolbarAlignGroup.js'\n\n// DecoratorBlockNode has format, but Lexical forgot\n// to add the getters like ElementNode does.\nconst getFormatType = (node: DecoratorBlockNode | ElementNode): ElementFormatType => {\n if ($isElementNode(node)) {\n return node.getFormatType()\n }\n return node.__format\n}\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarAlignGroupWithItems([\n {\n ChildComponent: AlignLeftIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'left') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'left') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignLeft',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignLeftLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left')\n },\n order: 1,\n },\n {\n ChildComponent: AlignCenterIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'center') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'center') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignCenter',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignCenterLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center')\n },\n order: 2,\n },\n {\n ChildComponent: AlignRightIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'right') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'right') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignRight',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignRightLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right')\n },\n order: 3,\n },\n {\n ChildComponent: AlignJustifyIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'justify') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'justify') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignJustify',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignJustifyLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify')\n },\n order: 4,\n },\n ]),\n]\n\nconst AlignPlugin = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n // Just like the default Lexical configuration, but in\n // addition to ElementNode we also set DecoratorBlocks\n return editor.registerCommand(\n FORMAT_ELEMENT_COMMAND,\n (format) => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) && !$isNodeSelection(selection)) {\n return false\n }\n const nodes = selection.getNodes()\n for (const node of nodes) {\n const element = $findMatchingParent(\n node,\n (parentNode): parentNode is DecoratorBlockNode | ElementNode =>\n ($isElementNode(parentNode) || $isDecoratorBlockNode(parentNode)) &&\n !parentNode.isInline(),\n )\n if (element !== null) {\n element.setFormat(format)\n }\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n )\n }, [editor])\n return null\n}\n\nexport const AlignFeatureClient = createClientFeature({\n plugins: [\n {\n Component: AlignPlugin,\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const AlignCenterIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 15H15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignJustifyIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignLeftIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignRightIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import type { ClientConfig, RichTextFieldClient } from 'payload'\n\nimport type {\n BaseClientFeatureProps,\n ClientFeature,\n ClientFeatureProviderMap,\n FeatureProviderClient,\n FeatureProviderProviderClient,\n ResolvedClientFeatureMap,\n} from '../features/typesClient.js'\nimport type { ClientEditorConfig } from '../lexical/config/types.js'\nimport type { FeatureClientSchemaMap } from '../types.js'\n\nexport type CreateClientFeatureArgs<UnSanitizedClientProps, ClientProps> =\n | ((props: {\n config: ClientConfig\n featureClientImportMap: Record<string, any>\n featureClientSchemaMap: FeatureClientSchemaMap\n /** unSanitizedEditorConfig.features, but mapped */\n featureProviderMap: ClientFeatureProviderMap\n field?: RichTextFieldClient\n props: BaseClientFeatureProps<UnSanitizedClientProps>\n // other resolved features, which have been loaded before this one. All features declared in 'dependencies' should be available here\n resolvedFeatures: ResolvedClientFeatureMap\n schemaPath: string\n // unSanitized EditorConfig,\n unSanitizedEditorConfig: ClientEditorConfig\n }) => ClientFeature<ClientProps>)\n | Omit<ClientFeature<ClientProps>, 'sanitizedClientFeatureProps'>\n\nexport const createClientFeature: <\n UnSanitizedClientProps = undefined,\n ClientProps = UnSanitizedClientProps,\n>(\n args: CreateClientFeatureArgs<UnSanitizedClientProps, ClientProps>,\n) => FeatureProviderProviderClient<UnSanitizedClientProps, ClientProps> = (feature) => {\n const featureProviderProvideClient: FeatureProviderProviderClient<any, any> = (props) => {\n const featureProviderClient: Partial<FeatureProviderClient<any, any>> = {\n clientFeatureProps: props,\n }\n\n if (typeof feature === 'function') {\n featureProviderClient.feature = ({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n }) => {\n const toReturn = feature({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n props,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n })\n\n if (toReturn.sanitizedClientFeatureProps === null) {\n toReturn.sanitizedClientFeatureProps = props\n }\n\n return toReturn\n }\n } else {\n // We have to spread feature here! Otherwise, if the arg of createClientFeature is not a function, and 2\n // richText editors have the same feature (even if both call it, e.g. both call UploadFeature()),\n // the second richText editor here will override sanitizedClientFeatureProps of the first feature, as both richText\n // editor features share the same reference to the feature object.\n // Example: richText editor 1 and 2 both have UploadFeature. richText editor 1 calls UploadFeature() with custom fields,\n // richText editor 2 calls UploadFeature() with NO custom fields. If we don't spread feature here, richText editor 1\n // will not have any custom fields, as richText editor 2 will override the feature object.\n const newFeature: ClientFeature<any> = { ...feature }\n newFeature.sanitizedClientFeatureProps = props\n featureProviderClient.feature = newFeature\n }\n return featureProviderClient as FeatureProviderClient<any, any>\n }\n\n return featureProviderProvideClient\n}\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { AlignLeftIcon } from '../../../lexical/ui/icons/AlignLeft/index.js'\n\nexport const toolbarAlignGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: AlignLeftIcon,\n items,\n key: 'align',\n order: 30,\n }\n}\n", "'use client'\n\nimport { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { BlockquoteIcon } from '../../../lexical/ui/icons/Blockquote/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: BlockquoteIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isQuoteNode(node) && !$isQuoteNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'blockquote',\n label: ({ i18n }) => {\n return i18n.t('lexical:blockquote:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n order: 20,\n },\n ]),\n]\n\nexport const BlockquoteFeatureClient = createClientFeature({\n markdownTransformers: [MarkdownTransformer],\n nodes: [QuoteNode],\n\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: BlockquoteIcon,\n key: 'blockquote',\n keywords: ['quote', 'blockquote'],\n label: ({ i18n }) => {\n return i18n.t('lexical:blockquote:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const BlockquoteIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5353 10.5725C13.5353 9.47709 11.0456 9.99991 11.0456 7.85883C11.0456 6.46464 12.1162 5.61816 13.361 5.61816C14.805 5.61816 16 6.86298 16 8.92937C16 11.2945 14.4564 13.7841 11.1203 14.3816L10.8216 13.1368C12.888 12.4895 13.5353 11.4937 13.5353 10.5725ZM6.71369 10.5725C6.71369 9.47709 4.22407 9.99991 4.22407 7.85883C4.22407 6.46464 5.29461 5.61816 6.53942 5.61816C7.9834 5.61816 9.17842 6.86298 9.17842 8.92937C9.17842 11.2945 7.63485 13.7841 4.29876 14.3816L4 13.1368C6.06639 12.4895 6.71369 11.4937 6.71369 10.5725Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const TextIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.708 14.5H7.79785V13.9414H8.01367C9.00391 13.9414 9.15625 13.9033 9.15625 13.6113V6.70508H8.07715C6.82031 6.70508 6.73145 7.08594 6.28711 8.67285H5.80469L5.91895 6.12109H13.5869L13.7012 8.67285H13.2188C12.7744 7.08594 12.6855 6.70508 11.4287 6.70508H10.3496V13.6113C10.3496 13.9033 10.502 13.9414 11.4922 13.9414H11.708V14.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { TextIcon } from '../../../lexical/ui/icons/Text/index.js'\n\nexport const toolbarTextDropdownGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: TextIcon,\n items,\n key: 'text',\n order: 25,\n }\n}\n", "import { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\n\nimport type { ElementTransformer } from '../../packages/@lexical/markdown/index.js'\n\nexport const MarkdownTransformer: ElementTransformer = {\n type: 'element',\n dependencies: [QuoteNode],\n export: (node, exportChildren) => {\n if (!$isQuoteNode(node)) {\n return null\n }\n\n const lines = exportChildren(node).split('\\n')\n const output: string[] = []\n for (const line of lines) {\n output.push('> ' + line)\n }\n return output.join('\\n')\n },\n regExp: /^>\\s/,\n replace: (parentNode, children, _match, isImport) => {\n if (isImport) {\n const previousNode = parentNode.getPreviousSibling()\n if ($isQuoteNode(previousNode)) {\n previousNode.splice(previousNode.getChildrenSize(), 0, [...children])\n previousNode.select(0, 0)\n parentNode.remove()\n return\n }\n }\n\n const node = $createQuoteNode()\n node.append(...children)\n parentNode.replace(node)\n node.select(0, 0)\n },\n}\n", "'use client'\n\nimport type { I18nClient } from '@payloadcms/translations'\nimport type { BlocksFieldClient, ClientBlock } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\nimport { InlineBlocksIcon } from '../../../lexical/ui/icons/InlineBlocks/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { getBlockImageComponent } from './getBlockImageComponent.js'\nimport { getBlockMarkdownTransformers } from './markdown/markdownTransformer.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { InlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './plugin/commands.js'\nimport { BlocksPlugin } from './plugin/index.js'\nexport const BlocksFeatureClient = createClientFeature(\n ({ config, featureClientSchemaMap, props, schemaPath }) => {\n const schemaMapRenderedBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks`\n const schemaMapRenderedInlineBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks`\n const clientSchema = featureClientSchemaMap['blocks']\n\n if (!clientSchema) {\n return {}\n }\n\n const blocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const inlineBlocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedInlineBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedInlineBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const clientBlocks: ClientBlock[] = blocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n const clientInlineBlocks: ClientBlock[] = inlineBlocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n return {\n markdownTransformers: getBlockMarkdownTransformers({\n blocks: clientBlocks,\n inlineBlocks: clientInlineBlocks,\n }),\n nodes: [BlockNode, InlineBlockNode],\n plugins: [\n {\n Component: BlocksPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: [\n clientBlocks?.length\n ? {\n items: clientBlocks.map((block) => {\n return {\n Icon: getBlockImageComponent(block.imageURL, block.imageAltText),\n key: 'block-' + block.slug,\n keywords: ['block', 'blocks', block.slug],\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'blocks',\n label: ({ i18n }: { i18n: I18nClient<object, 'lexical:blocks:label'> }) => {\n return i18n.t('lexical:blocks:label')\n },\n }\n : null,\n clientInlineBlocks?.length\n ? {\n items: clientInlineBlocks.map((inlineBlock) => {\n return {\n Icon: InlineBlocksIcon,\n key: 'inlineBlocks-' + inlineBlock.slug,\n keywords: ['inlineBlock', 'inline block', inlineBlock.slug],\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'inlineBlocks',\n label: ({\n i18n,\n }: {\n i18n: I18nClient<object, 'lexical:blocks:inlineBlocks:label'>\n }) => {\n return i18n.t('lexical:blocks:inlineBlocks:label')\n },\n }\n : null,\n ].filter(Boolean) as SlashMenuGroup[],\n },\n toolbarFixed: {\n groups: [\n clientBlocks.length\n ? {\n type: 'dropdown',\n ChildComponent: BlockIcon,\n items: clientBlocks.map((block, index) => {\n return {\n ChildComponent: getBlockImageComponent(block.imageURL, block.imageAltText),\n isActive: undefined, // At this point, we would be inside a sub-richtext-editor. And at this point this will be run against the focused sub-editor, not the parent editor which has the actual block. Thus, no point in running this\n key: 'block-' + block.slug,\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'blocks',\n order: 20,\n }\n : null,\n clientInlineBlocks?.length\n ? {\n type: 'dropdown',\n ChildComponent: InlineBlocksIcon,\n items: clientInlineBlocks.map((inlineBlock, index) => {\n return {\n ChildComponent: inlineBlock.imageURL\n ? getBlockImageComponent(inlineBlock.imageURL, inlineBlock.imageAltText)\n : InlineBlocksIcon,\n isActive: undefined,\n key: 'inlineBlock-' + inlineBlock.slug,\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'inlineBlocks',\n order: 25,\n }\n : null,\n ].filter(Boolean) as ToolbarGroup[],\n },\n }\n },\n)\n", "'use client'\nimport React from 'react'\n\nexport const BlockIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"8\" y=\"5\" />\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"5\" y=\"11\" />\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"11\" y=\"11\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const InlineBlocksIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M5.33333 6.5C5.11232 6.5 4.90036 6.5878 4.74408 6.74408C4.5878 6.90036 4.5 7.11232 4.5 7.33333V12.1667C4.5 12.3877 4.5878 12.5996 4.74408 12.7559C4.90036 12.9122 5.11232 13 5.33333 13H14.6667C14.8877 13 15.0996 12.9122 15.2559 12.7559C15.4122 12.5996 15.5 12.3877 15.5 12.1667V11.6667C15.5 11.3905 15.7239 11.1667 16 11.1667C16.2761 11.1667 16.5 11.3905 16.5 11.6667V12.1667C16.5 12.6529 16.3068 13.1192 15.963 13.463C15.6192 13.8068 15.1529 14 14.6667 14H5.33333C4.8471 14 4.38079 13.8068 4.03697 13.463C3.69315 13.1192 3.5 12.6529 3.5 12.1667V7.33333C3.5 6.8471 3.69315 6.38079 4.03697 6.03697C4.38079 5.69315 4.8471 5.5 5.33333 5.5H10.3333C10.6095 5.5 10.8333 5.72386 10.8333 6C10.8333 6.27614 10.6095 6.5 10.3333 6.5H5.33333ZM13 6.5C12.7239 6.5 12.5 6.27614 12.5 6C12.5 5.72386 12.7239 5.5 13 5.5H16C16.2761 5.5 16.5 5.72386 16.5 6V9C16.5 9.27614 16.2761 9.5 16 9.5C15.7239 9.5 15.5 9.27614 15.5 9V7.20711L13.3536 9.35355C13.1583 9.54882 12.8417 9.54882 12.6464 9.35355C12.4512 9.15829 12.4512 8.84171 12.6464 8.64645L14.7929 6.5H13ZM6.16699 8.33325C6.16699 8.05711 6.39085 7.83325 6.66699 7.83325H11.0003C11.2765 7.83325 11.5003 8.05711 11.5003 8.33325C11.5003 8.60939 11.2765 8.83325 11.0003 8.83325H6.66699C6.39085 8.83325 6.16699 8.60939 6.16699 8.33325ZM6.16699 10.9999C6.16699 10.7238 6.39085 10.4999 6.66699 10.4999H13.3337C13.6098 10.4999 13.8337 10.7238 13.8337 10.9999C13.8337 11.2761 13.6098 11.4999 13.3337 11.4999H6.66699C6.39085 11.4999 6.16699 11.2761 6.16699 10.9999Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\n\nexport function getBlockImageComponent(imageURL?: string, imageAltText?: string) {\n if (!imageURL) {\n return BlockIcon\n }\n\n return () => (\n <img\n alt={imageAltText ?? 'Block Image'}\n className=\"lexical-block-custom-image\"\n src={imageURL}\n style={{ maxHeight: 20, maxWidth: 20 }}\n />\n )\n}\n", "import type { ClientBlock } from 'payload'\n\nimport {\n $parseSerializedNode,\n type ElementNode,\n type Klass,\n type LexicalNode,\n type LexicalNodeReplacement,\n type SerializedLexicalNode,\n} from 'lexical'\n\nimport type { Transformer } from '../../../../packages/@lexical/markdown/index.js'\nimport type {\n MultilineElementTransformer,\n TextMatchTransformer,\n} from '../../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { extractPropsFromJSXPropsString } from '../../../../utilities/jsx/extractPropsFromJSXPropsString.js'\nimport { propsToJSXString } from '../../../../utilities/jsx/jsx.js'\nimport { linesFromStartToContentAndPropsString } from '../../server/markdown/linesFromMatchToContentAndPropsString.js'\nimport { $createBlockNode, $isBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport {\n $createInlineBlockNode,\n $isInlineBlockNode,\n InlineBlockNode,\n} from '../nodes/InlineBlocksNode.js'\nimport { getLexicalToMarkdown } from './getLexicalToMarkdown.js'\nimport { getMarkdownToLexical } from './getMarkdownToLexical.js'\n\nfunction createTagRegexes(tagName: string) {\n const escapedTagName = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return {\n regExpEnd: new RegExp(`</(${escapedTagName})\\\\s*>|<${escapedTagName}[^>]*?/>`, 'i'),\n regExpStart: new RegExp(`<(${escapedTagName})([^>]*?)\\\\s*(/?)>`, 'i'),\n }\n}\nexport const getBlockMarkdownTransformers = ({\n blocks,\n inlineBlocks,\n}: {\n blocks: ClientBlock[]\n inlineBlocks: ClientBlock[]\n}): ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n}) => MultilineElementTransformer | TextMatchTransformer)[] => {\n if (!blocks?.length && !inlineBlocks?.length) {\n return []\n }\n let transformers: ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer)[] = []\n\n if (blocks?.length) {\n for (const block of blocks) {\n const transformer = getMarkdownTransformerForBlock(block, false)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n if (inlineBlocks?.length) {\n for (const block of inlineBlocks) {\n const transformer = getMarkdownTransformerForBlock(block, true)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n return transformers\n}\n\nfunction getMarkdownTransformerForBlock(\n block: ClientBlock,\n isInlineBlock: boolean,\n): Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n> | null {\n if (!block.jsx) {\n return null\n }\n const regex = createTagRegexes(block.slug)\n const toReturn: Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n > = []\n\n if (isInlineBlock) {\n toReturn.push(({ allNodes, allTransformers }) => ({\n type: 'text-match',\n dependencies: [InlineBlockNode],\n export: (node) => {\n if (!$isInlineBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>${exportResult.children}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n getEndIndex: (node, match) => {\n const { endlineLastCharIndex } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: match,\n trimChildren: false,\n })\n\n return endlineLastCharIndex\n },\n importRegExp: block.jsx?.customStartRegex ?? regex.regExpStart,\n regExp: /___ignoreignoreignore___/g,\n replace(node, match) {\n const { content, propsString } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: {\n ...match,\n index: 0,\n },\n trimChildren: false,\n })\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: match,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return\n }\n\n const inlineBlockNode = $createInlineBlockNode({\n blockType: block.slug,\n ...(blockFields as any),\n })\n\n node.replace(inlineBlockNode)\n },\n }))\n\n return toReturn\n }\n\n toReturn.push(({ allNodes, allTransformers }) => ({\n dependencies: [BlockNode],\n export: (node) => {\n if (!$isBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n const children = exportResult.children\n let sanitizedChildren = ''\n\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (children.includes('\\n')) {\n for (const child of children.split('\\n')) {\n let sanitizedChild = ''\n if (!block?.jsx?.doNotTrimChildren && child !== '') {\n sanitizedChild = ' '\n }\n sanitizedChild += child + '\\n'\n\n sanitizedChildren += sanitizedChild\n }\n } else {\n sanitizedChildren = (block?.jsx?.doNotTrimChildren ? '' : ' ') + children + '\\n'\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>\\n${sanitizedChildren}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n handleImportAfterStartMatch: block.jsx?.customEndRegex\n ? undefined\n : ({ lines, rootNode, startLineIndex, startMatch, transformer }) => {\n const regexpEndRegex: RegExp | undefined =\n typeof transformer.regExpEnd === 'object' && 'regExp' in transformer.regExpEnd\n ? transformer.regExpEnd.regExp\n : transformer.regExpEnd\n\n const isEndOptional =\n transformer.regExpEnd &&\n typeof transformer.regExpEnd === 'object' &&\n 'optional' in transformer.regExpEnd\n ? transformer.regExpEnd.optional\n : !transformer.regExpEnd\n\n const {\n afterEndLine,\n beforeStartLine,\n content: unsanitizedContent,\n endLineIndex,\n propsString,\n } = linesFromStartToContentAndPropsString({\n isEndOptional,\n lines,\n regexpEndRegex,\n startLineIndex,\n startMatch,\n trimChildren: false,\n })\n\n let content = ''\n\n if (block?.jsx?.doNotTrimChildren) {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n } else {\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (unsanitizedContent.includes('\\n')) {\n const split = unsanitizedContent.split('\\n')\n let index = 0\n for (const child of split) {\n index++\n\n if (child.startsWith(' ')) {\n content += child.slice(2)\n } else {\n // If one child is misaligned, skip aligning completely, unless it's just empty\n if (child === '') {\n content += child\n } else {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n break\n }\n }\n\n content += index === split.length ? '' : '\\n'\n }\n } else {\n content =\n (!unsanitizedContent.startsWith(' ')\n ? unsanitizedContent\n : unsanitizedContent.slice(2)) + '\\n'\n }\n }\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return [false, startLineIndex]\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: startMatch,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return [false, startLineIndex]\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n // Now handle beforeStartLine and afterEndLine. If those are not empty, we need to add them as text nodes before and after the block node.\n // However, those themselves can contain other markdown matches, so we need to parse them as well.\n // Example where this is needed: \"Hello <InlineCode>inline code</InlineCode> test.\"\n let prevNodes: null | SerializedLexicalNode[] = null\n let nextNodes: null | SerializedLexicalNode[] = null\n // TODO: Might not need this prevNodes and nextNodes handling if inline nodes are handled by textmatch transformers\n\n if (beforeStartLine?.length) {\n prevNodes = markdownToLexical({ markdown: beforeStartLine })?.root?.children ?? []\n\n const firstPrevNode = prevNodes?.[0]\n if (firstPrevNode) {\n rootNode.append($parseSerializedNode(firstPrevNode))\n }\n }\n\n rootNode.append(node)\n\n if (afterEndLine?.length) {\n nextNodes = markdownToLexical({ markdown: afterEndLine })?.root?.children\n const lastChild = rootNode.getChildren()[rootNode.getChildren().length - 1]\n\n const children = ($parseSerializedNode(nextNodes[0]!) as ElementNode)?.getChildren()\n if (children?.length) {\n for (const child of children) {\n ;(lastChild as ElementNode).append(child)\n }\n }\n }\n }\n\n return [true, endLineIndex]\n },\n regExpEnd: block.jsx?.customEndRegex ?? regex.regExpEnd,\n regExpStart: block.jsx?.customStartRegex ?? regex.regExpStart,\n // This replace is ONLY run for ``` code blocks (so any blocks with custom start and end regexes). For others, we use the special JSX handling above:\n type: 'multiline-element',\n replace: (rootNode, children, openMatch, closeMatch, linesInBetween) => {\n if (block?.jsx?.import) {\n if (!linesInBetween) {\n // convert children to linesInBetween\n let line = ''\n if (children) {\n for (const child of children) {\n line += child.getTextContent()\n }\n }\n\n linesInBetween = [line]\n }\n\n let childrenString = ''\n if (block?.jsx?.doNotTrimChildren) {\n childrenString = linesInBetween.join('\\n')\n } else {\n childrenString = linesInBetween.join('\\n').trim()\n }\n\n const propsString = openMatch[1]?.trim()\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: childrenString,\n closeMatch: closeMatch as RegExpMatchArray,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: openMatch as RegExpMatchArray,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return false\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n rootNode.append(node)\n }\n\n return\n }\n return false // Run next transformer\n },\n }))\n\n return toReturn\n}\n", "import { JSOX } from 'jsox'\n\n/**\n * Turns a JSX props string into an object.\n *\n * @example\n *\n * Input: type=\"info\" hello={{heyyy: 'test', someNumber: 2}}\n * Output: { type: 'info', hello: { heyyy: 'test', someNumber: 2 } }\n */\nexport function extractPropsFromJSXPropsString({\n propsString,\n}: {\n propsString: string\n}): Record<string, any> {\n const props: Record<string, any> = {}\n let key = ''\n let collectingKey = true\n\n for (let i = 0; i < propsString.length; i++) {\n const char = propsString[i]\n\n if (collectingKey) {\n if (char === '=' || char === ' ') {\n if (key) {\n if (char === ' ') {\n props[key] = true\n key = ''\n } else {\n collectingKey = false\n }\n }\n } else {\n key += char\n }\n } else {\n const result = handleValue(propsString, i)\n props[key] = result.value\n i = result.newIndex\n key = ''\n collectingKey = true\n }\n }\n\n if (key) {\n props[key] = true\n }\n\n return props\n}\n\nfunction handleValue(propsString: string, startIndex: number): { newIndex: number; value: any } {\n const char = propsString[startIndex]\n\n if (char === '\"') {\n return handleQuotedString(propsString, startIndex)\n } else if (char === \"'\") {\n return handleQuotedString(propsString, startIndex, true)\n } else if (char === '{') {\n return handleObject(propsString, startIndex)\n } else if (char === '[') {\n return handleArray(propsString, startIndex)\n } else {\n return handleUnquotedString(propsString, startIndex)\n }\n}\n\nfunction handleArray(propsString: string, startIndex: number): { newIndex: number; value: any } {\n let bracketCount = 1\n let value = ''\n let i = startIndex + 1\n\n while (i < propsString.length && bracketCount > 0) {\n if (propsString[i] === '[') {\n bracketCount++\n } else if (propsString[i] === ']') {\n bracketCount--\n }\n if (bracketCount > 0) {\n value += propsString[i]\n }\n i++\n }\n\n return { newIndex: i, value: JSOX.parse(`[${value}]`) }\n}\n\nfunction handleQuotedString(\n propsString: string,\n startIndex: number,\n isSingleQuoted = false,\n): { newIndex: number; value: string } {\n let value = ''\n let i = startIndex + 1\n while (\n i < propsString.length &&\n (propsString[i] !== (isSingleQuoted ? \"'\" : '\"') || propsString[i - 1] === '\\\\')\n ) {\n value += propsString[i]\n i++\n }\n return { newIndex: i, value }\n}\n\nfunction handleObject(propsString: string, startIndex: number): { newIndex: number; value: any } {\n let bracketCount = 1\n let value = ''\n let i = startIndex + 1\n\n while (i < propsString.length && bracketCount > 0) {\n if (propsString[i] === '{') {\n bracketCount++\n } else if (propsString[i] === '}') {\n bracketCount--\n }\n if (bracketCount > 0) {\n value += propsString[i]\n }\n i++\n }\n\n return { newIndex: i, value: parseObject(value) }\n}\n\nfunction parseObject(objString: string): Record<string, any> {\n if (objString[0] !== '{') {\n return JSOX.parse(objString)\n }\n\n const result = JSOX.parse(objString.replace(/(\\w+):/g, '\"$1\":'))\n\n return result\n}\n\nfunction handleUnquotedString(\n propsString: string,\n startIndex: number,\n): { newIndex: number; value: string } {\n let value = ''\n let i = startIndex\n while (i < propsString.length && propsString[i] !== ' ') {\n value += propsString[i]\n i++\n }\n return { newIndex: i - 1, value }\n}\n", "/**\n * Converts an object of props to a JSX props string.\n *\n * This function is the inverse of `extractPropsFromJSXPropsString`.\n */\nexport function propsToJSXString({ props }: { props: Record<string, any> }): string {\n const propsArray: string[] = []\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string') {\n // Handle simple string props\n propsArray.push(`${key}=\"${escapeQuotes(value)}\"`)\n } else if (typeof value === 'number') {\n // Handle number and boolean props\n propsArray.push(`${key}={${value}}`)\n } else if (typeof value === 'boolean') {\n if (value) {\n propsArray.push(`${key}`)\n }\n } else if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n // Handle array props\n propsArray.push(`${key}={[${value.map((v) => JSON.stringify(v, replacer)).join(', ')}]}`)\n } else {\n // Handle complex object props\n propsArray.push(`${key}={${JSON.stringify(value, replacer)}}`)\n }\n }\n }\n\n return propsArray.join(' ')\n}\n\n// Helper function to escape quotes in string values\nfunction escapeQuotes(str: string): string {\n return str.replace(/\"/g, '&quot;')\n}\n\n// Custom replacer function for JSON.stringify to handle single quotes\nfunction replacer(key: string, value: any): any {\n if (typeof value === 'string') {\n return value.replace(/'/g, \"\\\\'\")\n }\n return value\n}\n\n/**\n * Converts a frontmatter string to an object.\n */\nexport function frontmatterToObject(frontmatter: string): Record<string, any> {\n const lines = frontmatter.trim().split('\\n')\n const result = {}\n let inFrontmatter = false\n\n for (const line of lines) {\n if (line.trim() === '---') {\n inFrontmatter = !inFrontmatter\n continue\n }\n\n if (inFrontmatter) {\n const [key, ...valueParts] = line.split(':')\n const value = valueParts.join(':').trim()\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n result[key.trim()] = value\n }\n }\n\n return result\n}\n\n/**\n * Converts an object to a frontmatter string.\n */\nexport function objectToFrontmatter(obj: Record<string, any>): null | string {\n if (!Object.entries(obj)?.length) {\n return null\n }\n let frontmatter = '---\\n'\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n frontmatter += `${key}: ${value.join(', ')}\\n`\n } else {\n frontmatter += `${key}: ${value}\\n`\n }\n }\n\n frontmatter += '---\\n'\n return frontmatter\n}\n\n/**\n * Takes an MDX content string and extracts the frontmatter and content.\n *\n * The resulting object contains the mdx content without the frontmatter and the frontmatter itself.\n */\nexport function extractFrontmatter(mdxContent: string) {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const frontmatterRegex = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/\n const match = mdxContent.match(frontmatterRegex)\n\n if (match) {\n const frontmatter = match[0]\n const contentWithoutFrontmatter = mdxContent.slice(frontmatter.length).trim()\n return {\n content: contentWithoutFrontmatter,\n frontmatter: frontmatter.trim(),\n }\n } else {\n // If no frontmatter is found, return the original content\n return {\n content: mdxContent.trim(),\n frontmatter: '',\n }\n }\n}\n", "export function linesFromStartToContentAndPropsString({\n isEndOptional,\n lines,\n regexpEndRegex,\n startLineIndex,\n startMatch,\n trimChildren,\n}: {\n isEndOptional?: boolean\n lines: string[]\n regexpEndRegex?: RegExp\n startLineIndex: number\n startMatch: RegExpMatchArray\n trimChildren?: boolean\n}): {\n /**\n * The matched string after the end match, in the same line as the end match. Useful for inline matches.\n */\n afterEndLine: string\n /**\n * The matched string before the start match, in the same line as the start match. Useful for inline matches.\n */\n beforeStartLine: string\n content: string\n endLineIndex: number\n endlineLastCharIndex: number\n propsString: string\n} {\n let propsString = ''\n let content = ''\n const linesCopy = lines.slice(startLineIndex)\n\n let isWithinContent = false // If false => is within prop\n let contentSubTagStartAmount = 0\n\n let bracketCount = 0\n let quoteChar: null | string = null\n let isSelfClosing = false\n let isWithinCodeBlockAmount = 0\n\n const beforeStartLine = linesCopy[0]!.slice(0, startMatch.index)\n let endlineLastCharIndex = 0\n\n let endLineIndex = startLineIndex\n\n mainLoop: for (const [lineIndex, lineCopy] of linesCopy.entries()) {\n const line = trimChildren ? lineCopy.trim() : lineCopy\n let amountOfBeginningSpacesRemoved = 0\n if (trimChildren) {\n for (let i = 0; i < lineCopy.length; i++) {\n if (lineCopy[i] === ' ') {\n amountOfBeginningSpacesRemoved++\n } else {\n break\n }\n }\n }\n\n let charIndex = 0\n\n if (lineIndex === 0) {\n charIndex = (startMatch.index ?? 0) + startMatch[0].length - amountOfBeginningSpacesRemoved // We need to also loop over the \">\" in something like \"<InlineCode>\" in order to later set isWithinContent to true\n }\n\n while (charIndex < line.length) {\n const char = line[charIndex]\n const nextChar = line[charIndex + 1]\n\n if (!isWithinContent) {\n if (char === '{' && !quoteChar) {\n bracketCount++\n } else if (char === '}' && !quoteChar) {\n bracketCount--\n } else if ((char === '\"' || char === \"'\") && !quoteChar) {\n quoteChar = char\n } else if (char === quoteChar) {\n quoteChar = null\n }\n\n if (char === '/' && nextChar === '>' && bracketCount === 0 && !quoteChar) {\n isSelfClosing = true\n endLineIndex = lineIndex\n endlineLastCharIndex = charIndex + 2\n\n break mainLoop\n } else if (char === '>' && bracketCount === 0 && !quoteChar) {\n isWithinContent = true\n charIndex++\n continue\n }\n\n propsString += char\n } else {\n if (char === '`') {\n isWithinCodeBlockAmount++\n }\n\n if (isWithinCodeBlockAmount % 2 === 0) {\n if (char === '<' && nextChar === '/') {\n contentSubTagStartAmount--\n\n if (contentSubTagStartAmount < 0) {\n if (content[content.length - 1] === '\\n') {\n content = content.slice(0, -1) // Remove the last newline\n }\n endLineIndex = lineIndex\n // Calculate endlineLastCharIndex by finding \">\" in line\n for (let i = charIndex; i < line.length; i++) {\n if (line[i] === '>') {\n endlineLastCharIndex = i + 1\n\n break\n }\n }\n break mainLoop\n }\n } else if (char === '/' && nextChar === '>') {\n contentSubTagStartAmount--\n\n if (contentSubTagStartAmount < 0) {\n if (content[content.length - 1] === '\\n') {\n content = content.slice(0, -1) // Remove the last newline\n }\n endLineIndex = lineIndex\n endlineLastCharIndex = charIndex + 2\n break mainLoop\n }\n } else if (char === '<' && nextChar !== '/') {\n contentSubTagStartAmount++\n }\n }\n\n content += char\n }\n\n charIndex++\n }\n\n if (isWithinContent) {\n if (content?.length > 0 && lineIndex > 0) {\n content += '\\n'\n }\n } else {\n propsString += '\\n'\n }\n\n if (regexpEndRegex && contentSubTagStartAmount < 0) {\n // If 0 and in same line where it got lowered to 0 then this is not the match we are looking for\n const match = line.match(regexpEndRegex)\n if (match?.index !== undefined) {\n endLineIndex = lineIndex\n endlineLastCharIndex = match.index + match[0].length - 1\n break\n }\n }\n\n if (lineIndex === linesCopy.length - 1 && !isEndOptional && !isSelfClosing) {\n throw new Error(\n 'End match not found for lines ' +\n lines.join('\\n') +\n '\\n\\n. Start match: ' +\n JSON.stringify(startMatch),\n )\n }\n }\n\n const afterEndLine = linesCopy[endLineIndex]!.trim().slice(endlineLastCharIndex)\n\n return {\n afterEndLine,\n beforeStartLine,\n content,\n endLineIndex: startLineIndex + endLineIndex,\n endlineLastCharIndex,\n propsString,\n }\n}\n", "'use client'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n type EditorConfig,\n type LexicalEditor,\n type LexicalNode,\n} from 'lexical'\nimport React, { type JSX } from 'react'\n\nimport type { BlockFieldsOptionalID, SerializedBlockNode } from '../../server/nodes/BlocksNode.js'\n\nimport { ServerBlockNode } from '../../server/nodes/BlocksNode.js'\nimport { BlockComponent } from '../component/index.js'\n\nexport class BlockNode extends ServerBlockNode {\n static override clone(node: ServerBlockNode): ServerBlockNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importJSON(serializedNode: SerializedBlockNode): BlockNode {\n if (serializedNode.version === 1) {\n // Convert (version 1 had the fields wrapped in another, unnecessary data property)\n serializedNode = {\n ...serializedNode,\n fields: {\n ...(serializedNode as any).fields.data,\n },\n version: 2,\n }\n }\n const node = $createBlockNode(serializedNode.fields)\n node.setFormat(serializedNode.format)\n return node\n }\n\n override decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return (\n <BlockComponent\n cacheBuster={this.getCacheBuster()}\n className={config.theme.block ?? 'LexicalEditorTheme__block'}\n formData={this.getFields()}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedBlockNode {\n return super.exportJSON()\n }\n}\n\nexport function $createBlockNode(fields: BlockFieldsOptionalID): BlockNode {\n return $applyNodeReplacement(\n new BlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isBlockNode(node: BlockNode | LexicalNode | null | undefined): node is BlockNode {\n return node instanceof BlockNode\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { JsonObject } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\ntype BaseBlockFields<TBlockFields extends JsonObject = JsonObject> = {\n /** Block form data */\n blockName: string\n blockType: string\n} & TBlockFields\n\nexport type BlockFields<TBlockFields extends JsonObject = JsonObject> = {\n id: string\n} & BaseBlockFields<TBlockFields>\n\nexport type BlockFieldsOptionalID<TBlockFields extends JsonObject = JsonObject> = {\n id?: string\n} & BaseBlockFields<TBlockFields>\n\nexport type SerializedBlockNode<TBlockFields extends JsonObject = JsonObject> = {\n fields: BlockFields<TBlockFields>\n} & StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'block'>\n\nexport class ServerBlockNode extends DecoratorBlockNode {\n __cacheBuster: number\n __fields: BlockFields\n\n constructor({\n cacheBuster,\n fields,\n format,\n key,\n }: {\n cacheBuster?: number\n fields: BlockFields\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__fields = fields\n this.__cacheBuster = cacheBuster || 0\n }\n\n static override clone(node: ServerBlockNode): ServerBlockNode {\n return new this({\n cacheBuster: node.__cacheBuster,\n fields: node.__fields,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'block'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {}\n }\n\n static override importJSON(serializedNode: SerializedBlockNode): ServerBlockNode {\n if (serializedNode.version === 1) {\n // Convert (version 1 had the fields wrapped in another, unnecessary data property)\n serializedNode = {\n ...serializedNode,\n fields: {\n ...(serializedNode as any).fields.data,\n },\n version: 2,\n }\n }\n const node = $createServerBlockNode(serializedNode.fields)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.block)\n return element\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedBlockNode {\n return {\n ...super.exportJSON(),\n type: 'block',\n fields: this.getFields(),\n version: 2,\n }\n }\n\n getCacheBuster(): number {\n return this.getLatest().__cacheBuster\n }\n\n getFields(): BlockFields {\n return this.getLatest().__fields\n }\n\n override getTextContent(): string {\n return `Block Field`\n }\n\n setFields(fields: BlockFields, preventFormStateUpdate?: boolean): void {\n const writable = this.getWritable()\n writable.__fields = fields\n if (!preventFormStateUpdate) {\n writable.__cacheBuster++\n }\n }\n}\n\nexport function $createServerBlockNode(fields: BlockFieldsOptionalID): ServerBlockNode {\n return $applyNodeReplacement(\n new ServerBlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isServerBlockNode(\n node: LexicalNode | null | ServerBlockNode | undefined,\n): node is ServerBlockNode {\n return node instanceof ServerBlockNode\n}\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Button,\n Collapsible,\n Drawer,\n EditDepthProvider,\n ErrorPill,\n Form,\n formatDrawerSlug,\n FormSubmit,\n Pill,\n RenderFields,\n SectionTitle,\n useConfig,\n useDocumentForm,\n useDocumentInfo,\n useEditDepth,\n useFormSubmitted,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/shared'\nimport { $getNodeByKey } from 'lexical'\nimport {\n type BlocksFieldClient,\n type ClientBlock,\n type CollapsedPreferences,\n type FormState,\n} from 'payload'\nimport { deepCopyObjectSimpleWithoutReactComponents, reduceFieldsToValues } from 'payload/shared'\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { v4 as uuid } from 'uuid'\n\nimport type { BlockFields } from '../../server/nodes/BlocksNode.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { useLexicalDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isBlockNode } from '../nodes/BlocksNode.js'\nimport { type BlockCollapsibleWithErrorProps, BlockContent } from './BlockContent.js'\nimport { removeEmptyArrayValues } from './removeEmptyArrayValues.js'\n\ntype Props = {\n /**\n * Can be modified by the node in order to trigger the re-fetch of the initial state based on the\n * formData. This is useful when node.setFields() is explicitly called from outside of the form - in\n * this case, the new field state is likely not reflected in the form state, so we need to re-fetch\n */\n readonly cacheBuster: number\n readonly className: string\n readonly formData: BlockFields\n readonly nodeKey: string\n}\n\nexport const BlockComponent: React.FC<Props> = (props) => {\n const { cacheBuster, className: baseClass, formData, nodeKey } = props\n const submitted = useFormSubmitted()\n const { id, collectionSlug, globalSlug } = useDocumentInfo()\n const {\n fieldProps: {\n featureClientSchemaMap,\n field: parentLexicalRichTextField,\n initialLexicalFormState,\n schemaPath,\n },\n uuid: uuidFromContext,\n } = useEditorConfigContext()\n\n const { fields: parentDocumentFields } = useDocumentForm()\n const onChangeAbortControllerRef = useRef(new AbortController())\n const editDepth = useEditDepth()\n const [errorCount, setErrorCount] = React.useState(0)\n\n const { config } = useConfig()\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-blocks-create-${uuidFromContext}-${formData.id}`,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n // Used for saving collapsed to preferences (and gettin' it from there again)\n // Remember, these preferences are scoped to the whole document, not just this form. This\n // is important to consider for the data path used in setDocFieldPreferences\n const { getDocPreferences, setDocFieldPreferences } = useDocumentInfo()\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const blockType = formData.blockType\n\n const { getFormState } = useServerFunctions()\n const schemaFieldsPath = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockType}.fields`\n\n const [initialState, setInitialState] = React.useState<false | FormState | undefined>(() => {\n // Initial form state that was calculated server-side. May have stale values\n const cachedFormState = initialLexicalFormState?.[formData.id]?.formState\n if (!cachedFormState) {\n return false\n }\n\n // Merge current formData values into the cached form state\n // This ensures that when the component remounts (e.g., due to view changes), we don't lose user edits\n const mergedState = Object.fromEntries(\n Object.entries(cachedFormState).map(([fieldName, fieldState]) => [\n fieldName,\n fieldName in formData\n ? {\n ...fieldState,\n initialValue: formData[fieldName],\n value: formData[fieldName],\n }\n : fieldState,\n ]),\n )\n\n // Manually add blockName, as it's not part of cachedFormState\n mergedState.blockName = {\n initialValue: formData.blockName,\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n }\n\n return mergedState\n })\n\n const hasMounted = useRef(false)\n const prevCacheBuster = useRef(cacheBuster)\n useEffect(() => {\n if (hasMounted.current) {\n if (prevCacheBuster.current !== cacheBuster) {\n setInitialState(false)\n }\n prevCacheBuster.current = cacheBuster\n } else {\n hasMounted.current = true\n }\n }, [cacheBuster])\n\n const [CustomLabel, setCustomLabel] = React.useState<React.ReactNode | undefined>(\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n initialState?.['_components']?.customComponents?.BlockLabel ?? undefined,\n )\n\n const [CustomBlock, setCustomBlock] = React.useState<React.ReactNode | undefined>(\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n initialState?.['_components']?.customComponents?.Block ?? undefined,\n )\n\n // Initial state for newly created blocks\n useEffect(() => {\n const abortController = new AbortController()\n\n const awaitInitialState = async () => {\n /*\n * This will only run if a new block is created. For all existing blocks that are loaded when the document is loaded, or when the form is saved,\n * this is not run, as the lexical field RSC will fetch the state server-side and pass it to the client. That way, we avoid unnecessary client-side\n * requests. Though for newly created blocks, we need to fetch the state client-side, as the server doesn't know about the block yet.\n */\n const { state } = await getFormState({\n id,\n collectionSlug,\n data: formData,\n docPermissions: { fields: true },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n globalSlug,\n initialBlockData: formData,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: true,\n schemaPath: schemaFieldsPath,\n signal: abortController.signal,\n })\n\n if (state) {\n state.blockName = {\n initialValue: formData.blockName,\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n }\n\n const newFormStateData: BlockFields = reduceFieldsToValues(\n deepCopyObjectSimpleWithoutReactComponents(state, { excludeFiles: true }),\n true,\n ) as BlockFields\n\n // Things like default values may come back from the server => update the node with the new data\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n const newData = newFormStateData\n newData.blockType = blockType\n\n node.setFields(newData, true)\n }\n })\n\n setInitialState(state)\n setCustomLabel(state._components?.customComponents?.BlockLabel ?? undefined)\n setCustomBlock(state._components?.customComponents?.Block ?? undefined)\n }\n }\n\n if (formData && !initialState) {\n void awaitInitialState()\n }\n\n return () => {\n abortAndIgnore(abortController)\n }\n }, [\n getFormState,\n schemaFieldsPath,\n isEditable,\n id,\n formData,\n editor,\n nodeKey,\n initialState,\n collectionSlug,\n globalSlug,\n getDocPreferences,\n parentDocumentFields,\n blockType,\n ])\n\n const [isCollapsed, setIsCollapsed] = React.useState<boolean>(\n initialLexicalFormState?.[formData.id]?.collapsed ?? false,\n )\n\n const componentMapRenderedBlockPath = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockType}`\n\n const clientSchemaMap = featureClientSchemaMap['blocks']\n\n const blocksField: BlocksFieldClient | undefined = clientSchemaMap?.[\n componentMapRenderedBlockPath\n ]?.[0] as BlocksFieldClient\n\n const clientBlock: ClientBlock | undefined = blocksField.blockReferences\n ? typeof blocksField?.blockReferences?.[0] === 'string'\n ? config.blocksMap[blocksField?.blockReferences?.[0]]\n : blocksField?.blockReferences?.[0]\n : blocksField?.blocks?.[0]\n\n const { i18n, t } = useTranslation<object, string>()\n\n const onChange = useCallback(\n async ({ formState: prevFormState, submit }: { formState: FormState; submit?: boolean }) => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n\n const controller = new AbortController()\n onChangeAbortControllerRef.current = controller\n\n const { state: newFormState } = await getFormState({\n id,\n collectionSlug,\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n formState: prevFormState,\n globalSlug,\n initialBlockFormState: prevFormState,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: submit ? true : false,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!newFormState) {\n return prevFormState\n }\n\n if (prevFormState.blockName) {\n newFormState.blockName = prevFormState.blockName\n }\n\n const newFormStateData: BlockFields = reduceFieldsToValues(\n removeEmptyArrayValues({\n fields: deepCopyObjectSimpleWithoutReactComponents(newFormState, { excludeFiles: true }),\n }),\n true,\n ) as BlockFields\n\n setTimeout(() => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n const newData = newFormStateData\n newData.blockType = blockType\n node.setFields(newData, true)\n }\n })\n }, 0)\n\n if (submit) {\n setCustomLabel(newFormState._components?.customComponents?.BlockLabel ?? undefined)\n setCustomBlock(newFormState._components?.customComponents?.Block ?? undefined)\n\n let rowErrorCount = 0\n for (const formField of Object.values(newFormState)) {\n if (formField?.valid === false) {\n rowErrorCount++\n }\n }\n setErrorCount(rowErrorCount)\n }\n\n return newFormState\n },\n\n [\n getFormState,\n id,\n collectionSlug,\n getDocPreferences,\n globalSlug,\n schemaFieldsPath,\n blockType,\n parentDocumentFields,\n isEditable,\n editor,\n nodeKey,\n ],\n )\n\n useEffect(() => {\n return () => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n }\n }, [])\n\n const removeBlock = useCallback(() => {\n editor.update(() => {\n $getNodeByKey(nodeKey)?.remove()\n })\n }, [editor, nodeKey])\n\n const blockDisplayName = clientBlock?.labels?.singular\n ? getTranslation(clientBlock.labels.singular, i18n)\n : clientBlock?.slug\n\n const onCollapsedChange = useCallback(\n (changedCollapsed: boolean) => {\n void getDocPreferences().then((currentDocPreferences) => {\n const currentFieldPreferences =\n currentDocPreferences?.fields?.[parentLexicalRichTextField.name]\n\n const collapsedArray = currentFieldPreferences?.collapsed\n\n const newCollapsed: CollapsedPreferences =\n collapsedArray && collapsedArray?.length ? collapsedArray : []\n\n if (changedCollapsed) {\n if (!newCollapsed.includes(formData.id)) {\n newCollapsed.push(formData.id)\n }\n } else {\n if (newCollapsed.includes(formData.id)) {\n newCollapsed.splice(newCollapsed.indexOf(formData.id), 1)\n }\n }\n\n setDocFieldPreferences(parentLexicalRichTextField.name, {\n collapsed: newCollapsed,\n hello: 'hi',\n })\n })\n },\n [getDocPreferences, parentLexicalRichTextField.name, setDocFieldPreferences, formData.id],\n )\n\n const EditButton = useMemo(\n () => () => (\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__editButton`}\n disabled={!isEditable}\n el=\"button\"\n icon=\"edit\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n toggleDrawer()\n return false\n }}\n onMouseDown={(e) => {\n // Needed to preserve lexical selection for toggleDrawer lexical selection restore.\n // I believe this is needed due to this button (usually) being inside of a collapsible.\n e.preventDefault()\n }}\n round\n size=\"small\"\n tooltip={t('lexical:blocks:inlineBlocks:edit', { label: blockDisplayName })}\n />\n ),\n [baseClass, isEditable, t, blockDisplayName, toggleDrawer],\n )\n\n const RemoveButton = useMemo(\n () => () => (\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__removeButton`}\n disabled={!isEditable}\n icon=\"x\"\n onClick={(e) => {\n e.preventDefault()\n removeBlock()\n }}\n round\n tooltip=\"Remove Block\"\n />\n ),\n [baseClass, isEditable, removeBlock],\n )\n\n const BlockCollapsible = useMemo(\n () =>\n ({\n Actions,\n children,\n className,\n collapsibleProps,\n disableBlockName,\n editButton,\n errorCount,\n fieldHasErrors,\n Label,\n Pill: CustomPill,\n removeButton,\n }: BlockCollapsibleWithErrorProps) => {\n return (\n <div className={`${baseClass}__container ${baseClass}-${blockType}`}>\n <Collapsible\n className={[\n `${baseClass}__row`,\n fieldHasErrors ? `${baseClass}__row--has-errors` : `${baseClass}__row--no-errors`,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n collapsibleStyle={fieldHasErrors ? 'error' : 'default'}\n header={\n <div className={`${baseClass}__block-header`}>\n {typeof Label !== 'undefined' ? (\n Label\n ) : typeof CustomLabel !== 'undefined' ? (\n CustomLabel\n ) : (\n <div className={`${baseClass}__block-label`}>\n {typeof CustomPill !== 'undefined' ? (\n CustomPill\n ) : (\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${blockType}`}\n pillStyle=\"white\"\n size=\"small\"\n >\n {blockDisplayName ?? blockType}\n </Pill>\n )}\n {!disableBlockName && !clientBlock?.admin?.disableBlockName && (\n <SectionTitle path=\"blockName\" readOnly={!isEditable} />\n )}\n\n {fieldHasErrors && (\n <ErrorPill count={errorCount ?? 0} i18n={i18n} withMessage />\n )}\n </div>\n )}\n\n <div className={`${baseClass}__block-actions`}>\n {typeof Actions !== 'undefined' ? (\n Actions\n ) : (\n <>\n {(CustomBlock && editButton !== false) || (!CustomBlock && editButton) ? (\n <EditButton />\n ) : null}\n {removeButton !== false && isEditable ? <RemoveButton /> : null}\n </>\n )}\n </div>\n </div>\n }\n isCollapsed={isCollapsed}\n key={0}\n onToggle={(incomingCollapsedState) => {\n onCollapsedChange(incomingCollapsedState)\n setIsCollapsed(incomingCollapsedState)\n }}\n {...(collapsibleProps || {})}\n >\n {children}\n </Collapsible>\n </div>\n )\n },\n [\n CustomBlock,\n CustomLabel,\n EditButton,\n RemoveButton,\n blockDisplayName,\n baseClass,\n clientBlock?.admin?.disableBlockName,\n blockType,\n i18n,\n isCollapsed,\n onCollapsedChange,\n isEditable,\n ],\n )\n\n const blockID = formData?.id\n\n const BlockDrawer = useMemo(\n () => () => (\n <EditDepthProvider>\n <Drawer\n className={''}\n slug={drawerSlug}\n title={t(`lexical:blocks:inlineBlocks:${blockID ? 'edit' : 'create'}`, {\n label: blockDisplayName ?? t('lexical:blocks:inlineBlocks:label'),\n })}\n >\n {initialState ? (\n <>\n <RenderFields\n fields={clientBlock?.fields ?? []}\n forceRender\n parentIndexPath=\"\"\n parentPath=\"\" // See Blocks feature path for details as for why this is empty\n parentSchemaPath={schemaFieldsPath}\n permissions={true}\n readOnly={!isEditable}\n />\n <FormSubmit programmaticSubmit={true}>{t('fields:saveChanges')}</FormSubmit>\n </>\n ) : null}\n </Drawer>\n </EditDepthProvider>\n ),\n [\n initialState,\n drawerSlug,\n blockID,\n blockDisplayName,\n t,\n isEditable,\n clientBlock?.fields,\n schemaFieldsPath,\n // DO NOT ADD FORMDATA HERE! Adding formData will kick you out of sub block editors while writing.\n ],\n )\n\n // Memoized Form JSX\n const Block = useMemo(() => {\n if (!initialState) {\n return null\n }\n return (\n <Form\n beforeSubmit={[\n async ({ formState }) => {\n // This is only called when form is submitted from drawer - usually only the case if the block has a custom Block component\n return await onChange({ formState, submit: true })\n },\n ]}\n el=\"div\"\n fields={clientBlock?.fields ?? []}\n initialState={initialState}\n onChange={[onChange]}\n onSubmit={(formState, newData) => {\n // This is only called when form is submitted from drawer - usually only the case if the block has a custom Block component\n newData.blockType = blockType\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n node.setFields(newData as BlockFields, true)\n }\n })\n toggleDrawer()\n }}\n submitted={submitted}\n uuid={uuid()}\n >\n <BlockContent\n baseClass={baseClass}\n BlockDrawer={BlockDrawer}\n Collapsible={BlockCollapsible}\n CustomBlock={CustomBlock}\n EditButton={EditButton}\n errorCount={errorCount}\n formSchema={clientBlock?.fields ?? []}\n initialState={initialState}\n nodeKey={nodeKey}\n RemoveButton={RemoveButton}\n />\n </Form>\n )\n }, [\n BlockCollapsible,\n BlockDrawer,\n CustomBlock,\n blockType,\n RemoveButton,\n EditButton,\n baseClass,\n editor,\n errorCount,\n toggleDrawer,\n clientBlock?.fields,\n // DO NOT ADD FORMDATA HERE! Adding formData will kick you out of sub block editors while writing.\n initialState,\n nodeKey,\n onChange,\n submitted,\n ])\n\n if (!clientBlock) {\n return (\n <BlockCollapsible disableBlockName={true} fieldHasErrors={true}>\n <div className={`${baseClass}-not-found`}>\n Error: Block '{blockType}' not found in the config but exists in the lexical data\n </div>\n </BlockCollapsible>\n )\n }\n\n return Block\n}\n", "'use client'\nimport type { CollapsibleProps } from '@payloadcms/ui/elements/Collapsible'\nimport type { ClientField, FormState } from 'payload'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { RenderFields, useFormSubmitted } from '@payloadcms/ui'\nimport React, { createContext, useMemo } from 'react'\n\nexport type BlockCollapsibleProps = {\n /**\n * Replace the top-right portion of the header that renders the Edit and Remove buttons with custom content.\n * If this property is provided, the `removeButton` and `editButton` properties are ignored.\n */\n Actions?: React.ReactNode\n children?: React.ReactNode\n /**\n * Additional className to the collapsible wrapper\n */\n className?: string\n /**\n * Props to pass to the underlying Collapsible component. You could use this to override the `Header` entirely, for example.\n */\n collapsibleProps?: Partial<CollapsibleProps>\n /**\n * Whether to disable rendering the block name field in the header Label\n * @default false\n */\n disableBlockName?: boolean\n /**\n * Whether to show the Edit button\n * If `Actions` is provided, this property is ignored.\n * @default true\n */\n editButton?: boolean\n /**\n * Replace the default Label component with a custom Label\n */\n Label?: React.ReactNode\n /**\n * Replace the default Pill component component that's rendered within the default Label component with a custom Pill.\n * This property has no effect if you provide a custom Label component via the `Label` property.\n */\n Pill?: React.ReactNode\n /**\n * Whether to show the Remove button\n * If `Actions` is provided, this property is ignored.\n * @default true\n */\n removeButton?: boolean\n}\n\nexport type BlockCollapsibleWithErrorProps = {\n errorCount?: number\n fieldHasErrors?: boolean\n} & BlockCollapsibleProps\n\nexport type BlockContentProps = {\n baseClass: string\n BlockDrawer: React.FC\n Collapsible: React.FC<BlockCollapsibleWithErrorProps>\n CustomBlock: React.ReactNode\n EditButton: React.FC\n errorCount: number\n formSchema: ClientField[]\n initialState: false | FormState | undefined\n\n nodeKey: string\n RemoveButton: React.FC\n}\n\ntype BlockComponentContextType = {\n BlockCollapsible: React.FC<BlockCollapsibleProps>\n} & Omit<BlockContentProps, 'Collapsible'>\n\nconst BlockComponentContext = createContext<BlockComponentContextType>({\n baseClass: 'LexicalEditorTheme__block',\n BlockCollapsible: () => null,\n BlockDrawer: () => null,\n CustomBlock: null,\n EditButton: () => null,\n errorCount: 0,\n formSchema: [],\n initialState: false,\n nodeKey: '',\n RemoveButton: () => null,\n})\n\nexport const useBlockComponentContext = () => React.use(BlockComponentContext)\n\n/**\n * The actual content of the Block. This should be INSIDE a Form component,\n * scoped to the block. All format operations in here are thus scoped to the block's form, and\n * not the whole document.\n */\nexport const BlockContent: React.FC<BlockContentProps> = (props) => {\n const { Collapsible, ...contextProps } = props\n\n const { BlockDrawer, CustomBlock, errorCount, formSchema } = contextProps\n\n const hasSubmitted = useFormSubmitted()\n\n const fieldHasErrors = hasSubmitted && errorCount > 0\n const isEditable = useLexicalEditable()\n\n const CollapsibleWithErrorProps = useMemo(\n () => (props: BlockCollapsibleProps) => {\n const { children, ...rest } = props\n return (\n <Collapsible errorCount={errorCount} fieldHasErrors={fieldHasErrors} {...rest}>\n {children}\n </Collapsible>\n )\n },\n [Collapsible, fieldHasErrors, errorCount],\n )\n\n return CustomBlock ? (\n <BlockComponentContext\n value={{\n ...contextProps,\n BlockCollapsible: CollapsibleWithErrorProps,\n }}\n >\n {CustomBlock}\n <BlockDrawer />\n </BlockComponentContext>\n ) : (\n <CollapsibleWithErrorProps>\n <RenderFields\n fields={formSchema}\n forceRender={true}\n parentIndexPath=\"\"\n parentPath={''}\n parentSchemaPath=\"\"\n permissions={true}\n readOnly={!isEditable}\n />\n </CollapsibleWithErrorProps>\n )\n}\n", "'use client'\nimport type { FormState } from 'payload'\n\n/**\n * By default, if an array field is empty, it will be included in the form state with a value of 0.\n * We do not need this behavior here, By setting `disableFormData` to true, we can prevent the field from being included in the form state\n * like that.\n * @param fields form state\n */\nexport function removeEmptyArrayValues({ fields }: { fields: FormState }): FormState {\n for (const key in fields) {\n const field = fields[key]\n if (Array.isArray(field?.rows) && 'value' in field) {\n field.disableFormData = true\n }\n }\n return fields\n}\n", "import type { Klass, LexicalNode, LexicalNodeReplacement } from 'lexical'\n\nimport { createHeadlessEditor } from '@lexical/headless'\n\nimport {\n $convertToMarkdownString,\n type Transformer,\n} from '../../../../packages/@lexical/markdown/index.js'\n\nexport function getLexicalToMarkdown(\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>,\n allTransformers: Transformer[],\n): (args: { editorState: Record<string, any> }) => string {\n const lexicalToMarkdown = ({ editorState }: { editorState: Record<string, any> }): string => {\n const headlessEditor = createHeadlessEditor({\n nodes: allNodes,\n })\n\n try {\n headlessEditor.setEditorState(headlessEditor.parseEditorState(editorState as any)) // This should commit the editor state immediately\n } catch (e) {\n console.error('getLexicalToMarkdown: ERROR parsing editor state', e)\n }\n\n let markdown: string = ''\n headlessEditor.getEditorState().read(() => {\n markdown = $convertToMarkdownString(allTransformers)\n })\n\n return markdown\n }\n return lexicalToMarkdown\n}\n", "import type { Klass, LexicalNode, LexicalNodeReplacement, SerializedEditorState } from 'lexical'\n\nimport { createHeadlessEditor } from '@lexical/headless'\n\nimport {\n $convertFromMarkdownString,\n type Transformer,\n} from '../../../../packages/@lexical/markdown/index.js'\n\nexport function getMarkdownToLexical(\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>,\n allTransformers: Transformer[],\n): (args: { markdown: string }) => SerializedEditorState {\n const markdownToLexical = ({ markdown }: { markdown: string }): SerializedEditorState => {\n const headlessEditor = createHeadlessEditor({\n nodes: allNodes,\n })\n\n headlessEditor.update(\n () => {\n $convertFromMarkdownString(markdown, allTransformers)\n },\n { discrete: true },\n )\n\n const editorJSON = headlessEditor.getEditorState().toJSON()\n\n return editorJSON\n }\n return markdownToLexical\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { InsertBlockPayload } from './index.js'\n\nexport const INSERT_BLOCK_COMMAND: LexicalCommand<InsertBlockPayload> =\n createCommand('INSERT_BLOCK_COMMAND')\n\nexport const INSERT_INLINE_BLOCK_COMMAND: LexicalCommand<Partial<InsertBlockPayload>> =\n createCommand('INSERT_INLINE_BLOCK_COMMAND')\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot, $wrapNodeInElement, mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getNodeByKey,\n $getPreviousSelection,\n $getSelection,\n $insertNodes,\n $isParagraphNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n COMMAND_PRIORITY_EDITOR,\n} from 'lexical'\nimport { useEffect, useState } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { BlockFields, BlockFieldsOptionalID } from '../../server/nodes/BlocksNode.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useLexicalDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $createBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport { $createInlineBlockNode, $isInlineBlockNode } from '../nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './commands.js'\n\nexport type InsertBlockPayload = BlockFieldsOptionalID\n\nexport const BlocksPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n\n const [targetNodeKey, setTargetNodeKey] = useState<null | string>(null)\n\n const { setCreatedInlineBlock, uuid } = useEditorConfigContext()\n const editDepth = useEditDepth()\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-inlineBlocks-create-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([BlockNode])) {\n throw new Error('BlocksPlugin: BlocksNode not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand<InsertBlockPayload>(\n INSERT_BLOCK_COMMAND,\n (payload: InsertBlockPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const blockNode = $createBlockNode(payload)\n\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert blocks node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(blockNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n INSERT_INLINE_BLOCK_COMMAND,\n (fields) => {\n if (targetNodeKey) {\n const node = $getNodeByKey(targetNodeKey)\n\n if (!node || !$isInlineBlockNode(node)) {\n return false\n }\n\n node.setFields(fields as BlockFields)\n\n setTargetNodeKey(null)\n return true\n }\n\n const inlineBlockNode = $createInlineBlockNode(fields as BlockFields)\n setCreatedInlineBlock?.(inlineBlockNode)\n $insertNodes([inlineBlockNode])\n if ($isRootOrShadowRoot(inlineBlockNode.getParentOrThrow())) {\n $wrapNodeInElement(inlineBlockNode, $createParagraphNode).selectEnd()\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [editor, setCreatedInlineBlock, targetNodeKey, toggleDrawer])\n\n return null\n}\n", "'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot, getDOMSelection } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { IS_APPLE } from '../../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.key.toLowerCase() === 'a' && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path: number[] = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'Backspace',\n 'Delete',\n 'Enter',\n 'Escape',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = getDOMSelection(editor._window)\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = getDOMSelection(editor._window)\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = getDOMSelection(editor._window)\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n", "'use client'\nimport { CAN_USE_DOM } from './canUseDOM.js'\n\ndeclare global {\n interface Document {\n documentMode?: unknown\n }\n\n interface Window {\n MSStream?: unknown\n }\n}\n\nconst documentMode = CAN_USE_DOM && 'documentMode' in document ? document.documentMode : null\n\nexport const IS_APPLE: boolean = CAN_USE_DOM && /Mac|iPod|iPhone|iPad/.test(navigator.platform)\n\nexport const IS_FIREFOX: boolean =\n CAN_USE_DOM && /^(?!.*Seamonkey)(?=.*Firefox).*/i.test(navigator.userAgent)\n\nexport const CAN_USE_BEFORE_INPUT: boolean =\n CAN_USE_DOM && 'InputEvent' in window && !documentMode\n ? 'getTargetRanges' in new window.InputEvent('input')\n : false\n\nexport const IS_SAFARI: boolean = CAN_USE_DOM && /Version\\/[\\d.].*Safari/.test(navigator.userAgent)\n\nexport const IS_IOS: boolean =\n CAN_USE_DOM && /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream\n\nexport const IS_ANDROID: boolean = CAN_USE_DOM && /Android/.test(navigator.userAgent)\n\nexport const IS_WINDOWS: boolean = CAN_USE_DOM && /Win/.test(navigator.platform)\nexport const IS_CHROME: boolean = CAN_USE_DOM && /^(?=.*Chrome).*/i.test(navigator.userAgent)\n// export const canUseTextInputEvent: boolean = CAN_USE_DOM && 'TextEvent' in window && !documentMode;\n\nexport const IS_APPLE_WEBKIT =\n CAN_USE_DOM && /AppleWebKit\\/[\\d.]+/.test(navigator.userAgent) && !IS_CHROME\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { TestRecorderPlugin } from './plugin/index.js'\n\nexport const TestRecorderFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TestRecorderPlugin,\n position: 'bottom',\n },\n ],\n})\n", "'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TreeView } from '@lexical/react/LexicalTreeView.js'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\n\nexport const TreeViewPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n return (\n <TreeView\n editor={editor}\n timeTravelButtonClassName=\"debug-timetravel-button\"\n timeTravelPanelButtonClassName=\"debug-timetravel-panel-button\"\n timeTravelPanelClassName=\"debug-timetravel-panel\"\n timeTravelPanelSliderClassName=\"debug-timetravel-panel-slider\"\n treeTypeButtonClassName=\"debug-treetype-button\"\n viewClassName=\"tree-view-output\"\n />\n )\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { TreeViewPlugin } from './plugin/index.js'\n\nexport const TreeViewFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TreeViewPlugin,\n position: 'bottom',\n },\n ],\n})\n", "'use client'\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { BoldIcon } from '../../../lexical/ui/icons/Bold/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport {\n BOLD_ITALIC_STAR,\n BOLD_ITALIC_UNDERSCORE,\n BOLD_STAR,\n BOLD_UNDERSCORE,\n} from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: BoldIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('bold')\n }\n return false\n },\n key: 'bold',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\n },\n order: 1,\n },\n ]),\n]\n\nexport const BoldFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const markdownTransformers = [BOLD_STAR, BOLD_UNDERSCORE]\n if (featureProviderMap.get('italic')) {\n markdownTransformers.push(BOLD_ITALIC_UNDERSCORE, BOLD_ITALIC_STAR)\n }\n\n return {\n enableFormats: ['bold'],\n markdownTransformers,\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const BoldIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.6772 15H6.27017V5.718H10.4172C12.6792 5.718 13.8492 6.602 13.8492 8.292C13.8492 9.098 13.1992 9.982 12.4712 10.216C13.3812 10.476 14.1742 11.256 14.1742 12.322C14.1742 14.09 12.9002 15 10.6772 15ZM8.46717 9.501H10.3262C11.3012 9.501 11.7042 9.046 11.7042 8.409C11.7042 7.72 11.2362 7.317 10.3392 7.317H8.46717V9.501ZM8.46717 11.061V13.401H10.4822C11.4702 13.401 11.9642 12.959 11.9642 12.218C11.9642 11.49 11.4702 11.061 10.4822 11.061H8.46717Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarFormatGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'format',\n order: 40,\n }\n}\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const BOLD_ITALIC_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold', 'italic'],\n tag: '***',\n}\n\nexport const BOLD_ITALIC_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold', 'italic'],\n intraword: false,\n tag: '___',\n}\n\nexport const BOLD_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold'],\n tag: '**',\n}\n\nexport const BOLD_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold'],\n intraword: false,\n tag: '__',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { CodeIcon } from '../../../lexical/ui/icons/Code/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { INLINE_CODE } from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: CodeIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('code')\n }\n return false\n },\n key: 'inlineCode',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code')\n },\n order: 7,\n },\n ]),\n]\n\nexport const InlineCodeFeatureClient = createClientFeature({\n enableFormats: ['code'],\n markdownTransformers: [INLINE_CODE],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const CodeIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7.76465 6L3.76465 10L7.76465 14\" stroke=\"currentColor\" />\n <path d=\"M12.2354 6L16.2354 10L12.2354 14\" stroke=\"currentColor\" />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const INLINE_CODE: TextFormatTransformer = {\n type: 'text-format',\n format: ['code'],\n tag: '`',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { ItalicIcon } from '../../../lexical/ui/icons/Italic/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { ITALIC_STAR, ITALIC_UNDERSCORE } from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: ItalicIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('italic')\n }\n return false\n },\n key: 'italic',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\n },\n order: 2,\n },\n ]),\n]\n\nexport const ItalicFeatureClient = createClientFeature({\n enableFormats: ['italic'],\n markdownTransformers: [ITALIC_STAR, ITALIC_UNDERSCORE],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const ItalicIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.311 14.2969L11.0327 15H6.18408L6.4624 14.2969C7.54639 14.2969 7.70752 14.209 7.83936 13.8721L10.8423 6.45996C10.8716 6.38672 10.8862 6.32812 10.8862 6.26953C10.8862 6.09375 10.6519 6.03516 9.80225 6.03516L10.0952 5.33203H14.9438L14.6509 6.03516C13.5669 6.03516 13.4204 6.12305 13.2886 6.45996L10.2856 13.8721C10.2563 13.9453 10.2271 14.0039 10.2271 14.0625C10.2271 14.2383 10.4614 14.2969 11.311 14.2969Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const ITALIC_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['italic'],\n tag: '*',\n}\n\nexport const ITALIC_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['italic'],\n intraword: false,\n tag: '_',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport { StrikethroughIcon } from '../../../lexical/ui/icons/Strikethrough/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { STRIKETHROUGH } from './markdownTransformers.js'\n\nconst toolbarGroups = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: StrikethroughIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('strikethrough')\n }\n return false\n },\n key: 'strikethrough',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\n },\n order: 4,\n },\n ]),\n]\n\nexport const StrikethroughFeatureClient = createClientFeature({\n enableFormats: ['strikethrough'],\n markdownTransformers: [STRIKETHROUGH],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const StrikethroughIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.50756 12.76H7.42756C7.56256 14.215 8.82256 14.71 10.1576 14.71C11.4326 14.71 12.4226 14.14 12.4226 13.06C12.4226 12.28 11.9576 11.845 10.6676 11.605L8.70256 11.245C7.12756 10.96 5.85256 10.21 5.85256 8.335C5.85256 6.43 7.53256 5.11 9.87256 5.11C12.4226 5.11 13.9526 6.22 14.1626 8.23H12.2876C12.1526 7.18 11.2226 6.595 9.88756 6.595C8.59756 6.595 7.78756 7.27 7.78756 8.215C7.78756 9.1 8.34256 9.385 9.49756 9.61L11.5676 10.015C13.3226 10.345 14.3726 11.215 14.3726 12.94C14.3726 14.89 12.5876 16.18 10.2176 16.18C7.66756 16.18 5.70256 15.115 5.50756 12.76Z\"\n fill=\"currentColor\"\n />\n <path d=\"M4.99756 11.44H15.0026V12.19H4.99756V11.44Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const STRIKETHROUGH: TextFormatTransformer = {\n type: 'text-format',\n format: ['strikethrough'],\n tag: '~~',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { SubscriptIcon } from '../../../lexical/ui/icons/Subscript/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: SubscriptIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('subscript')\n }\n return false\n },\n key: 'subscript',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\n },\n order: 5,\n },\n ]),\n]\n\nexport const SubscriptFeatureClient = createClientFeature({\n enableFormats: ['subscript'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const SubscriptIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.167 15L7.45002 11.36L4.73302 15H2.91302L6.55302 10.177L3.23802 5.718H5.20102L7.54102 8.89L9.89402 5.718H11.714L8.43802 10.06L12.13 15H10.167ZM16.7768 13.258C16.7768 14.155 16.1398 14.532 15.2038 15C14.5538 15.325 14.2808 15.546 14.2418 15.78H16.7898V16.82H12.7208V16.339C12.7208 15.286 13.5918 14.675 14.3588 14.233C15.0868 13.83 15.4378 13.635 15.4378 13.232C15.4378 12.894 15.2038 12.686 14.8268 12.686C14.3848 12.686 14.1248 13.024 14.1118 13.427H12.7468C12.8248 12.426 13.5528 11.633 14.8398 11.633C15.9448 11.633 16.7768 12.257 16.7768 13.258Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { SuperscriptIcon } from '../../../lexical/ui/icons/Superscript/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: SuperscriptIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('superscript')\n }\n return false\n },\n key: 'superscript',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\n },\n order: 6,\n },\n ]),\n]\n\nexport const SuperscriptFeatureClient = createClientFeature({\n enableFormats: ['superscript'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const SuperscriptIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.167 15L7.45002 11.36L4.73302 15H2.91302L6.55302 10.177L3.23802 5.718H5.20102L7.54102 8.89L9.89402 5.718H11.714L8.43802 10.06L12.13 15H10.167ZM16.7768 7.252C16.7768 8.149 16.1398 8.526 15.2038 8.994C14.5538 9.319 14.2808 9.54 14.2418 9.774H16.7898V10.814H12.7208V10.333C12.7208 9.28 13.5918 8.669 14.3588 8.227C15.0868 7.824 15.4378 7.629 15.4378 7.226C15.4378 6.888 15.2038 6.68 14.8268 6.68C14.3848 6.68 14.1248 7.018 14.1118 7.421H12.7468C12.8248 6.42 13.5528 5.627 14.8398 5.627C15.9448 5.627 16.7768 6.251 16.7768 7.252Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { UnderlineIcon } from '../../../lexical/ui/icons/Underline/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: UnderlineIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('underline')\n }\n return false\n },\n key: 'underline',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\n },\n order: 3,\n },\n ]),\n]\n\nexport const UnderlineFeatureClient = createClientFeature({\n enableFormats: ['underline'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UnderlineIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.9656 11.256C13.9656 13.791 12.5096 15.156 10.0006 15.156C7.50461 15.156 6.03561 13.791 6.03561 11.23V5.718H7.76461V11.243C7.76461 12.868 8.50561 13.778 10.0006 13.778C11.4956 13.778 12.2496 12.868 12.2496 11.243V5.718H13.9656V11.256Z\"\n fill=\"currentColor\"\n />\n <path d=\"M5.09961 16.3H14.9016V16.95H5.09961V16.3Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { StyleObject } from '../../../../features/textState/feature.server.js'\n\nfunction kebabToCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\nexport const TextStateIcon: React.FC<{\n css?: StyleObject\n}> = ({ css }) => {\n const convertedCss = css\n ? Object.fromEntries(Object.entries(css).map(([key, value]) => [kebabToCamelCase(key), value]))\n : {}\n\n return (\n <span\n style={{\n ...convertedCss,\n alignItems: 'center',\n borderRadius: '4px',\n display: 'flex',\n fontSize: '16px',\n height: '20px',\n justifyContent: 'center',\n width: '20px',\n }}\n >\n A\n </span>\n )\n}\n", "import type { LexicalEditor, StateConfig } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $forEachSelectedTextNode } from '@lexical/selection'\nimport { $getNodeByKey, $getState, $setState, createState, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport { type StateValues, type TextStateFeatureProps } from './feature.server.js'\n\nexport type StateMap = Map<\n string,\n {\n stateConfig: StateConfig<string, string | undefined>\n stateValues: StateValues\n }\n>\n\nexport function registerTextStates(state: TextStateFeatureProps['state']) {\n const stateMap: StateMap = new Map()\n\n for (const stateKey in state) {\n const stateValues = state[stateKey]!\n const stateConfig = createState(stateKey, {\n parse: (value) =>\n typeof value === 'string' && Object.keys(stateValues).includes(value) ? value : undefined,\n })\n stateMap.set(stateKey, { stateConfig, stateValues })\n }\n return stateMap\n}\n\nexport function setTextState(\n editor: LexicalEditor,\n stateMap: StateMap,\n stateKey: string,\n value: string | undefined,\n) {\n editor.update(() => {\n $forEachSelectedTextNode((textNode) => {\n const stateMapEntry = stateMap.get(stateKey)\n if (!stateMapEntry) {\n throw new Error(`State config for ${stateKey} not found`)\n }\n $setState(textNode, stateMapEntry.stateConfig, value)\n })\n })\n}\n\nexport function StatePlugin({ stateMap }: { stateMap: StateMap }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerMutationListener(TextNode, (mutatedNodes) => {\n editor.getEditorState().read(() => {\n for (const [nodeKey, mutation] of mutatedNodes) {\n if (mutation === 'destroyed') {\n continue\n }\n const node = $getNodeByKey(nodeKey)\n const dom = editor.getElementByKey(nodeKey)\n if (!node || !dom) {\n continue\n }\n\n const mergedStyles: Record<string, string> = Object.create(null)\n // Examples:\n // stateKey: 'color'\n // stateValue: 'bg-red'\n stateMap.forEach((stateEntry, stateKey) => {\n const stateValue = $getState(node, stateEntry.stateConfig)\n if (!stateValue) {\n // clear the previous dataset value for this key\n delete dom.dataset[stateKey]\n return\n } // skip - nothing else to do\n\n dom.dataset[stateKey] = stateValue\n\n const css = stateEntry.stateValues[stateValue]?.css\n if (css) {\n // merge existing styles with the new ones\n Object.assign(mergedStyles, css)\n }\n })\n\n // wipe previous inline styles once, then set the merged ones\n dom.style.cssText = ''\n Object.assign(dom.style, mergedStyles)\n }\n })\n })\n }, [editor])\n\n return null\n}\n", "'use client'\n\nimport type { ToolbarDropdownGroup, ToolbarGroup } from '../toolbars/types.js'\nimport type { TextStateFeatureProps } from './feature.server.js'\n\nimport { TextStateIcon } from '../../lexical/ui/icons/TextState/index.js'\nimport { createClientFeature } from '../../utilities/createClientFeature.js'\nimport { registerTextStates, setTextState, type StateMap, StatePlugin } from './textState.js'\n\nconst toolbarGroups = (props: TextStateFeatureProps, stateMap: StateMap): ToolbarGroup[] => {\n const items: ToolbarDropdownGroup['items'] = []\n\n for (const stateKey in props.state) {\n const key = props.state[stateKey]!\n for (const stateValue in key) {\n const meta = key[stateValue]!\n items.push({\n ChildComponent: () => <TextStateIcon css={meta.css} />,\n key: stateValue,\n label: meta.label,\n onSelect: ({ editor }) => {\n setTextState(editor, stateMap, stateKey, stateValue)\n },\n })\n }\n }\n\n const clearStyle: ToolbarDropdownGroup['items'] = [\n {\n ChildComponent: () => <TextStateIcon />,\n key: `clear-style`,\n label: ({ i18n }) => i18n.t('lexical:textState:defaultStyle'),\n onSelect: ({ editor }) => {\n for (const stateKey in props.state) {\n setTextState(editor, stateMap, stateKey, undefined)\n }\n },\n order: 1,\n },\n ]\n\n return [\n {\n type: 'dropdown',\n ChildComponent: () => <TextStateIcon css={{ color: 'var(--theme-elevation-600)' }} />,\n items: [...clearStyle, ...items],\n key: 'textState',\n order: 30,\n },\n ]\n}\n\nexport const TextStateFeatureClient = createClientFeature<TextStateFeatureProps>(({ props }) => {\n const stateMap = registerTextStates(props.state)\n return {\n plugins: [\n {\n Component: () => StatePlugin({ stateMap }),\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups(props, stateMap),\n },\n toolbarInline: {\n groups: toolbarGroups(props, stateMap),\n },\n }\n})\n", "'use client'\n\nimport type { HeadingTagType } from '@lexical/rich-text'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createHeadingNode, $isHeadingNode, HeadingNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { PluginComponent } from '../../typesClient.js'\nimport type { HeadingFeatureProps } from '../server/index.js'\n\nimport { H1Icon } from '../../../lexical/ui/icons/H1/index.js'\nimport { H2Icon } from '../../../lexical/ui/icons/H2/index.js'\nimport { H3Icon } from '../../../lexical/ui/icons/H3/index.js'\nimport { H4Icon } from '../../../lexical/ui/icons/H4/index.js'\nimport { H5Icon } from '../../../lexical/ui/icons/H5/index.js'\nimport { H6Icon } from '../../../lexical/ui/icons/H6/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from '../markdownTransformer.js'\n\nconst $setHeading = (headingSize: HeadingTagType) => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createHeadingNode(headingSize))\n}\n\nconst iconImports = {\n h1: H1Icon,\n h2: H2Icon,\n h3: H3Icon,\n h4: H4Icon,\n h5: H5Icon,\n h6: H6Icon,\n}\n\nexport const HeadingFeatureClient = createClientFeature<HeadingFeatureProps>(({ props }) => {\n const { enabledHeadingSizes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] } = props\n\n const toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems(\n enabledHeadingSizes.map((headingSize, i) => {\n return {\n ChildComponent: iconImports[headingSize],\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isHeadingNode(node) && node.getTag() === headingSize) {\n continue\n }\n\n const parent = node.getParent()\n if ($isHeadingNode(parent) && parent.getTag() === headingSize) {\n continue\n }\n\n return false\n }\n return true\n },\n key: headingSize,\n label: ({ i18n }) => {\n return i18n.t('lexical:heading:label', { headingLevel: headingSize.charAt(1) })\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n $setHeading(headingSize)\n })\n },\n order: i + 2,\n }\n }),\n ),\n ]\n\n return {\n markdownTransformers: [MarkdownTransformer(enabledHeadingSizes)],\n nodes: [HeadingNode],\n plugins: [\n {\n Component: HeadingPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: enabledHeadingSizes?.length\n ? [\n slashMenuBasicGroupWithItems(\n enabledHeadingSizes.map((headingSize) => {\n return {\n Icon: iconImports[headingSize],\n key: `heading-${headingSize.charAt(1)}`,\n keywords: ['heading', headingSize],\n label: ({ i18n }) => {\n return i18n.t('lexical:heading:label', {\n headingLevel: headingSize.charAt(1),\n })\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n $setHeading(headingSize)\n })\n },\n }\n }),\n ),\n ]\n : [],\n },\n toolbarFixed: {\n groups: enabledHeadingSizes?.length ? toolbarGroups : [],\n },\n toolbarInline: {\n groups: enabledHeadingSizes?.length ? toolbarGroups : [],\n },\n }\n})\n\nconst HeadingPlugin: PluginComponent<HeadingFeatureProps> = ({ clientProps }) => {\n const { enabledHeadingSizes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] } = clientProps\n const lowestAllowed = enabledHeadingSizes.at(-1)\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!lowestAllowed || enabledHeadingSizes.length === 6) {\n return\n }\n return editor.registerNodeTransform(HeadingNode, (node) => {\n if (!enabledHeadingSizes.includes(node.getTag())) {\n node.setTag(lowestAllowed)\n }\n })\n }, [editor, enabledHeadingSizes, lowestAllowed])\n\n return null\n}\n", "'use client'\nimport React from 'react'\n\nexport const H1Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.639 13.5V7.074H6.196V9.648H9.076V7.074H10.642V13.5H9.076V10.836H6.196V13.5H4.639ZM11.5656 9.045V8.019C12.6636 8.019 13.1316 7.731 13.2846 7.065H14.4006V13.5H12.8436V9.045H11.5656Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H2Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.139 13.5V7.074H5.696V9.648H8.576V7.074H10.142V13.5H8.576V10.836H5.696V13.5H4.139ZM15.9796 8.973C15.9796 10.116 15.1696 10.656 14.0356 11.232C13.2256 11.646 12.8206 11.943 12.7846 12.294H15.9886V13.5H11.0566V12.951C11.0566 11.601 12.1636 10.845 13.1176 10.287C14.0356 9.756 14.5126 9.486 14.5126 8.946C14.5126 8.46 14.2156 8.145 13.6306 8.145C13.0186 8.145 12.6586 8.613 12.6226 9.198H11.1196C11.2186 7.947 12.1006 6.966 13.6396 6.966C15.0346 6.966 15.9796 7.785 15.9796 8.973Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H3Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.139 13.5V7.074H5.696V9.648H8.576V7.074H10.142V13.5H8.576V10.836H5.696V13.5H4.139ZM16.1146 11.745C16.1146 12.744 15.2236 13.608 13.6126 13.608C12.0736 13.608 11.0926 12.762 10.9846 11.547H12.4696C12.5146 12.114 13.0006 12.456 13.6126 12.456C14.2876 12.456 14.6746 12.132 14.6746 11.619C14.6746 11.061 14.2426 10.836 13.6216 10.836H12.9826V9.738H13.6036C14.1526 9.738 14.5486 9.486 14.5486 8.937C14.5486 8.46 14.2156 8.127 13.6486 8.127C13.0366 8.127 12.6586 8.514 12.6226 9.045H11.1916C11.2726 7.929 12.1276 6.966 13.6666 6.966C15.1876 6.966 15.9706 7.848 15.9706 8.865C15.9706 9.603 15.5026 10.143 14.8186 10.269C15.6196 10.404 16.1146 10.971 16.1146 11.745Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H4Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM15.1736 7.074V10.854H16.3706V12.033H15.1736V13.5H13.6796V12.033H10.5116V10.845L13.4996 7.074H15.1736ZM13.6796 8.46L11.8256 10.854H13.6796V8.46Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H5Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM13.1576 10.269C12.6896 10.269 12.3746 10.494 12.2216 10.737H10.8176L11.1956 7.074H15.2546V8.28H12.3206L12.1856 9.549C12.4016 9.351 12.8516 9.126 13.4636 9.126C14.7866 9.126 15.6596 10.053 15.6596 11.358C15.6596 12.609 14.7326 13.608 13.1756 13.608C11.5826 13.608 10.6556 12.753 10.5566 11.511H12.1136C12.1586 12.06 12.5456 12.465 13.1576 12.465C13.8236 12.465 14.1746 11.97 14.1746 11.376C14.1746 10.764 13.8416 10.269 13.1576 10.269Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H6Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM13.3646 8.127C12.5456 8.127 12.0416 8.937 12.0416 9.999C12.3296 9.54 12.8246 9.207 13.5536 9.207C14.8586 9.207 15.8036 10.134 15.8036 11.376C15.8036 12.645 14.8226 13.608 13.3196 13.608C11.7266 13.608 10.6196 12.393 10.6196 10.395C10.6196 8.316 11.7716 6.966 13.4186 6.966C14.7056 6.966 15.5786 7.749 15.7316 8.829H14.3186C14.2016 8.415 13.9226 8.127 13.3646 8.127ZM13.3106 12.51C13.9586 12.51 14.3816 12.042 14.3816 11.385C14.3816 10.737 13.9586 10.278 13.3106 10.278C12.6536 10.278 12.2126 10.737 12.2126 11.385C12.2126 12.042 12.6536 12.51 13.3106 12.51Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { HeadingTagType } from '@lexical/rich-text'\n\nimport { $createHeadingNode, $isHeadingNode, HeadingNode } from '@lexical/rich-text'\n\nimport type { ElementTransformer } from '../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { createBlockNode } from '../../lexical/utils/markdown/createBlockNode.js'\n\nexport const MarkdownTransformer: (enabledHeadingSizes: HeadingTagType[]) => ElementTransformer = (\n enabledHeadingSizes,\n) => {\n // Convert enabledHeadingSizes to a list of numbers (1 for h1, 2 for h2, etc.)\n const enabledSizes = enabledHeadingSizes.map((tag) => Number(tag.slice(1)))\n\n // Create a regex pattern that matches any of the enabled sizes\n const pattern = `^(${enabledSizes.map((size) => `#{${size}}`).join('|')})\\\\s`\n const regExp = new RegExp(pattern)\n\n return {\n type: 'element',\n dependencies: [HeadingNode],\n export: (node, exportChildren) => {\n if (!$isHeadingNode(node)) {\n return null\n }\n const level = Number(node.getTag().slice(1))\n return '#'.repeat(level) + ' ' + exportChildren(node)\n },\n regExp,\n replace: createBlockNode((match) => {\n const tag = ('h' + match[1]?.length) as HeadingTagType\n return $createHeadingNode(tag)\n }),\n }\n}\n", "import type { ElementNode } from 'lexical'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const createBlockNode = (\n createNode: (match: Array<string>) => ElementNode,\n): ElementTransformer['replace'] => {\n return (parentNode, children, match) => {\n const node = createNode(match)\n if (node) {\n node.append(...children)\n parentNode.replace(node)\n node.select(0, 0)\n }\n }\n}\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport { HorizontalRuleIcon } from '../../../lexical/ui/icons/HorizontalRule/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../server/nodes/HorizontalRuleNode.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\nimport { $isHorizontalRuleNode, HorizontalRuleNode } from './nodes/HorizontalRuleNode.js'\nimport { HorizontalRulePlugin } from './plugin/index.js'\n\nexport const HorizontalRuleFeatureClient = createClientFeature({\n markdownTransformers: [MarkdownTransformer],\n nodes: [HorizontalRuleNode],\n plugins: [\n {\n Component: HorizontalRulePlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: HorizontalRuleIcon,\n key: 'horizontalRule',\n keywords: ['hr', 'horizontal rule', 'line', 'separator'],\n label: ({ i18n }) => {\n return i18n.t('lexical:horizontalRule:label')\n },\n\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: HorizontalRuleIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isHorizontalRuleNode(firstNode)\n },\n key: 'horizontalRule',\n label: ({ i18n }) => {\n return i18n.t('lexical:horizontalRule:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const HorizontalRuleIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect fill=\"currentColor\" height=\"1\" width=\"12\" x=\"4\" y=\"9.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AddIcon: React.FC = () => (\n <svg fill=\"none\" height=\"20\" viewBox=\"0 0 20 20\" width=\"20\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 10h10\" stroke=\"currentColor\" />\n <path d=\"M10 15V5\" stroke=\"currentColor\" />\n </svg>\n)\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { AddIcon } from '../../../lexical/ui/icons/Add/index.js'\n\nexport const toolbarAddDropdownGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: AddIcon,\n items,\n key: 'add',\n order: 10,\n }\n}\n", "import type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalCommand,\n LexicalNode,\n SerializedLexicalNode,\n} from 'lexical'\nimport type * as React from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, createCommand, DecoratorNode } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\n/**\n * Serialized representation of a horizontal rule node. Serialized = converted to JSON. This is what is stored in the database / in the lexical editor state.\n */\nexport type SerializedHorizontalRuleNode = StronglyTypedLeafNode<\n SerializedLexicalNode,\n 'horizontalrule'\n>\n\nexport const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_HORIZONTAL_RULE_COMMAND',\n)\n\n/**\n * This node is a DecoratorNode. DecoratorNodes allow you to render React components in the editor.\n *\n * They need both createDom and decorate functions. createDom => outside of the html. decorate => React Component inside of the html.\n *\n * If we used DecoratorBlockNode instead, we would only need a decorate method\n */\nexport class HorizontalRuleServerNode extends DecoratorNode<null | React.ReactElement> {\n static override clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return new this(node.__key)\n }\n\n static override getType(): string {\n return 'horizontalrule'\n }\n\n /**\n * Defines what happens if you copy an hr element from another page and paste it into the lexical editor\n *\n * This also determines the behavior of lexical's internal HTML -> Lexical converter\n */\n static override importDOM(): DOMConversionMap | null {\n return {\n hr: () => ({\n conversion: $convertHorizontalRuleElement,\n priority: 0,\n }),\n }\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static override importJSON(\n serializedNode: SerializedHorizontalRuleNode,\n ): HorizontalRuleServerNode {\n return $createHorizontalRuleServerNode()\n }\n\n /**\n * Determines how the hr element is rendered in the lexical editor. This is only the \"initial\" / \"outer\" HTML element.\n */\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('hr')\n addClassNamesToElement(element, config.theme.hr)\n return element\n }\n\n override decorate(): null | React.ReactElement {\n return null\n }\n\n /**\n * Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page.\n *\n * This also determines the behavior of lexical's internal Lexical -> HTML converter\n */\n override exportDOM(): DOMExportOutput {\n return { element: document.createElement('hr') }\n }\n /**\n * Opposite of importJSON. This determines what data is saved in the database / in the lexical editor state.\n */\n override exportJSON(): SerializedLexicalNode {\n return {\n type: 'horizontalrule',\n version: 1,\n }\n }\n\n override getTextContent(): string {\n return '\\n'\n }\n\n override isInline(): false {\n return false\n }\n\n override updateDOM(): boolean {\n return false\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleServerNode() }\n}\n\nexport function $createHorizontalRuleServerNode(): HorizontalRuleServerNode {\n return $applyNodeReplacement(new HorizontalRuleServerNode())\n}\n\nexport function $isHorizontalRuleServerNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleServerNode {\n return node instanceof HorizontalRuleServerNode\n}\n", "'use client'\nimport type { DOMConversionOutput, LexicalNode, SerializedLexicalNode } from 'lexical'\n\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type { SerializedHorizontalRuleNode } from '../../server/nodes/HorizontalRuleNode.js'\n\nimport { HorizontalRuleServerNode } from '../../server/nodes/HorizontalRuleNode.js'\n\nexport class HorizontalRuleNode extends HorizontalRuleServerNode {\n static override clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static override importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleNode {\n return $createHorizontalRuleNode()\n }\n\n /**\n * Allows you to render a React component within whatever createDOM returns.\n */\n override decorate() {\n return null\n }\n\n override exportJSON(): SerializedLexicalNode {\n return super.exportJSON()\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleNode() }\n}\n\nexport function $createHorizontalRuleNode(): HorizontalRuleNode {\n return $applyNodeReplacement(new HorizontalRuleNode())\n}\n\nexport function $isHorizontalRuleNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleNode {\n return node instanceof HorizontalRuleNode\n}\n", "import type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport {\n $createHorizontalRuleNode,\n $isHorizontalRuleNode,\n HorizontalRuleNode,\n} from './nodes/HorizontalRuleNode.js'\n\nexport const MarkdownTransformer: ElementTransformer = {\n type: 'element',\n dependencies: [HorizontalRuleNode],\n export: (node, exportChildren) => {\n if (!$isHorizontalRuleNode(node)) {\n return null\n }\n return '---'\n },\n // match ---\n regExp: /^---\\s*$/,\n replace: (parentNode) => {\n const node = $createHorizontalRuleNode()\n if (node) {\n parentNode.replace(node)\n }\n },\n}\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../../server/nodes/HorizontalRuleNode.js'\nimport { $createHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\nimport './index.scss'\n\n/**\n * Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.\n */\nexport const HorizontalRulePlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand(\n INSERT_HORIZONTAL_RULE_COMMAND,\n (type) => {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const focusNode = selection.focus.getNode()\n\n if (focusNode !== null) {\n const horizontalRuleNode = $createHorizontalRuleNode()\n $insertNodeToNearestRoot(horizontalRuleNode)\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n", "'use client'\n\nimport type { ElementNode, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $isElementNode, INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { type IndentFeatureProps } from '../server/index.js'\nimport { IndentPlugin } from './IndentPlugin.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups = ({ disabledNodes }: IndentFeatureProps): ToolbarGroup[] => [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes() ?? []\n\n const isOutdentable = (node: LexicalNode) => {\n return isIndentable(node) && node.getIndent() > 0\n }\n\n return nodes.some((node) => {\n return isOutdentable(node) || Boolean($findMatchingParent(node, isOutdentable))\n })\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes() ?? []\n\n const isIndentableAndNotDisabled = (node: LexicalNode) => {\n return isIndentable(node) && !(disabledNodes ?? []).includes(node.getType())\n }\n\n return nodes.some((node) => {\n return (\n isIndentableAndNotDisabled(node) ||\n Boolean($findMatchingParent(node, isIndentableAndNotDisabled))\n )\n })\n },\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature<IndentFeatureProps>(({ props }) => {\n const disabledNodes = props.disabledNodes ?? []\n return {\n plugins: [\n {\n Component: IndentPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n toolbarFixed: {\n groups: toolbarGroups({ disabledNodes }),\n },\n toolbarInline: {\n groups: toolbarGroups({ disabledNodes }),\n },\n }\n})\n\nconst isIndentable = (node: LexicalNode): node is ElementNode =>\n $isElementNode(node) && node.canIndent()\n", "'use client'\nimport React from 'react'\n\nexport const IndentDecreaseIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.25 7.25L17.25 3.75V10.75L12.25 7.25Z\" fill=\"currentColor\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const IndentIncreaseIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M17.5 5H9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17.5 10H9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17.5 15H2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7.75 7.25L2.75 3.75V10.75L7.75 7.25Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { ElementNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n INDENT_CONTENT_COMMAND,\n KEY_TAB_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n TabNode,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../typesClient.js'\nimport type { IndentFeatureProps } from '../server/index.js'\n\nexport const IndentPlugin: PluginComponent<IndentFeatureProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n const { disabledNodes, disableTabNode } = clientProps\n\n useEffect(() => {\n if (!editor || !disabledNodes?.length) {\n return\n }\n return mergeRegister(\n editor.registerCommand(\n INDENT_CONTENT_COMMAND,\n () => {\n return $handleIndentAndOutdent((block) => {\n if (!disabledNodes.includes(block.getType())) {\n const indent = block.getIndent()\n block.setIndent(indent + 1)\n }\n })\n },\n COMMAND_PRIORITY_LOW,\n ),\n // If we disable indenting for certain nodes, we need to ensure that these are not indented,\n // if they get transformed from an indented state (e.g. an indented list node gets transformed into a\n // paragraph node for which indenting is disabled).\n editor.registerUpdateListener(({ dirtyElements, editorState }) => {\n editor.update(() => {\n for (const [nodeKey] of dirtyElements) {\n const node = editorState._nodeMap.get(nodeKey)\n if ($isElementNode(node) && disabledNodes.includes(node.getType())) {\n const currentIndent = node.getIndent()\n if (currentIndent > 0) {\n node.setIndent(0)\n }\n }\n }\n })\n }),\n )\n }, [editor, disabledNodes])\n\n useEffect(() => {\n if (!editor || !disableTabNode) {\n return\n }\n return mergeRegister(\n // This is so that when you press Tab in the middle of a paragraph,\n // it indents the paragraph, instead of inserting a TabNode.\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault()\n return editor.dispatchCommand(\n event.shiftKey ? OUTDENT_CONTENT_COMMAND : INDENT_CONTENT_COMMAND,\n undefined,\n )\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Tab isn't the only way to insert a TabNode. We have to make sure\n // it doesn't happen, for example, when pasting from the clipboard.\n editor.registerNodeTransform(TabNode, (node) => {\n node.remove()\n }),\n )\n }, [editor, disableTabNode])\n\n return <TabIndentationPlugin />\n}\n\nfunction $handleIndentAndOutdent(indentOrOutdent: (block: ElementNode) => void): boolean {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return false\n }\n const alreadyHandled = new Set()\n const nodes = selection.getNodes()\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n const key = node.getKey()\n if (alreadyHandled.has(key)) {\n continue\n }\n const parentBlock = $findMatchingParent(\n node,\n (parentNode): parentNode is ElementNode =>\n $isElementNode(parentNode) && !parentNode.isInline(),\n )\n if (parentBlock === null) {\n continue\n }\n const parentKey = parentBlock.getKey()\n if (parentBlock.canIndent() && !alreadyHandled.has(parentKey)) {\n alreadyHandled.add(parentKey)\n indentOrOutdent(parentBlock)\n }\n }\n return alreadyHandled.size > 0\n}\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarIndentGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'indent',\n order: 35,\n }\n}\n", "'use client'\n\nimport type { Klass, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { ClientFeature } from '../../typesClient.js'\nimport type { LinkFields } from '../nodes/types.js'\nimport type { ExclusiveLinkCollectionsProps } from '../server/index.js'\n\nimport { LinkIcon } from '../../../lexical/ui/icons/Link/index.js'\nimport { getSelectedNode } from '../../../lexical/utils/getSelectedNode.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFeatureButtonsGroupWithItems } from '../../shared/toolbar/featureButtonsGroup.js'\nimport { LinkMarkdownTransformer } from '../markdownTransformer.js'\nimport { AutoLinkNode } from '../nodes/AutoLinkNode.js'\nimport { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '../nodes/LinkNode.js'\nimport { AutoLinkPlugin } from './plugins/autoLink/index.js'\nimport { ClickableLinkPlugin } from './plugins/clickableLink/index.js'\nimport { FloatingLinkEditorPlugin } from './plugins/floatingLinkEditor/index.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './plugins/floatingLinkEditor/LinkEditor/commands.js'\nimport { LinkPlugin } from './plugins/link/index.js'\n\nexport type ClientProps = {\n defaultLinkType?: string\n defaultLinkURL?: string\n disableAutoLinks?: 'creationOnly' | true\n} & ExclusiveLinkCollectionsProps\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFeatureButtonsGroupWithItems([\n {\n ChildComponent: LinkIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection)) {\n const selectedNode = getSelectedNode(selection)\n const linkParent = $findMatchingParent(selectedNode, $isLinkNode)\n return linkParent != null\n }\n return false\n },\n isEnabled: ({ selection }) => {\n return !!($isRangeSelection(selection) && $getSelection()?.getTextContent()?.length)\n },\n key: 'link',\n label: ({ i18n }) => {\n return i18n.t('lexical:link:label')\n },\n onSelect: ({ editor, isActive }) => {\n if (!isActive) {\n let selectedText: string | undefined\n let selectedNodes: LexicalNode[] = []\n editor.getEditorState().read(() => {\n selectedText = $getSelection()?.getTextContent()\n // We need to selected nodes here before the drawer opens, as clicking around in the drawer may change the original selection\n selectedNodes = $getSelection()?.getNodes() ?? []\n })\n\n if (!selectedText?.length) {\n return\n }\n\n const linkFields: Partial<LinkFields> = {\n doc: null,\n }\n\n editor.dispatchCommand(TOGGLE_LINK_WITH_MODAL_COMMAND, {\n fields: linkFields,\n selectedNodes,\n text: selectedText,\n })\n } else {\n // remove link\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }\n },\n order: 1,\n },\n ]),\n]\n\nexport const LinkFeatureClient = createClientFeature<ClientProps>(({ props }) => ({\n markdownTransformers: [LinkMarkdownTransformer],\n nodes: [LinkNode, props?.disableAutoLinks === true ? null : AutoLinkNode].filter(\n Boolean,\n ) as Array<Klass<LexicalNode>>,\n plugins: [\n {\n Component: LinkPlugin,\n position: 'normal',\n },\n props?.disableAutoLinks === true || props?.disableAutoLinks === 'creationOnly'\n ? null\n : {\n Component: AutoLinkPlugin,\n position: 'normal',\n },\n {\n Component: ClickableLinkPlugin,\n position: 'normal',\n },\n {\n Component: FloatingLinkEditorPlugin,\n position: 'floatingAnchorElem',\n },\n ].filter(Boolean) as ClientFeature<ClientProps>['plugins'],\n sanitizedClientFeatureProps: props,\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n}))\n", "'use client'\nimport React from 'react'\n\nexport const LinkIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.5 11.5L11.5 8.5M8.5 7L9.625 5.875C10.868 4.633 12.882 4.633 14.125 5.875C15.368 7.118 15.368 9.133 14.125 10.375L13 11.5M7 8.5L5.746 9.754C4.56 10.94 4.519 12.85 5.652 14.087C6.814 15.354 8.78 15.449 10.058 14.298L11.5 13\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "'use client'\nimport type { ElementNode, RangeSelection, TextNode } from 'lexical'\n\nimport { $isAtNodeEnd } from '@lexical/selection'\n\nexport function getSelectedNode(selection: RangeSelection): ElementNode | TextNode {\n const { anchor } = selection\n const { focus } = selection\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n if (anchorNode === focusNode) {\n return anchorNode\n }\n const isBackward = selection.isBackward()\n if (isBackward) {\n return $isAtNodeEnd(focus) ? anchorNode : focusNode\n }\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode\n}\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarFeatureButtonsGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'features',\n order: 50,\n }\n}\n", "/**\n * Code taken from https://github.com/facebook/lexical/blob/main/packages/lexical-markdown/src/MarkdownTransformers.ts#L357\n */\n\n// Order of text transformers matters:\n//\n// - code should go first as it prevents any transformations inside\n\nimport { $createTextNode, $isTextNode } from 'lexical'\n\nimport type { TextMatchTransformer } from '../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { $createLinkNode, $isLinkNode, LinkNode } from './nodes/LinkNode.js'\n\n// - then longer tags match (e.g. ** or __ should go before * or _)\nexport const LinkMarkdownTransformer: TextMatchTransformer = {\n type: 'text-match',\n dependencies: [LinkNode],\n export: (_node, exportChildren) => {\n if (!$isLinkNode(_node)) {\n return null\n }\n const node: LinkNode = _node\n const { url } = node.getFields()\n\n const textContent = exportChildren(node)\n\n const linkContent = `[${textContent}](${url})`\n\n return linkContent\n },\n importRegExp: /\\[([^[]+)\\]\\(([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?\\)/,\n regExp: /\\[([^[]+)\\]\\(([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?\\)$/,\n replace: (textNode, match) => {\n const [, linkText, linkUrl] = match\n const linkNode = $createLinkNode({\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: linkUrl,\n },\n })\n const linkTextNode = $createTextNode(linkText)\n linkTextNode.setFormat(textNode.getFormat())\n linkNode.append(linkTextNode)\n textNode.replace(linkNode)\n\n return linkTextNode\n },\n trigger: ')',\n}\n", "import type {\n BaseSelection,\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n LexicalUpdateJSON,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n} from 'lexical'\n\nimport type { LinkPayload } from '../client/plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n __id: string\n\n constructor({\n id,\n fields = {\n linkType: 'custom',\n newTab: false,\n },\n key,\n }: {\n fields?: LinkFields\n id: string\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__id = id\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new this({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'link'\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedLinkNode): LinkNode {\n const node = $createLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove this in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n if (serializedNode.version === 2 && !serializedNode.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n return node\n }\n\n override canBeEmpty(): false {\n return false\n }\n\n override canInsertTextAfter(): false {\n return false\n }\n\n override canInsertTextBefore(): false {\n return false\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n override exportJSON(): SerializedLinkNode {\n const fields = this.getFields()\n\n if (fields?.linkType === 'internal') {\n delete fields.url\n } else if (fields?.linkType === 'custom') {\n delete fields.doc\n }\n\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields,\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n override extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n getID(): string {\n return this.getLatest().__id\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true,\n ): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): this {\n const writable = this.getWritable()\n writable.__fields = fields\n return writable\n }\n\n setID(id: string): this {\n const writable = this.getWritable()\n writable.__id = id\n return writable\n }\n\n override updateDOM(prevNode: this, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedLinkNode>): this {\n return super\n .updateFromJSON(serializedNode)\n .setFields(serializedNode.fields)\n .setID(serializedNode.id as string)\n }\n}\n\nfunction $convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n id: new ObjectID.default().toHexString(),\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ id, fields }: { fields?: LinkFields; id?: string }): LinkNode {\n return $applyNodeReplacement(\n new LinkNode({\n id: id ?? new ObjectID.default().toHexString(),\n fields,\n }),\n )\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function $toggleLink(payload: ({ fields: LinkFields } & LinkPayload) | null): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && (payload === null || !payload.selectedNodes?.length)) {\n return\n }\n const nodes = $isRangeSelection(selection)\n ? selection.extract()\n : payload === null\n ? []\n : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n children.forEach((child) => {\n parent.insertBefore(child)\n })\n\n parent.remove()\n }\n })\n\n return\n }\n // Add or merge LinkNodes\n if (nodes?.length === 1) {\n const firstNode = nodes[0]!\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n linkNode.append(...children)\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null) {\n parent = parent.getParent()\n if (parent === null || predicate(parent)) {\n break\n }\n }\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n", "import type { ElementNode, LexicalNode, LexicalUpdateJSON, RangeSelection } from 'lexical'\n\nimport { $applyNodeReplacement, $isElementNode } from 'lexical'\n\nimport type { LinkFields, SerializedAutoLinkNode } from './types.js'\n\nimport { LinkNode } from './LinkNode.js'\n\n// Custom node type to override `canInsertTextAfter` that will\n// allow typing within the link\n\nexport class AutoLinkNode extends LinkNode {\n static override clone(node: AutoLinkNode): AutoLinkNode {\n return new this({ id: '', fields: node.__fields, key: node.__key })\n }\n\n static override getType(): string {\n return 'autolink'\n }\n\n static override importDOM(): null {\n // TODO: Should link node should handle the import over autolink?\n return null\n }\n\n static override importJSON(serializedNode: SerializedAutoLinkNode): AutoLinkNode {\n const node = $createAutoLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n return node\n }\n\n // @ts-expect-error\n exportJSON(): SerializedAutoLinkNode {\n const serialized = super.exportJSON()\n return {\n type: 'autolink',\n children: serialized.children,\n direction: serialized.direction,\n fields: serialized.fields,\n format: serialized.format,\n indent: serialized.indent,\n version: 2,\n }\n }\n\n override insertNewAfter(selection: RangeSelection, restoreSelection = true): ElementNode | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createAutoLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedAutoLinkNode>): this {\n return super.updateFromJSON(serializedNode).setFields(serializedNode.fields)\n }\n}\n\nexport function $createAutoLinkNode({ fields }: { fields?: LinkFields }): AutoLinkNode {\n return $applyNodeReplacement(new AutoLinkNode({ id: '', fields }))\n}\nexport function $isAutoLinkNode(node: LexicalNode | null | undefined): node is AutoLinkNode {\n return node instanceof AutoLinkNode\n}\n", "'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", "'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", "'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", "'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 { formatAdminURL } from 'payload/shared'\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(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\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", "'use client'\nconst VERTICAL_GAP = 10\nconst HORIZONTAL_OFFSET = 5\n\nexport function setFloatingElemPositionForLinkEditor(\n targetRect: DOMRect | null,\n floatingElem: HTMLElement,\n anchorElem: HTMLElement,\n verticalGap: number = VERTICAL_GAP,\n horizontalOffset: number = HORIZONTAL_OFFSET,\n): void {\n const scrollerElem = anchorElem.parentElement\n\n if (targetRect === null || scrollerElem == null) {\n floatingElem.style.opacity = '0'\n floatingElem.style.transform = 'translate(-10000px, -10000px)'\n return\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect()\n const anchorElementRect = anchorElem.getBoundingClientRect()\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\n\n let top = targetRect.top - verticalGap\n let left = targetRect.left - horizontalOffset\n\n if (top < editorScrollerRect.top) {\n top += floatingElemRect.height + targetRect.height + verticalGap * 2\n }\n\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n }\n\n top -= anchorElementRect.top\n left -= anchorElementRect.left\n\n floatingElem.style.opacity = '1'\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { LinkPayload } from '../types.js'\n\nexport const TOGGLE_LINK_WITH_MODAL_COMMAND: LexicalCommand<LinkPayload | null> = createCommand(\n 'TOGGLE_LINK_WITH_MODAL_COMMAND',\n)\n", "'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n PASTE_COMMAND,\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'\nimport type { LinkPayload } from '../floatingLinkEditor/types.js'\n\nimport { validateUrl } from '../../../../../lexical/utils/url.js'\nimport { $toggleLink, LinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\n\nexport const LinkPlugin: PluginComponent<ClientProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!editor.hasNodes([LinkNode])) {\n throw new Error('LinkPlugin: LinkNode not registered on editor')\n }\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: LinkPayload) => {\n if (payload === null) {\n $toggleLink(null)\n return true\n }\n if (!payload.fields?.linkType) {\n payload.fields.linkType = clientProps.defaultLinkType as any\n }\n if (!payload.fields?.url) {\n payload.fields.url = clientProps.defaultLinkURL as any\n }\n $toggleLink(payload as { fields: LinkFields } & LinkPayload)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const selection = $getSelection()\n if (\n !$isRangeSelection(selection) ||\n selection.isCollapsed() ||\n !(event instanceof ClipboardEvent) ||\n event.clipboardData == null\n ) {\n return false\n }\n const clipboardText = event.clipboardData.getData('text')\n if (!validateUrl(clipboardText)) {\n return false\n }\n // If we select nodes that are elements then avoid applying the link.\n if (!selection.getNodes().some((node) => $isElementNode(node))) {\n const linkFields: LinkFields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: clipboardText,\n }\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: linkFields,\n text: null,\n })\n event.preventDefault()\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [clientProps.defaultLinkType, clientProps.defaultLinkURL, editor])\n\n return null\n}\n", "export function sanitizeUrl(url: string): string {\n /** A pattern that matches safe URLs. */\n const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi\n\n /** A pattern that matches safe data URLs. */\n const DATA_URL_PATTERN =\n /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z\\d+/]+=*$/i\n\n url = String(url).trim()\n\n if (url.match(SAFE_URL_PATTERN) != null || url.match(DATA_URL_PATTERN) != null) {\n return url\n }\n\n return 'https://'\n}\n\n/**\n * This regex checks for absolute URLs in a string. Tested for the following use cases:\n * - http://example.com\n * - https://example.com\n * - ftp://files.example.com\n * - http://example.com/resource\n * - https://example.com/resource?key=value\n * - http://example.com/resource#anchor\n * - http://www.example.com\n * - https://sub.example.com/path/file\n * - mailto:\n */\nexport const absoluteRegExp =\n /^(?:[a-zA-Z][a-zA-Z\\d+.-]*:(?:\\/\\/)?(?:[-;:&=+$,\\w]+@)?[A-Za-z\\d]+(?:\\.[A-Za-z\\d]+)+|www\\.[A-Za-z\\d]+(?:\\.[A-Za-z\\d]+)+|(?:tel|mailto):[\\w+.-]+)(?:\\/[+~%/\\w-]*)?(?:\\?[-;&=%\\w]*)?(?:#\\w+)?$/\n\n/**\n * This regex checks for relative URLs starting with / or anchor links starting with # in a string. Tested for the following use cases:\n * - /privacy-policy\n * - /privacy-policy#primary-terms\n * - #primary-terms\n * - /page?id=123\n * - /page?id=123#section\n * */\nexport const relativeOrAnchorRegExp = /^(?:\\/[\\w\\-./]*(?:\\?[-;&=%\\w]*)?(?:#[\\w-]+)?|#[\\w\\-]+)$/\n\n/**\n * Prevents unreasonable URLs from being inserted into the editor.\n * @param url\n */\nexport function validateUrlMinimal(url: string): boolean {\n if (!url) {\n return false\n }\n\n return !url.includes(' ')\n}\n\n// Do not keep validateUrl function too loose. This is run when pasting in text, to determine if links are in that text and if it should create AutoLinkNodes.\n// This is why we do not allow stuff like anchors here, as we don't want copied anchors to be turned into AutoLinkNodes.\nexport function validateUrl(url: string): boolean {\n // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://.\n // Maybe show a dialog where they user can type the URL before inserting it.\n if (!url) {\n return false\n }\n\n // Reject URLs with spaces\n if (url.includes(' ')) {\n return false\n }\n\n // Reject malformed protocol URLs (e.g., http:/example.com instead of http://example.com)\n if (/^[a-z][a-z\\d+.-]*:\\/[^/]/i.test(url)) {\n return false\n }\n\n if (url === 'https://') {\n return true\n }\n\n // This makes sure URLs starting with www. instead of https are valid too\n if (absoluteRegExp.test(url)) {\n return true\n }\n\n // Check relative or anchor links\n if (relativeOrAnchorRegExp.test(url)) {\n return true\n }\n\n // While this doesn't allow URLs starting with www (which is why we use the regex above), it does properly handle tel: URLs\n try {\n const urlObj = new URL(url)\n // For http/https/ftp protocols, require a proper domain with at least one dot (for TLD)\n if (['ftp:', 'http:', 'https:'].includes(urlObj.protocol)) {\n if (!urlObj.hostname.includes('.')) {\n return false\n }\n }\n return true\n } catch {\n /* empty */\n }\n\n return false\n}\n", "'use client'\nimport { $isListNode, INSERT_CHECK_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\nimport type { ClientFeature } from '../../../typesClient.js'\n\nimport { ChecklistIcon } from '../../../../lexical/ui/icons/Checklist/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { shouldRegisterListBaseNodes } from '../../shared/shouldRegisterListBaseNodes.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { CHECK_LIST } from '../markdownTransformers.js'\nimport { LexicalCheckListPlugin } from './plugin/index.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: ChecklistIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'check') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'check') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'check') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'checklist',\n label: ({ i18n }) => {\n return i18n.t('lexical:checklist:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n },\n order: 12,\n },\n ]),\n]\n\nexport const ChecklistFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const plugins: ClientFeature<undefined>['plugins'] = [\n {\n Component: LexicalCheckListPlugin,\n position: 'normal',\n },\n ]\n\n const shouldRegister = shouldRegisterListBaseNodes('checklist', featureProviderMap)\n if (shouldRegister) {\n plugins.push({\n Component: LexicalListPlugin,\n position: 'normal',\n })\n }\n\n return {\n markdownTransformers: [CHECK_LIST],\n nodes: shouldRegister ? [ListNode, ListItemNode] : [],\n plugins,\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: ChecklistIcon,\n key: 'checklist',\n keywords: ['check list', 'check', 'checklist', 'cl'],\n label: ({ i18n }) => {\n return i18n.t('lexical:checklist:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const ChecklistIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"13\" rx=\"1.5\" stroke=\"currentColor\" width=\"13\" x=\"3.5\" y=\"3.5\" />\n <path d=\"M7 10L9 12.5L13 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport type {\n SerializedListItemNode as _SerializedListItemNode,\n SerializedListNode as _SerializedListNode,\n} from '@lexical/list'\nimport type { SerializedLexicalNode } from 'lexical'\n\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin.js'\nimport React from 'react'\n\nimport type { StronglyTypedElementNode } from '../../../nodeTypes.js'\nimport type { PluginComponent } from '../../typesClient.js'\n\nexport type SerializedListItemNode<T extends SerializedLexicalNode = SerializedLexicalNode> = {\n checked?: boolean\n} & StronglyTypedElementNode<_SerializedListItemNode, 'listitem', T>\n\nexport type SerializedListNode<T extends SerializedLexicalNode = SerializedLexicalNode> = {\n checked?: boolean\n} & StronglyTypedElementNode<_SerializedListNode, 'list', T>\n\nexport const LexicalListPlugin: PluginComponent<undefined> = () => {\n return <ListPlugin />\n}\n", "// Priority order: unordered > ordered > checklist.\n// That's why we don't include unordered among the parameter options. It registers by default.\nexport function shouldRegisterListBaseNodes(\n type: 'checklist' | 'ordered',\n featureProviderMap: Map<string, unknown>,\n) {\n if (type === 'ordered') {\n // OrderedList only registers if UnorderedList is NOT present\n return !featureProviderMap.has('unorderedList')\n }\n\n if (type === 'checklist') {\n // Checklist only registers if neither UnorderedList nor OrderedList are present\n return !featureProviderMap.has('unorderedList') && !featureProviderMap.has('orderedList')\n }\n\n return false\n}\n", "import type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\n\nexport function slashMenuListGroupWithItems(items: SlashMenuItem[]): SlashMenuGroup {\n return {\n items,\n key: 'lists',\n label: ({ i18n }) => {\n return i18n.t('lexical:general:slashMenuListGroupLabel')\n },\n }\n}\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const CHECK_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)(?:-\\s)?\\s?(\\[(\\s|x)?\\])\\s/i,\n replace: listReplace('check'),\n}\n", "// Copied from https://github.com/facebook/lexical/blob/176b8cf16ecb332ee5efe2c75219e223b7b019f2/packages/lexical-markdown/src/MarkdownTransformers.ts#L97C1-L172C1\n\nimport type { ListNode, ListType } from '@lexical/list'\nimport type { ElementNode } from 'lexical'\n\nimport { $createListItemNode, $createListNode, $isListItemNode, $isListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\n// Amount of spaces that define indentation level\nconst LIST_INDENT_SIZE = 4\n\nexport const listReplace = (listType: ListType): ElementTransformer['replace'] => {\n return (parentNode, children, match) => {\n const previousNode = parentNode.getPreviousSibling()\n const nextNode = parentNode.getNextSibling()\n const listItem = $createListItemNode(listType === 'check' ? match[3] === 'x' : undefined)\n if ($isListNode(nextNode) && nextNode.getListType() === listType) {\n const firstChild = nextNode.getFirstChild()\n if (firstChild !== null) {\n firstChild.insertBefore(listItem)\n } else {\n // should never happen, but let's handle gracefully, just in case.\n nextNode.append(listItem)\n }\n parentNode.remove()\n } else if ($isListNode(previousNode) && previousNode.getListType() === listType) {\n previousNode.append(listItem)\n parentNode.remove()\n } else {\n const list = $createListNode(listType, listType === 'number' ? Number(match[2]) : undefined)\n list.append(listItem)\n parentNode.replace(list)\n }\n listItem.append(...children)\n listItem.select(0, 0)\n const indent = Math.floor(match[1]!.length / LIST_INDENT_SIZE)\n if (indent) {\n listItem.setIndent(indent)\n }\n }\n}\n\nexport const listExport = (\n listNode: ListNode,\n exportChildren: (node: ElementNode) => string,\n depth: number,\n): string => {\n const output: string[] = []\n const children = listNode.getChildren()\n let index = 0\n for (const listItemNode of children) {\n if ($isListItemNode(listItemNode)) {\n if (listItemNode.getChildrenSize() === 1) {\n const firstChild = listItemNode.getFirstChild()\n if ($isListNode(firstChild)) {\n output.push(listExport(firstChild, exportChildren, depth + 1))\n continue\n }\n }\n const indent = ' '.repeat(depth * LIST_INDENT_SIZE)\n const listType = listNode.getListType()\n const prefix =\n listType === 'number'\n ? `${listNode.getStart() + index}. `\n : listType === 'check'\n ? `- [${listItemNode.getChecked() ? 'x' : ' '}] `\n : '- '\n output.push(indent + prefix + exportChildren(listItemNode))\n index++\n }\n }\n\n return output.join('\\n')\n}\n", "'use client'\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin.js'\nimport React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nexport const LexicalCheckListPlugin: PluginComponent<undefined> = () => {\n return <CheckListPlugin />\n}\n", "'use client'\nimport { $isListNode, INSERT_ORDERED_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\n\nimport { OrderedListIcon } from '../../../../lexical/ui/icons/OrderedList/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { shouldRegisterListBaseNodes } from '../../shared/shouldRegisterListBaseNodes.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { ORDERED_LIST } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: OrderedListIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'number') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'number') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'number') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'orderedList',\n label: ({ i18n }) => {\n return i18n.t('lexical:orderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n },\n order: 10,\n },\n ]),\n]\n\nexport const OrderedListFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const shouldRegister = shouldRegisterListBaseNodes('ordered', featureProviderMap)\n return {\n markdownTransformers: [ORDERED_LIST],\n nodes: shouldRegister ? [ListNode, ListItemNode] : [],\n plugins: shouldRegister\n ? [\n {\n Component: LexicalListPlugin,\n position: 'normal',\n },\n ]\n : [],\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: OrderedListIcon,\n key: 'orderedList',\n keywords: ['ordered list', 'ol'],\n label: ({ i18n }) => {\n return i18n.t('lexical:orderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const OrderedListIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.89284 12.479C5.89284 13.368 5.26284 13.788 4.38084 14.236C3.75084 14.558 3.43584 14.789 3.40784 15.062H5.89984V16H2.06384V15.573C2.06384 14.523 2.92484 13.935 3.66684 13.501C4.38084 13.088 4.75184 12.878 4.75184 12.458C4.75184 12.08 4.52084 11.835 4.06584 11.835C3.58984 11.835 3.30984 12.199 3.28184 12.654H2.11284C2.18984 11.681 2.87584 10.918 4.07284 10.918C5.15784 10.918 5.89284 11.555 5.89284 12.479Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M2.68608 4.535V3.737C3.54008 3.737 3.90408 3.513 4.02308 2.995H4.89108V8H3.68008L3.68008 4.535H2.68608Z\"\n fill=\"currentColor\"\n />\n <path d=\"M8 15L17 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 10L17 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 5L17 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const ORDERED_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)(\\d+)\\.\\s/,\n replace: listReplace('number'),\n}\n", "'use client'\n\nimport { $isListNode, INSERT_UNORDERED_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\n\nimport { UnorderedListIcon } from '../../../../lexical/ui/icons/UnorderedList/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { UNORDERED_LIST } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: UnorderedListIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'bullet') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'bullet') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'bullet') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'unorderedList',\n label: ({ i18n }) => {\n return i18n.t('lexical:unorderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n },\n order: 11,\n },\n ]),\n]\n\nexport const UnorderedListFeatureClient = createClientFeature({\n markdownTransformers: [UNORDERED_LIST],\n nodes: [ListNode, ListItemNode],\n plugins: [\n {\n Component: LexicalListPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: UnorderedListIcon,\n key: 'unorderedList',\n keywords: ['unordered list', 'ul'],\n label: ({ i18n }) => {\n return i18n.t('lexical:unorderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UnorderedListIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"5\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <circle cx=\"4\" cy=\"10\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <circle cx=\"4\" cy=\"15\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <path d=\"M17 5H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17 15H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const UNORDERED_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)[-*+]\\s/,\n replace: listReplace('bullet'),\n}\n", "import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { UnknownConvertedNode } from './nodes/unknownConvertedNode/index.js'\n\nexport const LexicalPluginToLexicalFeatureClient = createClientFeature(() => {\n return {\n nodes: [UnknownConvertedNode],\n }\n})\n", "import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { UnknownConvertedNode } from './nodes/unknownConvertedNode/index.js'\n\nexport const SlateToLexicalFeatureClient = createClientFeature(() => {\n return {\n nodes: [UnknownConvertedNode],\n }\n})\n", "'use client'\n\nimport { $setBlocksType } from '@lexical/selection'\nimport { $createParagraphNode, $getSelection, $isParagraphNode, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { TextIcon } from '../../../lexical/ui/icons/Text/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: TextIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isParagraphNode(node) && !$isParagraphNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'paragraph',\n label: ({ i18n }) => {\n return i18n.t('lexical:paragraph:label2')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createParagraphNode())\n })\n },\n order: 1,\n },\n ]),\n]\n\nexport const ParagraphFeatureClient = createClientFeature({\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: TextIcon,\n key: 'paragraph',\n keywords: ['normal', 'paragraph', 'p', 'text'],\n label: ({ i18n }) => {\n return i18n.t('lexical:paragraph:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createParagraphNode())\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n", "import type { SerializedEditorState } from 'lexical'\n\nimport React from 'react'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\nimport type { JSXConverters } from '../converter/types.js'\n\nimport { defaultJSXConverters } from '../converter/defaultConverters.js'\nimport { convertLexicalToJSX } from '../converter/index.js'\n\nexport type JSXConvertersFunction<\n T extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string }>\n | SerializedInlineBlockNode<{ blockName?: null | string }>,\n> = (args: { defaultConverters: JSXConverters<DefaultNodeTypes> }) => JSXConverters<T>\n\ntype RichTextProps = {\n /**\n * Override class names for the container.\n */\n className?: string\n /**\n * Custom converters to transform your nodes to JSX. Can be an object or a function that receives the default converters.\n */\n converters?: JSXConverters | JSXConvertersFunction\n /**\n * Serialized editor state to render.\n */\n data: SerializedEditorState\n /**\n * If true, removes the container div wrapper.\n */\n disableContainer?: boolean\n /**\n * If true, disables indentation globally. If an array, disables for specific node `type` values.\n */\n disableIndent?: boolean | string[]\n /**\n * If true, disables text alignment globally. If an array, disables for specific node `type` values.\n */\n disableTextAlign?: boolean | string[]\n}\n\nexport const RichText: React.FC<RichTextProps> = ({\n className,\n converters,\n data: editorState,\n disableContainer,\n disableIndent,\n disableTextAlign,\n}) => {\n if (!editorState) {\n return null\n }\n\n let finalConverters: JSXConverters = {}\n if (converters) {\n if (typeof converters === 'function') {\n finalConverters = converters({ defaultConverters: defaultJSXConverters })\n } else {\n finalConverters = converters\n }\n } else {\n finalConverters = defaultJSXConverters\n }\n\n const content =\n editorState &&\n !Array.isArray(editorState) &&\n typeof editorState === 'object' &&\n 'root' in editorState &&\n convertLexicalToJSX({\n converters: finalConverters,\n data: editorState,\n disableIndent,\n disableTextAlign,\n })\n\n if (disableContainer) {\n return <>{content}</>\n }\n\n return <div className={className ?? 'payload-richtext'}>{content}</div>\n}\n", "import type { SerializedQuoteNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const BlockquoteJSXConverter: JSXConverters<SerializedQuoteNode> = {\n quote: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n return <blockquote>{children}</blockquote>\n },\n}\n", "import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const HeadingJSXConverter: JSXConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag>{children}</NodeTag>\n },\n}\n", "import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\nexport const HorizontalRuleJSXConverter: JSXConverters<SerializedHorizontalRuleNode> = {\n horizontalrule: <hr />,\n}\n", "import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const LinebreakJSXConverter: JSXConverters<SerializedLineBreakNode> = {\n linebreak: <br />,\n}\n", "import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const LinkJSXConverter: (args: {\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n}) => JSXConverters<SerializedAutoLinkNode | SerializedLinkNode> = ({ internalDocToHref }) => ({\n autolink: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined\n const target: string | undefined = node.fields.newTab ? '_blank' : undefined\n\n return (\n <a href={node.fields.url} {...{ rel, target }}>\n {children}\n </a>\n )\n },\n link: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined\n const target: string | undefined = node.fields.newTab ? '_blank' : undefined\n\n let href: string = node.fields.url ?? ''\n if (node.fields.linkType === 'internal') {\n if (internalDocToHref) {\n href = internalDocToHref({ linkNode: node })\n } else {\n console.error(\n 'Lexical => JSX converter: Link converter: found internal link, but internalDocToHref is not provided',\n )\n href = '#' // fallback\n }\n }\n\n return (\n <a href={href} {...{ rel, target }}>\n {children}\n </a>\n )\n },\n})\n", "import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const ListJSXConverter: JSXConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag className={`list-${node?.listType}`}>{children}</NodeTag>\n },\n listitem: ({ node, nodesToJSX, parent }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n\n return (\n <li\n aria-checked={node.checked ? 'true' : 'false'}\n className={`list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}`}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n role=\"checkbox\"\n style={{ listStyleType: 'none' }}\n tabIndex={-1}\n value={node?.value}\n >\n {hasSubLists ? (\n children\n ) : (\n <>\n <input checked={node.checked} id={uuid} readOnly={true} type=\"checkbox\" />\n <label htmlFor={uuid}>{children}</label>\n <br />\n </>\n )}\n </li>\n )\n } else {\n return (\n <li\n className={`${hasSubLists ? 'nestedListItem' : ''}`}\n style={hasSubLists ? { listStyleType: 'none' } : undefined}\n value={node?.value}\n >\n {children}\n </li>\n )\n }\n },\n}\n", "import type { SerializedParagraphNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const ParagraphJSXConverter: JSXConverters<SerializedParagraphNode> = {\n paragraph: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if (!children?.length) {\n return (\n <p>\n <br />\n </p>\n )\n }\n\n return <p>{children}</p>\n },\n}\n", "import type { SerializedTabNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const TabJSXConverter: JSXConverters<SerializedTabNode> = {\n tab: '\\t',\n}\n", "import type {\n SerializedTableCellNode,\n SerializedTableNode,\n SerializedTableRowNode,\n} from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const TableJSXConverter: JSXConverters<\n SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode\n> = {\n table: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n return (\n <div className=\"lexical-table-container\">\n <table className=\"lexical-table\" style={{ borderCollapse: 'collapse' }}>\n <tbody>{children}</tbody>\n </table>\n </div>\n )\n },\n tablecell: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const TagName = node.headerState > 0 ? 'th' : 'td' // Use capital letter to denote a component\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const style = {\n backgroundColor: node.backgroundColor || undefined, // Use undefined to avoid setting the style property if not needed\n border: '1px solid #ccc',\n padding: '8px',\n }\n\n // Note: JSX does not support setting attributes directly as strings, so you must convert the colSpan and rowSpan to numbers\n const colSpan = node.colSpan && node.colSpan > 1 ? node.colSpan : undefined\n const rowSpan = node.rowSpan && node.rowSpan > 1 ? node.rowSpan : undefined\n\n return (\n <TagName\n className={`lexical-table-cell ${headerStateClass}`}\n colSpan={colSpan} // colSpan and rowSpan will only be added if they are not null\n rowSpan={rowSpan}\n style={style}\n >\n {children}\n </TagName>\n )\n },\n tablerow: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n return <tr className=\"lexical-table-row\">{children}</tr>\n },\n}\n", "import React from 'react'\n\nimport type { SerializedTextNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nimport { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js'\n\nexport const TextJSXConverter: JSXConverters<SerializedTextNode> = {\n text: ({ node }) => {\n let text: React.ReactNode = node.text\n\n if (node.format & NodeFormat.IS_BOLD) {\n text = <strong>{text}</strong>\n }\n if (node.format & NodeFormat.IS_ITALIC) {\n text = <em>{text}</em>\n }\n if (node.format & NodeFormat.IS_STRIKETHROUGH) {\n text = <span style={{ textDecoration: 'line-through' }}>{text}</span>\n }\n if (node.format & NodeFormat.IS_UNDERLINE) {\n text = <span style={{ textDecoration: 'underline' }}>{text}</span>\n }\n if (node.format & NodeFormat.IS_CODE) {\n text = <code>{text}</code>\n }\n if (node.format & NodeFormat.IS_SUBSCRIPT) {\n text = <sub>{text}</sub>\n }\n if (node.format & NodeFormat.IS_SUPERSCRIPT) {\n text = <sup>{text}</sup>\n }\n\n return text\n },\n}\n", "/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable regexp/no-obscure-range */\n/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\n/* eslint-disable regexp/no-misleading-unicode-character */\n//This copy-and-pasted from lexical here: https://github.com/facebook/lexical/blob/c2ceee223f46543d12c574e62155e619f9a18a5d/packages/lexical/src/LexicalConstants.ts\n\nimport type { ElementFormatType, TextFormatType, TextModeType } from 'lexical'\nexport type TextDetailType = 'directionless' | 'unmergable'\n\n// DOM\nexport const NodeFormat = {\n DOM_ELEMENT_TYPE: 1,\n DOM_TEXT_TYPE: 3,\n // Reconciling\n NO_DIRTY_NODES: 0,\n HAS_DIRTY_NODES: 1,\n FULL_RECONCILE: 2,\n // Text node modes\n IS_NORMAL: 0,\n IS_TOKEN: 1,\n IS_SEGMENTED: 2,\n IS_INERT: 3,\n // Text node formatting\n IS_BOLD: 1,\n IS_ITALIC: 1 << 1,\n IS_STRIKETHROUGH: 1 << 2,\n IS_UNDERLINE: 1 << 3,\n IS_CODE: 1 << 4,\n IS_SUBSCRIPT: 1 << 5,\n IS_SUPERSCRIPT: 1 << 6,\n IS_HIGHLIGHT: 1 << 7,\n // Text node details\n IS_DIRECTIONLESS: 1,\n IS_UNMERGEABLE: 1 << 1,\n // Element node formatting\n IS_ALIGN_LEFT: 1,\n IS_ALIGN_CENTER: 2,\n IS_ALIGN_RIGHT: 3,\n IS_ALIGN_JUSTIFY: 4,\n IS_ALIGN_START: 5,\n IS_ALIGN_END: 6,\n} as const\n\nexport const IS_ALL_FORMATTING =\n NodeFormat.IS_BOLD |\n NodeFormat.IS_ITALIC |\n NodeFormat.IS_STRIKETHROUGH |\n NodeFormat.IS_UNDERLINE |\n NodeFormat.IS_CODE |\n NodeFormat.IS_SUBSCRIPT |\n NodeFormat.IS_SUPERSCRIPT |\n NodeFormat.IS_HIGHLIGHT\n\n// Reconciliation\nexport const NON_BREAKING_SPACE = '\\u00A0'\n\nexport const DOUBLE_LINE_BREAK = '\\n\\n'\n\n// For FF, we need to use a non-breaking space, or it gets composition\n// in a stuck state.\n\nconst RTL = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC'\nconst LTR =\n 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6' +\n '\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\\u200E\\u2C00-\\uFB1C' +\n '\\uFE00-\\uFE6F\\uFEFD-\\uFFFF'\n\n// eslint-disable-next-line no-misleading-character-class\nexport const RTL_REGEX = new RegExp('^[^' + LTR + ']*[' + RTL + ']')\n// eslint-disable-next-line no-misleading-character-class\nexport const LTR_REGEX = new RegExp('^[^' + RTL + ']*[' + LTR + ']')\n\nexport const TEXT_TYPE_TO_FORMAT: Record<string | TextFormatType, number> = {\n bold: NodeFormat.IS_BOLD,\n code: NodeFormat.IS_CODE,\n highlight: NodeFormat.IS_HIGHLIGHT,\n italic: NodeFormat.IS_ITALIC,\n strikethrough: NodeFormat.IS_STRIKETHROUGH,\n subscript: NodeFormat.IS_SUBSCRIPT,\n superscript: NodeFormat.IS_SUPERSCRIPT,\n underline: NodeFormat.IS_UNDERLINE,\n}\n\nexport const DETAIL_TYPE_TO_DETAIL: Record<string | TextDetailType, number> = {\n directionless: NodeFormat.IS_DIRECTIONLESS,\n unmergeable: NodeFormat.IS_UNMERGEABLE,\n}\n\nexport const ELEMENT_TYPE_TO_FORMAT: Record<Exclude<ElementFormatType, ''>, number> = {\n center: NodeFormat.IS_ALIGN_CENTER,\n end: NodeFormat.IS_ALIGN_END,\n justify: NodeFormat.IS_ALIGN_JUSTIFY,\n left: NodeFormat.IS_ALIGN_LEFT,\n right: NodeFormat.IS_ALIGN_RIGHT,\n start: NodeFormat.IS_ALIGN_START,\n}\n\nexport const ELEMENT_FORMAT_TO_TYPE: Record<number, ElementFormatType> = {\n [NodeFormat.IS_ALIGN_CENTER]: 'center',\n [NodeFormat.IS_ALIGN_END]: 'end',\n [NodeFormat.IS_ALIGN_JUSTIFY]: 'justify',\n [NodeFormat.IS_ALIGN_LEFT]: 'left',\n [NodeFormat.IS_ALIGN_RIGHT]: 'right',\n [NodeFormat.IS_ALIGN_START]: 'start',\n}\n\nexport const TEXT_MODE_TO_TYPE: Record<TextModeType, 0 | 1 | 2> = {\n normal: NodeFormat.IS_NORMAL,\n segmented: NodeFormat.IS_SEGMENTED,\n token: NodeFormat.IS_TOKEN,\n}\n\nexport const TEXT_TYPE_TO_MODE: Record<number, TextModeType> = {\n [NodeFormat.IS_NORMAL]: 'normal',\n [NodeFormat.IS_SEGMENTED]: 'segmented',\n [NodeFormat.IS_TOKEN]: 'token',\n}\n", "import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const UploadJSXConverter: JSXConverters<SerializedUploadNode> = {\n upload: ({ node }) => {\n // TO-DO (v4): SerializedUploadNode should use UploadData_P4\n const uploadNode = node as UploadDataImproved\n if (typeof uploadNode.value !== 'object') {\n return null\n }\n\n const uploadDoc = uploadNode.value as FileData & TypeWithID\n\n const alt = (uploadNode.fields?.alt as string) || (uploadDoc as { alt?: string })?.alt || ''\n\n const url = uploadDoc.url\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDoc.mimeType.startsWith('image')) {\n return (\n <a href={url} rel=\"noopener noreferrer\">\n {uploadDoc.filename}\n </a>\n )\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return <img alt={alt} height={uploadDoc.height} src={url} width={uploadDoc.width} />\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n const pictureJSX: React.ReactNode[] = []\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n // Skip if any property of the size object is null\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = imageSize?.url\n\n pictureJSX.push(\n <source\n key={size}\n media={`(max-width: ${imageSize.width}px)`}\n srcSet={imageSizeURL}\n type={imageSize.mimeType}\n />,\n )\n }\n\n // Add the default img tag\n pictureJSX.push(\n <img alt={alt} height={uploadDoc?.height} key={'image'} src={url} width={uploadDoc?.width} />,\n )\n return <picture>{pictureJSX}</picture>\n },\n}\n", "import type { DefaultNodeTypes } from '../../../../nodeTypes.js'\nimport type { JSXConverters } from './types.js'\n\nimport { BlockquoteJSXConverter } from './converters/blockquote.js'\nimport { HeadingJSXConverter } from './converters/heading.js'\nimport { HorizontalRuleJSXConverter } from './converters/horizontalRule.js'\nimport { LinebreakJSXConverter } from './converters/linebreak.js'\nimport { LinkJSXConverter } from './converters/link.js'\nimport { ListJSXConverter } from './converters/list.js'\nimport { ParagraphJSXConverter } from './converters/paragraph.js'\nimport { TabJSXConverter } from './converters/tab.js'\nimport { TableJSXConverter } from './converters/table.js'\nimport { TextJSXConverter } from './converters/text.js'\nimport { UploadJSXConverter } from './converters/upload.js'\n\nexport const defaultJSXConverters: JSXConverters<DefaultNodeTypes> = {\n ...ParagraphJSXConverter,\n ...TextJSXConverter,\n ...LinebreakJSXConverter,\n ...BlockquoteJSXConverter,\n ...TableJSXConverter,\n ...HeadingJSXConverter,\n ...HorizontalRuleJSXConverter,\n ...ListJSXConverter,\n ...LinkJSXConverter({}),\n ...UploadJSXConverter,\n ...TabJSXConverter,\n}\n", "/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\nexport type ConvertLexicalToJSXArgs = {\n converters: JSXConverters\n data: SerializedEditorState\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n}\n\nexport function convertLexicalToJSX({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n}: ConvertLexicalToJSXArgs): React.ReactNode {\n if (hasText(data)) {\n return convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes: data?.root?.children,\n parent: data?.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n", "import type {\n SerializedEditorState,\n SerializedLexicalNode,\n SerializedParagraphNode,\n SerializedTextNode,\n} from 'lexical'\n\nexport function hasText(\n value: null | SerializedEditorState<SerializedLexicalNode> | undefined,\n): boolean {\n const hasChildren = !!value?.root?.children?.length\n\n let hasOnlyEmptyParagraph = false\n if (value?.root?.children?.length === 1) {\n if (value?.root?.children[0]?.type === 'paragraph') {\n const paragraphNode = value?.root?.children[0] as SerializedParagraphNode\n\n if (!paragraphNode?.children || paragraphNode?.children?.length === 0) {\n hasOnlyEmptyParagraph = true\n } else if (paragraphNode?.children?.length === 1) {\n const paragraphNodeChild = paragraphNode?.children[0]\n if (paragraphNodeChild?.type === 'text') {\n if (!(paragraphNodeChild as SerializedTextNode | undefined)?.['text']?.length) {\n hasOnlyEmptyParagraph = true\n }\n }\n }\n }\n }\n\n if (!hasChildren || hasOnlyEmptyParagraph) {\n return false\n } else {\n return true\n }\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { RichTextPlugin } from './plugin/index.js'\n\nexport const DebugJsxConverterFeatureClient = createClientFeature({\n plugins: [\n {\n Component: RichTextPlugin,\n position: 'bottom',\n },\n ],\n})\n", "import type { StateValues } from './feature.server.js'\n\nconst tailwindColors = {\n amber: {\n '50': 'oklch(0.987 0.022 95.277)',\n '100': 'oklch(0.962 0.059 95.617)',\n '200': 'oklch(0.924 0.12 95.746)',\n '300': 'oklch(0.879 0.169 91.605)',\n '400': 'oklch(0.828 0.189 84.429)',\n '500': 'oklch(0.769 0.188 70.08)',\n '600': 'oklch(0.666 0.179 58.318)',\n '700': 'oklch(0.555 0.163 48.998)',\n '800': 'oklch(0.473 0.137 46.201)',\n '900': 'oklch(0.414 0.112 45.904)',\n '950': 'oklch(0.279 0.077 45.635)',\n },\n black: '#000',\n blue: {\n '50': 'oklch(0.97 0.014 254.604)',\n '100': 'oklch(0.932 0.032 255.585)',\n '200': 'oklch(0.882 0.059 254.128)',\n '300': 'oklch(0.809 0.105 251.813)',\n '400': 'oklch(0.707 0.165 254.624)',\n '500': 'oklch(0.623 0.214 259.815)',\n '600': 'oklch(0.546 0.245 262.881)',\n '700': 'oklch(0.488 0.243 264.376)',\n '800': 'oklch(0.424 0.199 265.638)',\n '900': 'oklch(0.379 0.146 265.522)',\n '950': 'oklch(0.282 0.091 267.935)',\n },\n current: 'currentColor',\n cyan: {\n '50': 'oklch(0.984 0.019 200.873)',\n '100': 'oklch(0.956 0.045 203.388)',\n '200': 'oklch(0.917 0.08 205.041)',\n '300': 'oklch(0.865 0.127 207.078)',\n '400': 'oklch(0.789 0.154 211.53)',\n '500': 'oklch(0.715 0.143 215.221)',\n '600': 'oklch(0.609 0.126 221.723)',\n '700': 'oklch(0.52 0.105 223.128)',\n '800': 'oklch(0.45 0.085 224.283)',\n '900': 'oklch(0.398 0.07 227.392)',\n '950': 'oklch(0.302 0.056 229.695)',\n },\n emerald: {\n '50': 'oklch(0.979 0.021 166.113)',\n '100': 'oklch(0.95 0.052 163.051)',\n '200': 'oklch(0.905 0.093 164.15)',\n '300': 'oklch(0.845 0.143 164.978)',\n '400': 'oklch(0.765 0.177 163.223)',\n '500': 'oklch(0.696 0.17 162.48)',\n '600': 'oklch(0.596 0.145 163.225)',\n '700': 'oklch(0.508 0.118 165.612)',\n '800': 'oklch(0.432 0.095 166.913)',\n '900': 'oklch(0.378 0.077 168.94)',\n '950': 'oklch(0.262 0.051 172.552)',\n },\n fuchsia: {\n '50': 'oklch(0.977 0.017 320.058)',\n '100': 'oklch(0.952 0.037 318.852)',\n '200': 'oklch(0.903 0.076 319.62)',\n '300': 'oklch(0.833 0.145 321.434)',\n '400': 'oklch(0.74 0.238 322.16)',\n '500': 'oklch(0.667 0.295 322.15)',\n '600': 'oklch(0.591 0.293 322.896)',\n '700': 'oklch(0.518 0.253 323.949)',\n '800': 'oklch(0.452 0.211 324.591)',\n '900': 'oklch(0.401 0.17 325.612)',\n '950': 'oklch(0.293 0.136 325.661)',\n },\n gray: {\n '50': 'oklch(0.985 0.002 247.839)',\n '100': 'oklch(0.967 0.003 264.542)',\n '200': 'oklch(0.928 0.006 264.531)',\n '300': 'oklch(0.872 0.01 258.338)',\n '400': 'oklch(0.707 0.022 261.325)',\n '500': 'oklch(0.551 0.027 264.364)',\n '600': 'oklch(0.446 0.03 256.802)',\n '700': 'oklch(0.373 0.034 259.733)',\n '800': 'oklch(0.278 0.033 256.848)',\n '900': 'oklch(0.21 0.034 264.665)',\n '950': 'oklch(0.13 0.028 261.692)',\n },\n green: {\n '50': 'oklch(0.982 0.018 155.826)',\n '100': 'oklch(0.962 0.044 156.743)',\n '200': 'oklch(0.925 0.084 155.995)',\n '300': 'oklch(0.871 0.15 154.449)',\n '400': 'oklch(0.792 0.209 151.711)',\n '500': 'oklch(0.723 0.219 149.579)',\n '600': 'oklch(0.627 0.194 149.214)',\n '700': 'oklch(0.527 0.154 150.069)',\n '800': 'oklch(0.448 0.119 151.328)',\n '900': 'oklch(0.393 0.095 152.535)',\n '950': 'oklch(0.266 0.065 152.934)',\n },\n indigo: {\n '50': 'oklch(0.962 0.018 272.314)',\n '100': 'oklch(0.93 0.034 272.788)',\n '200': 'oklch(0.87 0.065 274.039)',\n '300': 'oklch(0.785 0.115 274.713)',\n '400': 'oklch(0.673 0.182 276.935)',\n '500': 'oklch(0.585 0.233 277.117)',\n '600': 'oklch(0.511 0.262 276.966)',\n '700': 'oklch(0.457 0.24 277.023)',\n '800': 'oklch(0.398 0.195 277.366)',\n '900': 'oklch(0.359 0.144 278.697)',\n '950': 'oklch(0.257 0.09 281.288)',\n },\n inherit: 'inherit',\n lime: {\n '50': 'oklch(0.986 0.031 120.757)',\n '100': 'oklch(0.967 0.067 122.328)',\n '200': 'oklch(0.938 0.127 124.321)',\n '300': 'oklch(0.897 0.196 126.665)',\n '400': 'oklch(0.841 0.238 128.85)',\n '500': 'oklch(0.768 0.233 130.85)',\n '600': 'oklch(0.648 0.2 131.684)',\n '700': 'oklch(0.532 0.157 131.589)',\n '800': 'oklch(0.453 0.124 130.933)',\n '900': 'oklch(0.405 0.101 131.063)',\n '950': 'oklch(0.274 0.072 132.109)',\n },\n neutral: {\n '50': 'oklch(0.985 0 0)',\n '100': 'oklch(0.97 0 0)',\n '200': 'oklch(0.922 0 0)',\n '300': 'oklch(0.87 0 0)',\n '400': 'oklch(0.708 0 0)',\n '500': 'oklch(0.556 0 0)',\n '600': 'oklch(0.439 0 0)',\n '700': 'oklch(0.371 0 0)',\n '800': 'oklch(0.269 0 0)',\n '900': 'oklch(0.205 0 0)',\n '950': 'oklch(0.145 0 0)',\n },\n orange: {\n '50': 'oklch(0.98 0.016 73.684)',\n '100': 'oklch(0.954 0.038 75.164)',\n '200': 'oklch(0.901 0.076 70.697)',\n '300': 'oklch(0.837 0.128 66.29)',\n '400': 'oklch(0.75 0.183 55.934)',\n '500': 'oklch(0.705 0.213 47.604)',\n '600': 'oklch(0.646 0.222 41.116)',\n '700': 'oklch(0.553 0.195 38.402)',\n '800': 'oklch(0.47 0.157 37.304)',\n '900': 'oklch(0.408 0.123 38.172)',\n '950': 'oklch(0.266 0.079 36.259)',\n },\n pink: {\n '50': 'oklch(0.971 0.014 343.198)',\n '100': 'oklch(0.948 0.028 342.258)',\n '200': 'oklch(0.899 0.061 343.231)',\n '300': 'oklch(0.823 0.12 346.018)',\n '400': 'oklch(0.718 0.202 349.761)',\n '500': 'oklch(0.656 0.241 354.308)',\n '600': 'oklch(0.592 0.249 0.584)',\n '700': 'oklch(0.525 0.223 3.958)',\n '800': 'oklch(0.459 0.187 3.815)',\n '900': 'oklch(0.408 0.153 2.432)',\n '950': 'oklch(0.284 0.109 3.907)',\n },\n purple: {\n '50': 'oklch(0.977 0.014 308.299)',\n '100': 'oklch(0.946 0.033 307.174)',\n '200': 'oklch(0.902 0.063 306.703)',\n '300': 'oklch(0.827 0.119 306.383)',\n '400': 'oklch(0.714 0.203 305.504)',\n '500': 'oklch(0.627 0.265 303.9)',\n '600': 'oklch(0.558 0.288 302.321)',\n '700': 'oklch(0.496 0.265 301.924)',\n '800': 'oklch(0.438 0.218 303.724)',\n '900': 'oklch(0.381 0.176 304.987)',\n '950': 'oklch(0.291 0.149 302.717)',\n },\n red: {\n '50': 'oklch(0.971 0.013 17.38)',\n '100': 'oklch(0.936 0.032 17.717)',\n '200': 'oklch(0.885 0.062 18.334)',\n '300': 'oklch(0.808 0.114 19.571)',\n '400': 'oklch(0.704 0.191 22.216)',\n '500': 'oklch(0.637 0.237 25.331)',\n '600': 'oklch(0.577 0.245 27.325)',\n '700': 'oklch(0.505 0.213 27.518)',\n '800': 'oklch(0.444 0.177 26.899)',\n '900': 'oklch(0.396 0.141 25.723)',\n '950': 'oklch(0.258 0.092 26.042)',\n },\n rose: {\n '50': 'oklch(0.969 0.015 12.422)',\n '100': 'oklch(0.941 0.03 12.58)',\n '200': 'oklch(0.892 0.058 10.001)',\n '300': 'oklch(0.81 0.117 11.638)',\n '400': 'oklch(0.712 0.194 13.428)',\n '500': 'oklch(0.645 0.246 16.439)',\n '600': 'oklch(0.586 0.253 17.585)',\n '700': 'oklch(0.514 0.222 16.935)',\n '800': 'oklch(0.455 0.188 13.697)',\n '900': 'oklch(0.41 0.159 10.272)',\n '950': 'oklch(0.271 0.105 12.094)',\n },\n sky: {\n '50': 'oklch(0.977 0.013 236.62)',\n '100': 'oklch(0.951 0.026 236.824)',\n '200': 'oklch(0.901 0.058 230.902)',\n '300': 'oklch(0.828 0.111 230.318)',\n '400': 'oklch(0.746 0.16 232.661)',\n '500': 'oklch(0.685 0.169 237.323)',\n '600': 'oklch(0.588 0.158 241.966)',\n '700': 'oklch(0.5 0.134 242.749)',\n '800': 'oklch(0.443 0.11 240.79)',\n '900': 'oklch(0.391 0.09 240.876)',\n '950': 'oklch(0.293 0.066 243.157)',\n },\n slate: {\n '50': 'oklch(0.984 0.003 247.858)',\n '100': 'oklch(0.968 0.007 247.896)',\n '200': 'oklch(0.929 0.013 255.508)',\n '300': 'oklch(0.869 0.022 252.894)',\n '400': 'oklch(0.704 0.04 256.788)',\n '500': 'oklch(0.554 0.046 257.417)',\n '600': 'oklch(0.446 0.043 257.281)',\n '700': 'oklch(0.372 0.044 257.287)',\n '800': 'oklch(0.279 0.041 260.031)',\n '900': 'oklch(0.208 0.042 265.755)',\n '950': 'oklch(0.129 0.042 264.695)',\n },\n stone: {\n '50': 'oklch(0.985 0.001 106.423)',\n '100': 'oklch(0.97 0.001 106.424)',\n '200': 'oklch(0.923 0.003 48.717)',\n '300': 'oklch(0.869 0.005 56.366)',\n '400': 'oklch(0.709 0.01 56.259)',\n '500': 'oklch(0.553 0.013 58.071)',\n '600': 'oklch(0.444 0.011 73.639)',\n '700': 'oklch(0.374 0.01 67.558)',\n '800': 'oklch(0.268 0.007 34.298)',\n '900': 'oklch(0.216 0.006 56.043)',\n '950': 'oklch(0.147 0.004 49.25)',\n },\n teal: {\n '50': 'oklch(0.984 0.014 180.72)',\n '100': 'oklch(0.953 0.051 180.801)',\n '200': 'oklch(0.91 0.096 180.426)',\n '300': 'oklch(0.855 0.138 181.071)',\n '400': 'oklch(0.777 0.152 181.912)',\n '500': 'oklch(0.704 0.14 182.503)',\n '600': 'oklch(0.6 0.118 184.704)',\n '700': 'oklch(0.511 0.096 186.391)',\n '800': 'oklch(0.437 0.078 188.216)',\n '900': 'oklch(0.386 0.063 188.416)',\n '950': 'oklch(0.277 0.046 192.524)',\n },\n transparent: 'transparent',\n violet: {\n '50': 'oklch(0.969 0.016 293.756)',\n '100': 'oklch(0.943 0.029 294.588)',\n '200': 'oklch(0.894 0.057 293.283)',\n '300': 'oklch(0.811 0.111 293.571)',\n '400': 'oklch(0.702 0.183 293.541)',\n '500': 'oklch(0.606 0.25 292.717)',\n '600': 'oklch(0.541 0.281 293.009)',\n '700': 'oklch(0.491 0.27 292.581)',\n '800': 'oklch(0.432 0.232 292.759)',\n '900': 'oklch(0.38 0.189 293.745)',\n '950': 'oklch(0.283 0.141 291.089)',\n },\n white: '#fff',\n yellow: {\n '50': 'oklch(0.987 0.026 102.212)',\n '100': 'oklch(0.973 0.071 103.193)',\n '200': 'oklch(0.945 0.129 101.54)',\n '300': 'oklch(0.905 0.182 98.111)',\n '400': 'oklch(0.852 0.199 91.936)',\n '500': 'oklch(0.795 0.184 86.047)',\n '600': 'oklch(0.681 0.162 75.834)',\n '700': 'oklch(0.554 0.135 66.442)',\n '800': 'oklch(0.476 0.114 61.907)',\n '900': 'oklch(0.421 0.095 57.708)',\n '950': 'oklch(0.286 0.066 53.813)',\n },\n zinc: {\n '50': 'oklch(0.985 0 0)',\n '100': 'oklch(0.967 0.001 286.375)',\n '200': 'oklch(0.92 0.004 286.32)',\n '300': 'oklch(0.871 0.006 286.286)',\n '400': 'oklch(0.705 0.015 286.067)',\n '500': 'oklch(0.552 0.016 285.938)',\n '600': 'oklch(0.442 0.017 285.786)',\n '700': 'oklch(0.37 0.013 285.805)',\n '800': 'oklch(0.274 0.006 286.033)',\n '900': 'oklch(0.21 0.006 285.885)',\n '950': 'oklch(0.141 0.005 285.823)',\n },\n}\n\n// prettier-ignore\n/* eslint-disable perfectionist/sort-objects */\nexport const defaultColors = {\n text: {\n 'text-red': { css: { 'color': `light-dark(${tailwindColors.red[600]}, ${tailwindColors.red[400]})`, }, label: 'Red' },\n 'text-orange': { css: { 'color': `light-dark(${tailwindColors.orange[600]}, ${tailwindColors.orange[400]})`, }, label: 'Orange' },\n 'text-yellow': { css: { 'color': `light-dark(${tailwindColors.yellow[700]}, ${tailwindColors.yellow[300]})`, }, label: 'Yellow' },\n 'text-green': { css: { 'color': `light-dark(${tailwindColors.green[700]}, ${tailwindColors.green[400]})`, }, label: 'Green' },\n 'text-blue': { css: { 'color': `light-dark(${tailwindColors.blue[600]}, ${tailwindColors.blue[400]})`, }, label: 'Blue' },\n 'text-purple': { css: { 'color': `light-dark(${tailwindColors.purple[600]}, ${tailwindColors.purple[400]})`, }, label: 'Purple' },\n 'text-pink': { css: { 'color': `light-dark(${tailwindColors.pink[600]}, ${tailwindColors.pink[400]})`, }, label: 'Pink' },\n } satisfies StateValues,\n background: {\n 'bg-red': { css: { 'background-color': `light-dark(${tailwindColors.red[400]}, ${tailwindColors.red[600]})`, }, label: 'Red' },\n 'bg-orange': { css: { 'background-color': `light-dark(${tailwindColors.orange[400]}, ${tailwindColors.orange[600]})`, }, label: 'Orange' },\n 'bg-yellow': { css: { 'background-color': `light-dark(${tailwindColors.yellow[300]}, ${tailwindColors.yellow[700]})`, }, label: 'Yellow' },\n 'bg-green': { css: { 'background-color': `light-dark(${tailwindColors.green[400]}, ${tailwindColors.green[700]})`, }, label: 'Green' },\n 'bg-blue': { css: { 'background-color': `light-dark(${tailwindColors.blue[400]}, ${tailwindColors.blue[600]})`, }, label: 'Blue' },\n 'bg-purple': { css: { 'background-color': `light-dark(${tailwindColors.purple[400]}, ${tailwindColors.purple[600]})`, }, label: 'Purple' },\n 'bg-pink': { css: { 'background-color': `light-dark(${tailwindColors.pink[400]}, ${tailwindColors.pink[600]})`, }, label: 'Pink' },\n } satisfies StateValues\n }\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport type { RelationshipFeatureProps } from '../server/index.js'\n\nimport { RelationshipIcon } from '../../../lexical/ui/icons/Relationship/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND } from './drawer/commands.js'\nimport { $isRelationshipNode, RelationshipNode } from './nodes/RelationshipNode.js'\nimport { RelationshipPlugin } from './plugins/index.js'\n\nexport const RelationshipFeatureClient = createClientFeature<RelationshipFeatureProps>({\n nodes: [RelationshipNode],\n plugins: [\n {\n Component: RelationshipPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: RelationshipIcon,\n key: 'relationship',\n keywords: ['relationship', 'relation', 'rel'],\n label: ({ i18n }) => {\n return i18n.t('lexical:relationship:label')\n },\n onSelect: ({ editor }) => {\n // dispatch INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND\n editor.dispatchCommand(INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: RelationshipIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isRelationshipNode(firstNode)\n },\n key: 'relationship',\n label: ({ i18n }) => {\n return i18n.t('lexical:relationship:label')\n },\n onSelect: ({ editor }) => {\n // dispatch INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND\n editor.dispatchCommand(INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const RelationshipIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_4397_10817)\">\n <path\n d=\"M7.75 12.25L15.25 4.75M15.25 4.75H11.5M15.25 4.75V8.5M13 11.5V13.75C13 14.5784 12.3284 15.25 11.5 15.25H6.25C5.42157 15.25 4.75 14.5784 4.75 13.75V8.5C4.75 7.67157 5.42157 7 6.25 7H8.5\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_4397_10817\">\n <rect fill=\"currentColor\" height=\"12\" transform=\"translate(4 4)\" width=\"12\" />\n </clipPath>\n </defs>\n </svg>\n)\n", "'use client'\nimport type { JSX } from 'react'\n\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type EditorConfig,\n type LexicalEditor,\n type LexicalNode,\n} from 'lexical'\nimport * as React from 'react'\n\nimport type {\n RelationshipData,\n SerializedRelationshipNode,\n} from '../../server/nodes/RelationshipNode.js'\n\nimport { RelationshipServerNode } from '../../server/nodes/RelationshipNode.js'\n\nconst RelationshipComponent = React.lazy(() =>\n import('../components/RelationshipComponent.js').then((module) => ({\n default: module.RelationshipComponent,\n })),\n)\n\nfunction $relationshipElementToNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipNode extends RelationshipServerNode {\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return (\n <RelationshipComponent\n className={config.theme.relationship ?? 'LexicalEditorTheme__relationship'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return super.exportJSON()\n }\n}\n\nexport function $createRelationshipNode(data: RelationshipData): RelationshipNode {\n return $applyNodeReplacement(\n new RelationshipNode({\n data,\n }),\n )\n}\n\nexport function $isRelationshipNode(\n node: LexicalNode | null | RelationshipNode | undefined,\n): node is RelationshipNode {\n return node instanceof RelationshipNode\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { CollectionSlug, DataFromCollectionSlug } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type RelationshipData = {\n [TCollectionSlug in CollectionSlug]: {\n relationTo: TCollectionSlug\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\nexport type SerializedRelationshipNode = RelationshipData &\n StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'relationship'>\n\nfunction $relationshipElementToServerNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createServerRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipServerNode extends DecoratorBlockNode {\n __data: RelationshipData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: RelationshipData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'relationship'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToServerNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createServerRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.relationship)\n return element\n }\n\n override decorate(_editor: LexicalEditor, _config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n element.setAttribute(\n 'data-lexical-relationship-id',\n String(typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value),\n )\n element.setAttribute('data-lexical-relationship-relationTo', this.__data?.relationTo)\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'relationship',\n version: 2,\n }\n }\n\n getData(): RelationshipData {\n return this.getLatest().__data\n }\n\n override getTextContent(): string {\n return `${this.__data?.relationTo} relation to ${typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value}`\n }\n\n setData(data: RelationshipData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n}\n\nexport function $createServerRelationshipNode(data: RelationshipData): RelationshipServerNode {\n return $applyNodeReplacement(\n new RelationshipServerNode({\n data,\n }),\n )\n}\n\nexport function $isServerRelationshipNode(\n node: LexicalNode | null | RelationshipServerNode | undefined,\n): node is RelationshipServerNode {\n return node instanceof RelationshipServerNode\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n createCommand,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { RelationshipFeatureProps } from '../../server/index.js'\nimport type { RelationshipData } from '../../server/nodes/RelationshipNode.js'\n\nimport { RelationshipDrawer } from '../drawer/index.js'\nimport { $createRelationshipNode, RelationshipNode } from '../nodes/RelationshipNode.js'\nimport { useEnabledRelationships } from '../utils/useEnabledRelationships.js'\n\nexport const INSERT_RELATIONSHIP_COMMAND: LexicalCommand<RelationshipData> = createCommand(\n 'INSERT_RELATIONSHIP_COMMAND',\n)\n\nexport const RelationshipPlugin: PluginComponent<RelationshipFeatureProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n collectionSlugsBlacklist: clientProps?.disabledCollections,\n collectionSlugsWhitelist: clientProps?.enabledCollections,\n })\n\n useEffect(() => {\n if (!editor.hasNodes([RelationshipNode])) {\n throw new Error('RelationshipPlugin: RelationshipNode not registered on editor')\n }\n\n return editor.registerCommand<RelationshipData>(\n INSERT_RELATIONSHIP_COMMAND,\n (payload) => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const relationshipNode = $createRelationshipNode(payload)\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert relationship node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(relationshipNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return <RelationshipDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\nimport type { CollectionSlug } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { type ListDrawerProps, toast } from '@payloadcms/ui'\nimport { $getNodeByKey, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useLexicalListDrawer } from '../../../../utilities/fieldsDrawer/useLexicalListDrawer.js'\nimport { $createRelationshipNode } from '../nodes/RelationshipNode.js'\nimport { INSERT_RELATIONSHIP_COMMAND } from '../plugins/index.js'\nimport { INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND } from './commands.js'\n\nconst insertRelationship = ({\n editor,\n relationTo,\n replaceNodeKey,\n value,\n}: {\n editor: LexicalEditor\n relationTo: string\n replaceNodeKey: null | string\n value: number | string\n}) => {\n if (!replaceNodeKey) {\n editor.dispatchCommand(INSERT_RELATIONSHIP_COMMAND, {\n relationTo,\n value,\n })\n } else {\n editor.update(() => {\n const node = $getNodeByKey(replaceNodeKey)\n if (node) {\n node.replace($createRelationshipNode({ relationTo, value }))\n }\n })\n }\n}\n\ntype Props = {\n enabledCollectionSlugs: CollectionSlug[]\n}\n\nconst RelationshipDrawerComponent: React.FC<Props> = ({ enabledCollectionSlugs }) => {\n const [editor] = useLexicalComposerContext()\n\n const [replaceNodeKey, setReplaceNodeKey] = useState<null | string>(null)\n\n const { closeListDrawer, ListDrawer, openListDrawer } = useLexicalListDrawer({\n collectionSlugs: enabledCollectionSlugs,\n selectedCollection: enabledCollectionSlugs?.[0],\n })\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND,\n (payload) => {\n setReplaceNodeKey(payload?.replace ? payload?.replace.nodeKey : null)\n openListDrawer()\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor, openListDrawer])\n\n const onSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n ({ collectionSlug, doc }) => {\n insertRelationship({\n editor,\n relationTo: collectionSlug,\n replaceNodeKey,\n value: doc.id,\n })\n closeListDrawer()\n },\n [editor, closeListDrawer, replaceNodeKey],\n )\n\n return <ListDrawer onSelect={onSelect} />\n}\n\nconst RelationshipDrawerComponentFallback: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND,\n () => {\n toast.error('No relationship collections enabled')\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n\nexport const RelationshipDrawer = ({ enabledCollectionSlugs }: Props): React.ReactNode => {\n if (!enabledCollectionSlugs?.length) {\n return <RelationshipDrawerComponentFallback />\n }\n\n return <RelationshipDrawerComponent enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { UseListDrawer } from '@payloadcms/ui'\nimport type { BaseSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useListDrawer, useModal } from '@payloadcms/ui'\nimport {\n $getNodeByKey,\n $getPreviousSelection,\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $setSelection,\n} from 'lexical'\nimport { useCallback, useEffect, useState } from 'react'\n\n/**\n *\n * Wrapper around useListDrawer that restores and saves selection state (cursor position) when opening and closing the drawer.\n * By default, the lexical cursor position may be lost when opening a drawer and clicking somewhere on that drawer.\n */\nexport const useLexicalListDrawer = (\n args: Parameters<UseListDrawer>[0],\n): {\n closeListDrawer: () => void\n isListDrawerOpen: boolean\n ListDrawer: ReturnType<UseListDrawer>[0]\n listDrawerSlug: string\n ListDrawerToggler: ReturnType<UseListDrawer>[1]\n openListDrawer: (selection?: BaseSelection) => void\n} => {\n const [editor] = useLexicalComposerContext()\n const [selectionState, setSelectionState] = useState<BaseSelection | null>(null)\n const [wasOpen, setWasOpen] = useState<boolean>(false)\n\n const [\n BaseListDrawer,\n BaseListDrawerToggler,\n {\n closeDrawer: baseCloseDrawer,\n drawerSlug: listDrawerSlug,\n isDrawerOpen,\n openDrawer: baseOpenDrawer,\n },\n ] = useListDrawer(args)\n const { modalState } = useModal()\n\n const $storeSelection = useCallback(() => {\n // editor.read() causes an error here when creating a new upload node from the slash menu. It seems like we can omit it here though, as all\n // invocations of that functions are wrapped in editor.read() or editor.update() somewhere in the call stack.\n const selection = $getSelection() ?? $getPreviousSelection()\n setSelectionState(selection)\n }, [])\n\n const restoreSelection = useCallback(() => {\n if (selectionState) {\n editor.update(\n () => {\n if ($isRangeSelection(selectionState)) {\n const { anchor, focus } = selectionState\n if ($getNodeByKey(anchor.key) && $getNodeByKey(focus.key)) {\n $setSelection(selectionState.clone())\n }\n } else {\n // not ideal, but better than losing the selection. Try to set the selection\n // in a valid place if you remove selected nodes!\n $getRoot().selectEnd()\n }\n },\n { discrete: true, skipTransforms: true },\n )\n }\n }, [editor, selectionState])\n\n const closeListDrawer = () => {\n //restoreSelection() // Should already be stored by the useEffect below\n baseCloseDrawer()\n }\n\n // We need to handle drawer closing via a useEffect, as toggleDrawer / closeDrawer will not be triggered if the drawer\n // is closed by clicking outside of the drawer. This useEffect will handle everything.\n useEffect(() => {\n if (!wasOpen) {\n return\n }\n\n const thisModalState = modalState[listDrawerSlug]\n // Exists in modalState (thus has opened at least once before) and is closed\n if (thisModalState && !thisModalState?.isOpen) {\n setWasOpen(false)\n setTimeout(() => {\n restoreSelection()\n }, 1)\n }\n }, [modalState, listDrawerSlug, restoreSelection, wasOpen])\n\n return {\n closeListDrawer,\n isListDrawerOpen: isDrawerOpen,\n ListDrawer: BaseListDrawer,\n listDrawerSlug,\n ListDrawerToggler: (props) => (\n <BaseListDrawerToggler\n {...props}\n onClick={() => {\n $storeSelection()\n }}\n />\n ),\n openListDrawer: () => {\n $storeSelection()\n baseOpenDrawer()\n setWasOpen(true)\n },\n }\n}\n", "'use client'\nimport type { ClientCollectionConfig, CollectionSlug } from 'payload'\n\nimport { useConfig, useEntityVisibility } from '@payloadcms/ui'\nimport * as React from 'react'\n\ntype UseEnabledRelationshipsOptions = {\n collectionSlugsBlacklist?: string[]\n collectionSlugsWhitelist?: string[]\n uploads?: boolean\n}\n\ntype UseEnabledRelationshipsResult = {\n enabledCollections: ClientCollectionConfig[]\n enabledCollectionSlugs: CollectionSlug[]\n}\n\nexport const useEnabledRelationships = (\n options?: UseEnabledRelationshipsOptions,\n): UseEnabledRelationshipsResult => {\n const { collectionSlugsBlacklist, collectionSlugsWhitelist, uploads = false } = options || {}\n const {\n config: { collections },\n } = useConfig()\n const { visibleEntities } = useEntityVisibility()\n\n const result = React.useMemo(() => {\n const enabledCollectionSlugs: string[] = []\n const enabledCollections: ClientCollectionConfig[] = []\n const whitelistSet = collectionSlugsWhitelist ? new Set(collectionSlugsWhitelist) : null\n const blacklistSet = collectionSlugsBlacklist ? new Set(collectionSlugsBlacklist) : null\n\n for (const collection of collections) {\n const {\n slug,\n admin: { enableRichTextRelationship },\n upload,\n } = collection\n\n // Check visibility\n if (!visibleEntities?.collections.includes(slug)) {\n continue\n }\n\n // Check rich text relationship and upload settings\n if (uploads) {\n if (!enableRichTextRelationship || !upload) {\n continue\n }\n } else {\n if (upload || !enableRichTextRelationship) {\n continue\n }\n }\n\n // Check whitelist (if provided, only include slugs in the whitelist)\n if (whitelistSet && !whitelistSet.has(slug)) {\n continue\n }\n\n // Check blacklist (if provided, exclude slugs in the blacklist)\n if (blacklistSet && blacklistSet.has(slug)) {\n continue\n }\n\n enabledCollectionSlugs.push(slug)\n enabledCollections.push(collection)\n }\n\n return { enabledCollections, enabledCollectionSlugs }\n }, [collections, visibleEntities, uploads, collectionSlugsWhitelist, collectionSlugsBlacklist])\n\n return result\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { useScrollInfo, useThrottledEffect, useTranslation } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport type { EditorConfigContextType } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport type { SanitizedClientEditorConfig } from '../../../../../lexical/config/types.js'\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\nimport type { FixedToolbarFeatureProps } from '../../server/index.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport './index.scss'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n editorConfig,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const [dropdownLabel, setDropdownLabel] = React.useState<string | undefined>(undefined)\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>(undefined)\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = React.useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n setDropdownLabel(undefined)\n } else {\n setDropdownIcon(undefined)\n setDropdownLabel(undefined)\n }\n return\n }\n const item = activeItems[0]!\n\n let label = item.key\n if (item.label) {\n label =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (label.length > 25) {\n label = label.substring(0, 25) + '...'\n }\n if (activeItems.length === 1) {\n setDropdownLabel(label)\n setDropdownIcon(() => item.ChildComponent)\n } else {\n setDropdownLabel(\n i18n.t('lexical:general:toolbarItemsActive', { count: activeItems.length }),\n )\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }\n },\n [group, i18n, featureClientSchemaMap, schemaPath],\n )\n\n return (\n <div\n className={`fixed-toolbar__group fixed-toolbar__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarFixed?.groups.length - 1 && <div className=\"divider\" />}\n </div>\n )\n}\n\nfunction FixedToolbar({\n anchorElem,\n clientProps,\n editor,\n editorConfig,\n parentWithFixedToolbar,\n}: {\n anchorElem: HTMLElement\n clientProps?: FixedToolbarFeatureProps\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n parentWithFixedToolbar: EditorConfigContextType | false\n}): React.ReactNode {\n const currentToolbarRef = React.useRef<HTMLDivElement>(null)\n const isEditable = useLexicalEditable()\n\n const { y } = useScrollInfo()\n\n // Memoize the parent toolbar element\n const parentToolbarElem = useMemo(() => {\n if (!parentWithFixedToolbar || clientProps?.disableIfParentHasFixedToolbar) {\n return null\n }\n\n const parentEditorElem = parentWithFixedToolbar.editorContainerRef.current\n let sibling = parentEditorElem.previousElementSibling\n while (sibling) {\n if (sibling.classList.contains('fixed-toolbar')) {\n return sibling\n }\n sibling = sibling.previousElementSibling\n }\n return null\n }, [clientProps?.disableIfParentHasFixedToolbar, parentWithFixedToolbar])\n\n useThrottledEffect(\n () => {\n if (!parentToolbarElem) {\n // this also checks for clientProps?.disableIfParentHasFixedToolbar indirectly, see the parentToolbarElem useMemo\n return\n }\n const currentToolbarElem = currentToolbarRef.current\n if (!currentToolbarElem) {\n return\n }\n\n const currentRect = currentToolbarElem.getBoundingClientRect()\n const parentRect = parentToolbarElem.getBoundingClientRect()\n\n // we only need to check for vertical overlap\n const overlapping = !(\n currentRect.bottom < parentRect.top || currentRect.top > parentRect.bottom\n )\n\n if (overlapping) {\n currentToolbarElem.classList.remove('fixed-toolbar')\n currentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--overlapping')\n parentToolbarElem.classList.remove('fixed-toolbar')\n parentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--hide')\n } else {\n if (!currentToolbarElem.classList.contains('fixed-toolbar--overlapping')) {\n return\n }\n currentToolbarElem.classList.remove('fixed-toolbar--overlapping')\n currentToolbarElem.classList.add('fixed-toolbar')\n parentToolbarElem.classList.remove('fixed-toolbar--hide')\n parentToolbarElem.classList.add('fixed-toolbar')\n }\n },\n 50,\n [currentToolbarRef, parentToolbarElem, y],\n )\n\n return (\n <div\n className=\"fixed-toolbar\"\n onFocus={(event) => {\n // Prevent other focus events being triggered. Otherwise, if this was to be clicked while in a child editor,\n // the parent editor will be focused, and the child editor will lose focus.\n event.stopPropagation()\n }}\n ref={currentToolbarRef}\n >\n {isEditable && (\n <React.Fragment>\n {editorConfig?.features &&\n editorConfig.features?.toolbarFixed?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n editorConfig={editorConfig}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nconst getParentEditorWithFixedToolbar = (\n editorConfigContext: EditorConfigContextType,\n): EditorConfigContextType | false => {\n if (editorConfigContext.parentEditor?.editorConfig) {\n if (editorConfigContext.parentEditor?.editorConfig.resolvedFeatureMap.has('toolbarFixed')) {\n return editorConfigContext.parentEditor\n } else {\n if (editorConfigContext.parentEditor) {\n return getParentEditorWithFixedToolbar(editorConfigContext.parentEditor)\n }\n }\n }\n return false\n}\n\nexport const FixedToolbarPlugin: PluginComponent<FixedToolbarFeatureProps> = ({ clientProps }) => {\n const [currentEditor] = useLexicalComposerContext()\n const editorConfigContext = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n if (!isEditable) {\n return null\n }\n\n const { editorConfig: currentEditorConfig } = editorConfigContext\n\n const editor = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editor || currentEditor\n : currentEditor\n\n const editorConfig = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editorConfig || currentEditorConfig\n : currentEditorConfig\n\n const parentWithFixedToolbar = getParentEditorWithFixedToolbar(editorConfigContext)\n\n if (clientProps?.disableIfParentHasFixedToolbar) {\n if (parentWithFixedToolbar) {\n return null\n }\n }\n\n if (!editorConfig?.features?.toolbarFixed?.groups?.length) {\n return null\n }\n\n return (\n <FixedToolbar\n anchorElem={document.body}\n editor={editor}\n editorConfig={editorConfig}\n parentWithFixedToolbar={parentWithFixedToolbar}\n />\n )\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { mergeRegister } from '@lexical/utils'\nimport { $addUpdateTag, $getSelection } from 'lexical'\nimport React, { useCallback, useDeferredValue, useEffect, useMemo, useState } from 'react'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { useRunDeprioritized } from '../../../../utilities/useRunDeprioritized.js'\n\nconst baseClass = 'toolbar-popup__button'\n\nexport const ToolbarButton = ({\n children,\n editor,\n item,\n}: {\n children: React.JSX.Element\n editor: LexicalEditor\n item: ToolbarGroupItem\n}) => {\n const [_state, setState] = useState({ active: false, enabled: true })\n const deferredState = useDeferredValue(_state)\n\n const editorConfigContext = useEditorConfigContext()\n\n const className = useMemo(() => {\n return [\n baseClass,\n !deferredState.enabled ? 'disabled' : '',\n deferredState.active ? 'active' : '',\n item.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [deferredState, item.key])\n const updateStates = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!selection) {\n return\n }\n const newActive = item.isActive\n ? item.isActive({ editor, editorConfigContext, selection })\n : false\n\n const newEnabled = item.isEnabled\n ? item.isEnabled({ editor, editorConfigContext, selection })\n : true\n\n setState((prev) => {\n if (prev.active === newActive && prev.enabled === newEnabled) {\n return prev\n }\n return { active: newActive, enabled: newEnabled }\n })\n })\n }, [editor, editorConfigContext, item])\n\n const runDeprioritized = useRunDeprioritized()\n\n useEffect(() => {\n // Run on mount\n void runDeprioritized(updateStates)\n\n const listener = () => runDeprioritized(updateStates)\n\n const cleanup = mergeRegister(editor.registerUpdateListener(listener))\n document.addEventListener('mouseup', listener)\n\n return () => {\n cleanup()\n document.removeEventListener('mouseup', listener)\n }\n }, [editor, runDeprioritized, updateStates])\n\n const handleClick = useCallback(() => {\n if (!_state.enabled) {\n return\n }\n\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: _state.active,\n })\n })\n }, [editor, item, _state])\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }, [])\n\n return (\n <button\n className={className}\n data-button-key={item.key}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n", "'use client'\nimport React, { useCallback, useDeferredValue, useEffect, useMemo } from 'react'\n\nconst baseClass = 'toolbar-popup__dropdown'\n\nimport type { LexicalEditor } from 'lexical'\n\nimport { mergeRegister } from '@lexical/utils'\nimport { useTranslation } from '@payloadcms/ui'\nimport { $getSelection } from 'lexical'\n\nimport type { ToolbarDropdownGroup, ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useRunDeprioritized } from '../../../../utilities/useRunDeprioritized.js'\nimport './index.scss'\nimport { DropDown, DropDownItem } from './DropDown.js'\n\nconst ToolbarItem = ({\n active,\n anchorElem,\n editor,\n enabled,\n item,\n}: {\n active?: boolean\n anchorElem: HTMLElement\n editor: LexicalEditor\n enabled?: boolean\n item: ToolbarGroupItem\n}) => {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component\n active={active}\n anchorElem={anchorElem}\n editor={editor}\n enabled={enabled}\n item={item}\n key={item.key}\n />\n )\n )\n }\n\n let title = item.key\n let croppedTitle = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n croppedTitle = title.substring(0, 25) + '...'\n } else {\n croppedTitle = title\n }\n\n return (\n <DropDownItem\n active={active}\n editor={editor}\n enabled={enabled}\n Icon={item?.ChildComponent ? <item.ChildComponent /> : undefined}\n item={item}\n itemKey={item.key}\n key={item.key}\n tooltip={title}\n >\n <span className=\"text\">{croppedTitle}</span>\n </DropDownItem>\n )\n}\n\nconst MemoToolbarItem = React.memo(ToolbarItem)\n\nexport const ToolbarDropdown = ({\n anchorElem,\n classNames,\n editor,\n group,\n Icon,\n itemsContainerClassNames,\n label,\n maxActiveItems,\n onActiveChange,\n}: {\n anchorElem: HTMLElement\n classNames?: string[]\n editor: LexicalEditor\n group: ToolbarDropdownGroup\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n /**\n * Maximum number of active items allowed. This is a performance optimization to prevent\n * unnecessary item active checks when the maximum number of active items is reached.\n */\n maxActiveItems?: number\n onActiveChange?: ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => void\n}) => {\n const [toolbarState, setToolbarState] = React.useState<{\n activeItemKeys: string[]\n enabledGroup: boolean\n enabledItemKeys: string[]\n }>({\n activeItemKeys: [],\n enabledGroup: true,\n enabledItemKeys: [],\n })\n const deferredToolbarState = useDeferredValue(toolbarState)\n\n const editorConfigContext = useEditorConfigContext()\n const { items, key: groupKey } = group\n\n const runDeprioritized = useRunDeprioritized()\n\n const updateStates = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!selection) {\n return\n }\n\n const _activeItemKeys: string[] = []\n const _activeItems: ToolbarGroupItem[] = []\n const _enabledItemKeys: string[] = []\n\n for (const item of items) {\n if (item.isActive && (!maxActiveItems || _activeItemKeys.length < maxActiveItems)) {\n const isActive = item.isActive({ editor, editorConfigContext, selection })\n if (isActive) {\n _activeItemKeys.push(item.key)\n _activeItems.push(item)\n }\n }\n if (item.isEnabled) {\n const isEnabled = item.isEnabled({ editor, editorConfigContext, selection })\n if (isEnabled) {\n _enabledItemKeys.push(item.key)\n }\n } else {\n _enabledItemKeys.push(item.key)\n }\n }\n\n setToolbarState({\n activeItemKeys: _activeItemKeys,\n enabledGroup: group.isEnabled\n ? group.isEnabled({ editor, editorConfigContext, selection })\n : true,\n enabledItemKeys: _enabledItemKeys,\n })\n\n if (onActiveChange) {\n onActiveChange({ activeItems: _activeItems })\n }\n })\n }, [editor, editorConfigContext, group, items, maxActiveItems, onActiveChange])\n\n useEffect(() => {\n // Run on mount in order to update states when dropdown is opened\n void runDeprioritized(updateStates)\n\n return mergeRegister(\n editor.registerUpdateListener(async () => {\n await runDeprioritized(updateStates)\n }),\n )\n }, [editor, runDeprioritized, updateStates])\n\n const renderedItems = useMemo(() => {\n return items?.length\n ? items.map((item) => (\n <MemoToolbarItem\n active={deferredToolbarState.activeItemKeys.includes(item.key)}\n anchorElem={anchorElem}\n editor={editor}\n enabled={deferredToolbarState.enabledItemKeys.includes(item.key)}\n item={item}\n key={item.key}\n />\n ))\n : null\n }, [items, deferredToolbarState, anchorElem, editor])\n\n return (\n <DropDown\n buttonAriaLabel={`${groupKey} dropdown`}\n buttonClassName={[baseClass, `${baseClass}-${groupKey}`, ...(classNames || [])]\n .filter(Boolean)\n .join(' ')}\n disabled={!deferredToolbarState.enabledGroup}\n dropdownKey={groupKey}\n Icon={Icon}\n itemsContainerClassNames={[`${baseClass}-items`, ...(itemsContainerClassNames || [])]}\n key={groupKey}\n label={label}\n >\n {renderedItems}\n </DropDown>\n )\n}\n", "'use client'\nimport { Button } from '@payloadcms/ui'\nimport { $addUpdateTag, isDOMNode, type LexicalEditor } from 'lexical'\nimport React, { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nconst baseClass = 'toolbar-popup__dropdown-item'\n\ninterface DropDownContextType {\n registerItem: (ref: React.RefObject<HTMLButtonElement | null>) => void\n}\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null)\n\nexport function DropDownItem({\n active,\n children,\n editor,\n enabled,\n Icon,\n item,\n itemKey,\n tooltip,\n}: {\n active?: boolean\n children: React.ReactNode\n editor: LexicalEditor\n enabled?: boolean\n Icon: React.ReactNode\n item: ToolbarGroupItem\n itemKey: string\n tooltip?: string\n}): React.ReactNode {\n const className = useMemo(() => {\n return [\n baseClass,\n enabled === false ? 'disabled' : '',\n active ? 'active' : '',\n item?.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [enabled, active, item.key])\n\n const ref = useRef<HTMLButtonElement>(null)\n\n const dropDownContext = React.use(DropDownContext)\n\n if (dropDownContext === null) {\n throw new Error('DropDownItem must be used within a DropDown')\n }\n\n const { registerItem } = dropDownContext\n\n useEffect(() => {\n if (ref?.current != null) {\n registerItem(ref)\n }\n }, [ref, registerItem])\n\n return (\n <Button\n aria-label={tooltip}\n buttonStyle=\"none\"\n className={className}\n disabled={enabled === false}\n extraButtonProps={{\n 'data-item-key': itemKey,\n }}\n icon={Icon}\n iconPosition=\"left\"\n iconStyle=\"none\"\n onClick={() => {\n if (enabled !== false) {\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active!,\n })\n })\n }\n }}\n onMouseDown={(e) => {\n // This is required for Firefox compatibility. Without it, the dropdown will disappear without the onClick being called.\n // This only happens in Firefox. Must be something about how Firefox handles focus events differently.\n e.preventDefault()\n }}\n ref={ref}\n tooltip={tooltip}\n type=\"button\"\n >\n {children}\n </Button>\n )\n}\n\nfunction DropDownItems({\n children,\n dropDownRef,\n itemsContainerClassNames,\n onClose,\n}: {\n children: React.ReactNode\n dropDownRef: React.Ref<HTMLDivElement>\n itemsContainerClassNames?: string[]\n onClose: () => void\n}): React.ReactElement {\n const [items, setItems] = useState<Array<React.RefObject<HTMLButtonElement | null>>>()\n const [highlightedItem, setHighlightedItem] =\n useState<React.RefObject<HTMLButtonElement | null>>()\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement | null>) => {\n setItems((prev) => (prev != null ? [...prev, itemRef] : [itemRef]))\n },\n [setItems],\n )\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (items == null) {\n return\n }\n\n const { key } = event\n\n if (['ArrowDown', 'ArrowUp', 'Escape', 'Tab'].includes(key)) {\n event.preventDefault()\n }\n\n if (key === 'Escape' || key === 'Tab') {\n onClose()\n } else if (key === 'ArrowUp') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n const index = items.indexOf(prev) - 1\n return items[index === -1 ? items.length - 1 : index]\n })\n } else if (key === 'ArrowDown') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n return items[items.indexOf(prev) + 1]\n })\n }\n }\n\n const contextValue = useMemo(\n () => ({\n registerItem,\n }),\n [registerItem],\n )\n\n useEffect(() => {\n if (items != null && highlightedItem == null) {\n setHighlightedItem(items[0])\n }\n\n if (highlightedItem != null && highlightedItem?.current != null) {\n highlightedItem.current.focus()\n }\n }, [items, highlightedItem])\n\n return (\n <DropDownContext value={contextValue}>\n <div\n className={(itemsContainerClassNames ?? ['toolbar-popup__dropdown-items']).join(' ')}\n onKeyDown={handleKeyDown}\n ref={dropDownRef}\n >\n {children}\n </div>\n </DropDownContext>\n )\n}\n\nexport function DropDown({\n buttonAriaLabel,\n buttonClassName,\n children,\n disabled = false,\n dropdownKey,\n Icon,\n itemsContainerClassNames,\n label,\n stopCloseOnClickSelf,\n}: {\n buttonAriaLabel?: string\n buttonClassName: string\n children: ReactNode\n disabled?: boolean\n dropdownKey: string\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n stopCloseOnClickSelf?: boolean\n}): React.ReactNode {\n const dropDownRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const [showDropDown, setShowDropDown] = useState(false)\n\n const handleClose = (): void => {\n setShowDropDown(false)\n if (buttonRef?.current != null) {\n buttonRef.current.focus()\n }\n }\n\n useEffect(() => {\n const button = buttonRef.current\n const dropDown = dropDownRef.current\n\n if (showDropDown && button !== null && dropDown !== null) {\n const { left, top } = button.getBoundingClientRect()\n const scrollTopOffset = window.scrollY || document.documentElement.scrollTop\n dropDown.style.top = `${top + scrollTopOffset + button.offsetHeight + 5}px`\n dropDown.style.left = `${Math.min(left - 5, window.innerWidth - dropDown.offsetWidth - 20)}px`\n }\n }, [dropDownRef, buttonRef, showDropDown])\n\n useEffect(() => {\n const button = buttonRef.current\n\n if (button !== null && showDropDown) {\n const handle = (event: MouseEvent): void => {\n const target = event.target\n if (!isDOMNode(target)) {\n return\n }\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target)) {\n return\n }\n }\n if (!button.contains(target)) {\n setShowDropDown(false)\n }\n }\n document.addEventListener('click', handle)\n\n return () => {\n document.removeEventListener('click', handle)\n }\n }\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf])\n\n const portal = createPortal(\n <DropDownItems\n dropDownRef={dropDownRef}\n itemsContainerClassNames={itemsContainerClassNames}\n onClose={handleClose}\n >\n {children}\n </DropDownItems>,\n document.body,\n )\n\n return (\n <React.Fragment>\n <button\n aria-label={buttonAriaLabel}\n className={buttonClassName + (showDropDown ? ' active' : '')}\n data-dropdown-key={dropdownKey}\n disabled={disabled}\n onClick={(event) => {\n event.preventDefault()\n setShowDropDown(!showDropDown)\n }}\n onMouseDown={(e) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }}\n ref={buttonRef}\n type=\"button\"\n >\n {Icon && <Icon />}\n {label && <span className=\"toolbar-popup__dropdown-label\">{label}</span>}\n <i className=\"toolbar-popup__dropdown-caret\" />\n </button>\n\n {showDropDown && <React.Fragment>{portal}</React.Fragment>}\n </React.Fragment>\n )\n}\n", "'use client'\n\nimport type { FixedToolbarFeatureProps } from '../server/index.js'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { FixedToolbarPlugin } from './Toolbar/index.js'\n\nexport const FixedToolbarFeatureClient = createClientFeature<FixedToolbarFeatureProps>({\n plugins: [\n {\n Component: FixedToolbarPlugin,\n position: 'aboveContainer',\n },\n ],\n})\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getDOMRangeRect } from '../../../../../lexical/utils/getDOMRangeRect.js'\nimport { setFloatingElemPosition } from '../../../../../lexical/utils/setFloatingElemPosition.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport './index.scss'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { editorConfig } = useEditorConfigContext()\n\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>()\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent)\n } else {\n setDropdownIcon(undefined)\n }\n return\n }\n const item = activeItems[0]\n setDropdownIcon(() => item?.ChildComponent)\n },\n [group],\n )\n\n return (\n <div\n className={`inline-toolbar-popup__group inline-toolbar-popup__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarInline?.groups.length - 1 && (\n <div className=\"divider\" />\n )}\n </div>\n )\n}\n\nfunction InlineToolbar({\n anchorElem,\n editor,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n}): React.ReactNode {\n const floatingToolbarRef = useRef<HTMLDivElement | null>(null)\n const caretRef = useRef<HTMLDivElement | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const closeFloatingToolbar = useCallback(() => {\n if (floatingToolbarRef?.current) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n\n if (!isOpacityZero) {\n floatingToolbarRef.current.style.opacity = '0'\n }\n if (!isPointerEventsNone) {\n floatingToolbarRef.current.style.pointerEvents = 'none'\n }\n }\n }, [floatingToolbarRef])\n\n const mouseMoveListener = useCallback(\n (e: MouseEvent) => {\n if (floatingToolbarRef?.current && (e.buttons === 1 || e.buttons === 3)) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n if (!isOpacityZero || !isPointerEventsNone) {\n // Check if the mouse is not over the popup\n const x = e.clientX\n const y = e.clientY\n const elementUnderMouse = document.elementFromPoint(x, y)\n if (!floatingToolbarRef.current.contains(elementUnderMouse)) {\n // Mouse is not over the target element => not a normal click, but probably a drag\n closeFloatingToolbar()\n }\n }\n }\n },\n [closeFloatingToolbar],\n )\n\n const mouseUpListener = useCallback(() => {\n if (floatingToolbarRef?.current) {\n if (floatingToolbarRef.current.style.opacity !== '1') {\n floatingToolbarRef.current.style.opacity = '1'\n }\n if (floatingToolbarRef.current.style.pointerEvents !== 'auto') {\n floatingToolbarRef.current.style.pointerEvents = 'auto'\n }\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('mousemove', mouseMoveListener)\n document.addEventListener('mouseup', mouseUpListener)\n\n return () => {\n document.removeEventListener('mousemove', mouseMoveListener)\n document.removeEventListener('mouseup', mouseUpListener)\n }\n }, [floatingToolbarRef, mouseMoveListener, mouseUpListener])\n\n const $updateTextFormatFloatingToolbar = useCallback(() => {\n const selection = $getSelection()\n\n const nativeSelection = getDOMSelection(editor._window)\n\n if (floatingToolbarRef.current === null) {\n return\n }\n\n const possibleLinkEditor = anchorElem.querySelector(':scope > .link-editor')\n const isLinkEditorVisible =\n possibleLinkEditor !== null &&\n 'style' in possibleLinkEditor &&\n possibleLinkEditor?.style?.['opacity' as keyof typeof possibleLinkEditor.style] === '1'\n\n const rootElement = editor.getRootElement()\n if (\n selection !== null &&\n nativeSelection !== null &&\n !nativeSelection.isCollapsed &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement)\n\n // Position floating toolbar\n const offsetIfFlipped = setFloatingElemPosition({\n alwaysDisplayOnTop: isLinkEditorVisible,\n anchorElem,\n floatingElem: floatingToolbarRef.current,\n horizontalPosition: 'center',\n targetRect: rangeRect,\n })\n\n // Position caret\n if (caretRef.current) {\n setFloatingElemPosition({\n anchorElem: floatingToolbarRef.current,\n anchorFlippedOffset: offsetIfFlipped,\n floatingElem: caretRef.current,\n horizontalOffset: 5,\n horizontalPosition: 'center',\n specialHandlingForCaret: true,\n targetRect: rangeRect,\n verticalGap: 8,\n })\n }\n } else {\n closeFloatingToolbar()\n }\n }, [editor, closeFloatingToolbar, anchorElem])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }\n\n window.addEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateTextFormatFloatingToolbar()\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateTextFormatFloatingToolbar])\n\n return (\n <div className=\"inline-toolbar-popup\" ref={floatingToolbarRef}>\n <div className=\"caret\" ref={caretRef} />\n {editorConfig?.features &&\n editorConfig.features?.toolbarInline?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </div>\n )\n}\n\nfunction useInlineToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n): null | React.ReactElement {\n const [isText, setIsText] = useState(false)\n const isEditable = useLexicalEditable()\n\n const updatePopup = useCallback(() => {\n editor.getEditorState().read(() => {\n // Should not to pop up the floating toolbar when using IME input\n if (editor.isComposing()) {\n return\n }\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n (!$isRangeSelection(selection) ||\n rootElement === null ||\n !rootElement.contains(nativeSelection.anchorNode))\n ) {\n setIsText(false)\n return\n }\n\n if (!$isRangeSelection(selection)) {\n return\n }\n\n if (selection.getTextContent() !== '') {\n const nodes = selection.getNodes()\n let foundNodeWithText = false\n for (const node of nodes) {\n if ($isTextNode(node)) {\n setIsText(true)\n foundNodeWithText = true\n break\n }\n }\n if (!foundNodeWithText) {\n setIsText(false)\n }\n } else {\n setIsText(false)\n }\n\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '')\n if (!selection.isCollapsed() && rawTextContent === '') {\n setIsText(false)\n return\n }\n })\n }, [editor])\n\n useEffect(() => {\n document.addEventListener('selectionchange', updatePopup)\n document.addEventListener('mouseup', updatePopup)\n return () => {\n document.removeEventListener('selectionchange', updatePopup)\n document.removeEventListener('mouseup', updatePopup)\n }\n }, [updatePopup])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(() => {\n updatePopup()\n }),\n editor.registerRootListener(() => {\n if (editor.getRootElement() === null) {\n setIsText(false)\n }\n }),\n )\n }, [editor, updatePopup])\n\n if (!isText || !isEditable) {\n return null\n }\n\n return createPortal(<InlineToolbar anchorElem={anchorElem} editor={editor} />, anchorElem)\n}\n\nexport const InlineToolbarPlugin: PluginComponentWithAnchor<undefined> = ({ anchorElem }) => {\n const [editor] = useLexicalComposerContext()\n\n return useInlineToolbar(editor, anchorElem)\n}\n", "'use client'\nexport function getDOMRangeRect(nativeSelection: Selection, rootElement: HTMLElement): DOMRect {\n const domRange = nativeSelection.getRangeAt(0)\n\n let rect\n\n if (nativeSelection.anchorNode === rootElement) {\n let inner = rootElement\n while (inner.firstElementChild != null) {\n inner = inner.firstElementChild as HTMLElement\n }\n rect = inner.getBoundingClientRect()\n } else {\n rect = domRange.getBoundingClientRect()\n }\n\n return rect\n}\n", "'use client'\nconst VERTICAL_GAP = 10\nconst HORIZONTAL_OFFSET = 32\n\n// TODO: needs refactoring\n// This is supposed to position the floatingElem based on the parent (anchorElem) and the target (targetRect) which is usually the selected text.\n// So basically, it positions the floatingElem either below or above the target (targetRect) and aligns it to the left or center of the target (targetRect).\n// This is used for positioning the floating toolbar (anchor: richtext editor) and its caret (anchor: floating toolbar)\nexport function setFloatingElemPosition(args: {\n alwaysDisplayOnTop?: boolean\n anchorElem: HTMLElement\n anchorFlippedOffset?: number // Offset which was added to the anchor (for caret, floating toolbar) if it was flipped\n floatingElem: HTMLElement\n horizontalOffset?: number\n horizontalPosition?: 'center' | 'left'\n specialHandlingForCaret?: boolean\n targetRect: ClientRect | null\n verticalGap?: number\n}): number | undefined {\n const {\n alwaysDisplayOnTop = false,\n anchorElem,\n anchorFlippedOffset = 0, // Offset which was added to the anchor (for caret, floating toolbar) if it was flipped\n floatingElem,\n horizontalOffset = HORIZONTAL_OFFSET,\n horizontalPosition = 'left',\n specialHandlingForCaret = false,\n targetRect,\n verticalGap = VERTICAL_GAP,\n } = args\n // Returns the top offset if the target was flipped\n const scrollerElem = anchorElem.parentElement\n\n if (targetRect === null || scrollerElem == null) {\n floatingElem.style.opacity = '0'\n floatingElem.style.transform = 'translate(-10000px, -10000px)'\n return\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect()\n const anchorElementRect = anchorElem.getBoundingClientRect()\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\n\n let top = targetRect.top - floatingElemRect.height - verticalGap\n let left = targetRect.left - horizontalOffset\n\n if (horizontalPosition === 'center') {\n // Calculate left to position floatingElem to the horizontal middle of targetRect\n left = targetRect.left + targetRect.width / 2 - floatingElemRect.width / 2\n }\n\n let addedToTop = 0\n if (!alwaysDisplayOnTop && top < editorScrollerRect.top && !specialHandlingForCaret) {\n addedToTop = floatingElemRect.height + targetRect.height + verticalGap * 2\n\n top += addedToTop\n }\n\n if (horizontalPosition === 'center') {\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n } else if (left < editorScrollerRect.left) {\n left = editorScrollerRect.left + horizontalOffset\n }\n } else {\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n }\n }\n\n left -= anchorElementRect.left\n\n floatingElem.style.opacity = '1'\n\n if (specialHandlingForCaret && anchorFlippedOffset !== 0) {\n // Floating select toolbar was flipped (positioned below text rather than above). Thus, the caret now needs to be positioned\n // on the other side and rotated.\n top -= anchorElementRect.bottom - anchorFlippedOffset + floatingElemRect.height - 3\n // top += anchorFlippedOffset - anchorElementRect.height - floatingElemRect.height + 2\n floatingElem.style.transform = `translate(${left}px, ${top}px) rotate(180deg)`\n } else {\n top -= anchorElementRect.top\n\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\n }\n\n return addedToTop\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { InlineToolbarPlugin } from './Toolbar/index.js'\n\nexport const InlineToolbarFeatureClient = createClientFeature({\n plugins: [\n {\n Component: InlineToolbarPlugin,\n position: 'floatingAnchorElem',\n },\n ],\n})\n", "'use client'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\n\nimport { TableIcon } from '../../../lexical/ui/icons/Table/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { TableMarkdownTransformer } from '../markdownTransformer.js'\nimport { TableActionMenuPlugin } from './plugins/TableActionMenuPlugin/index.js'\nimport { TableCellResizerPlugin } from './plugins/TableCellResizerPlugin/index.js'\nimport { TableHoverActionsPlugin } from './plugins/TableHoverActionsPlugin/index.js'\nimport {\n OPEN_TABLE_DRAWER_COMMAND,\n TableContext,\n TablePlugin,\n} from './plugins/TablePlugin/index.js'\n\nexport const TableFeatureClient = createClientFeature({\n markdownTransformers: [TableMarkdownTransformer],\n nodes: [TableNode, TableCellNode, TableRowNode],\n plugins: [\n {\n Component: TablePlugin,\n position: 'normal',\n },\n {\n Component: TableCellResizerPlugin,\n position: 'normal',\n },\n {\n Component: TableActionMenuPlugin,\n position: 'floatingAnchorElem',\n },\n {\n Component: TableHoverActionsPlugin,\n position: 'floatingAnchorElem',\n },\n ],\n providers: [TableContext],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: TableIcon,\n key: 'table',\n keywords: ['table'],\n label: 'Table',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OPEN_TABLE_DRAWER_COMMAND, {})\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: TableIcon,\n key: 'table',\n label: 'Table',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OPEN_TABLE_DRAWER_COMMAND, {})\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const TableIcon: React.FC = () => {\n return (\n <svg\n className=\"icon\"\n fill=\"none\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M5.33333 4.5C4.8731 4.5 4.5 4.8731 4.5 5.33333V7.5H9.5V4.5H5.33333ZM5.33333 3.5C4.32081 3.5 3.5 4.32081 3.5 5.33333V14.6667C3.5 15.6792 4.32081 16.5 5.33333 16.5H14.6667C15.6792 16.5 16.5 15.6792 16.5 14.6667V5.33333C16.5 4.32081 15.6792 3.5 14.6667 3.5H5.33333ZM10.5 4.5V7.5H15.5V5.33333C15.5 4.8731 15.1269 4.5 14.6667 4.5H10.5ZM15.5 8.5H10.5V11.5H15.5V8.5ZM15.5 12.5H10.5V15.5H14.6667C15.1269 15.5 15.5 15.1269 15.5 14.6667V12.5ZM9.5 15.5V12.5H4.5V14.6667C4.5 15.1269 4.8731 15.5 5.33333 15.5H9.5ZM4.5 11.5H9.5V8.5H4.5V11.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n", "import type { LexicalNode } from 'lexical'\n\nimport {\n $createTableCellNode,\n $createTableNode,\n $createTableRowNode,\n $isTableCellNode,\n $isTableNode,\n $isTableRowNode,\n TableCellHeaderStates,\n TableCellNode,\n TableNode,\n TableRowNode,\n} from '@lexical/table'\nimport { $isParagraphNode, $isTextNode } from 'lexical'\n\nimport {\n $convertFromMarkdownString,\n $convertToMarkdownString,\n type ElementTransformer,\n type Transformer,\n} from '../../packages/@lexical/markdown/index.js'\n\n// Very primitive table setup\nconst TABLE_ROW_REG_EXP = /^\\|(.+)\\|\\s?$/\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst TABLE_ROW_DIVIDER_REG_EXP = /^(\\| ?:?-*:? ?)+\\|\\s?$/\n\nexport const TableMarkdownTransformer: (props: {\n allTransformers: Transformer[]\n}) => ElementTransformer = ({ allTransformers }) => ({\n type: 'element',\n dependencies: [TableNode, TableRowNode, TableCellNode],\n export: (node: LexicalNode) => {\n if (!$isTableNode(node)) {\n return null\n }\n\n const output: string[] = []\n\n for (const row of node.getChildren()) {\n const rowOutput: string[] = []\n if (!$isTableRowNode(row)) {\n continue\n }\n\n let isHeaderRow = false\n for (const cell of row.getChildren()) {\n // It's TableCellNode, so it's just to make flow happy\n if ($isTableCellNode(cell)) {\n rowOutput.push(\n $convertToMarkdownString(allTransformers, cell).replace(/\\n/g, '\\\\n').trim(),\n )\n\n if (cell.__headerState === TableCellHeaderStates.ROW) {\n isHeaderRow = true\n }\n }\n }\n\n output.push(`| ${rowOutput.join(' | ')} |`)\n if (isHeaderRow) {\n output.push(`| ${rowOutput.map((_) => '---').join(' | ')} |`)\n }\n }\n\n return output.join('\\n')\n },\n regExp: TABLE_ROW_REG_EXP,\n replace: (parentNode, _1, match) => {\n const match0 = match[0]\n if (!match0) {\n return\n }\n // Header row\n if (TABLE_ROW_DIVIDER_REG_EXP.test(match0)) {\n const table = parentNode.getPreviousSibling()\n if (!table || !$isTableNode(table)) {\n return\n }\n\n const rows = table.getChildren()\n const lastRow = rows[rows.length - 1]\n if (!lastRow || !$isTableRowNode(lastRow)) {\n return\n }\n\n // Add header state to row cells\n lastRow.getChildren().forEach((cell) => {\n if (!$isTableCellNode(cell)) {\n return\n }\n cell.setHeaderStyles(TableCellHeaderStates.ROW, TableCellHeaderStates.ROW)\n })\n\n // Remove line\n parentNode.remove()\n return\n }\n\n const matchCells = mapToTableCells(match0, allTransformers)\n\n if (matchCells == null) {\n return\n }\n\n const rows = [matchCells]\n let sibling = parentNode.getPreviousSibling()\n let maxCells = matchCells.length\n\n while (sibling) {\n if (!$isParagraphNode(sibling)) {\n break\n }\n\n if (sibling.getChildrenSize() !== 1) {\n break\n }\n\n const firstChild = sibling.getFirstChild()\n\n if (!$isTextNode(firstChild)) {\n break\n }\n\n const cells = mapToTableCells(firstChild.getTextContent(), allTransformers)\n\n if (cells == null) {\n break\n }\n\n maxCells = Math.max(maxCells, cells.length)\n rows.unshift(cells)\n const previousSibling = sibling.getPreviousSibling()\n sibling.remove()\n sibling = previousSibling\n }\n\n const table = $createTableNode()\n\n for (const cells of rows) {\n const tableRow = $createTableRowNode()\n table.append(tableRow)\n\n for (let i = 0; i < maxCells; i++) {\n tableRow.append(i < cells.length ? cells[i]! : $createTableCell('', allTransformers))\n }\n }\n\n const previousSibling = parentNode.getPreviousSibling()\n if ($isTableNode(previousSibling) && getTableColumnsSize(previousSibling) === maxCells) {\n previousSibling.append(...table.getChildren())\n parentNode.remove()\n } else {\n parentNode.replace(table)\n }\n\n table.selectEnd()\n },\n})\n\nfunction getTableColumnsSize(table: TableNode) {\n const row = table.getFirstChild()\n return $isTableRowNode(row) ? row.getChildrenSize() : 0\n}\n\nconst $createTableCell = (textContent: string, allTransformers: Transformer[]): TableCellNode => {\n textContent = textContent.replace(/\\\\n/g, '\\n')\n const cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS)\n $convertFromMarkdownString(textContent, allTransformers, cell)\n return cell\n}\n\nconst mapToTableCells = (\n textContent: string,\n allTransformers: Transformer[],\n): Array<TableCellNode> | null => {\n const match = textContent.match(TABLE_ROW_REG_EXP)\n if (!match || !match[1]) {\n return null\n }\n return match[1].split('|').map((text) => $createTableCell(text, allTransformers))\n}\n", "'use client'\n\nimport type { TableObserver, TableSelection } from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $deleteTableColumnAtSelection,\n $deleteTableRowAtSelection,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableSelection,\n $mergeCells,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isTextNode,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = position < 0 ? margin : position\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n $setSelection(null)\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if (!$isTableSelection(selection)) {\n return\n }\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n const targetCell = $mergeCells(tableCells)\n\n if (targetCell) {\n $selectLastDescendant(targetCell)\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRowAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumnAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRowAtSelection()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumnAtSelection()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\n }\n }\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Merge cells</span>\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Unmerge cells</span>\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const MeatballsIcon: React.FC = () => (\n <svg fill=\"none\" height=\"18\" viewBox=\"0 0 20 20\" width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 11C5.55228 11 6 10.5523 6 10C6 9.44772 5.55228 9 5 9C4.44772 9 4 9.44772 4 10C4 10.5523 4.44772 11 5 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 11C10.5523 11 11 10.5523 11 10C11 9.44772 10.5523 9 10 9C9.44772 9 9 9.44772 9 10C9 10.5523 9.44772 11 10 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M15 11C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9C14.4477 9 14 9.44772 14 10C14 10.5523 14.4477 11 15 11Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren<TableCellNode>()\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n ): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n }\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${window.scrollX + left}px`,\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\n top: `${window.scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${window.scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${window.scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${window.scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n return useMemo(\n () => (isEditable ? createPortal(<TableCellResizer editor={editor} />, document.body) : null),\n [editor, isEditable],\n )\n}\n", "'use client'\n\nimport type { TableCellNode, TableRowNode } from '@lexical/table'\nimport type { EditorConfig, NodeKey } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement } from 'lexical'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useDebounce } from '../../utils/useDebounce.js'\n\nconst BUTTON_WIDTH_PX = 20\n\nfunction TableHoverActionsContainer({\n anchorElem,\n}: {\n anchorElem: HTMLElement\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const editorConfig = useEditorConfigContext()\n const [isShownRow, setShownRow] = useState<boolean>(false)\n const [isShownColumn, setShownColumn] = useState<boolean>(false)\n const [shouldListenMouseMove, setShouldListenMouseMove] = useState<boolean>(false)\n const [position, setPosition] = useState({})\n const tableSetRef = useRef<Set<NodeKey>>(new Set())\n const tableCellDOMNodeRef = useRef<HTMLElement | null>(null)\n\n const debouncedOnMouseMove = useDebounce(\n (event: MouseEvent) => {\n const { isOutside, tableDOMNode } = getMouseInfo(event, editorConfig.editorConfig?.lexical)\n\n if (isOutside) {\n setShownRow(false)\n setShownColumn(false)\n return\n }\n\n if (!tableDOMNode) {\n return\n }\n\n tableCellDOMNodeRef.current = tableDOMNode\n\n let hoveredRowNode: null | TableCellNode = null\n let hoveredColumnNode: null | TableCellNode = null\n let tableDOMElement: HTMLElement | null = null\n\n editor.getEditorState().read(\n () => {\n const maybeTableCell = $getNearestNodeFromDOMNode(tableDOMNode)\n\n if ($isTableCellNode(maybeTableCell)) {\n const table = $findMatchingParent(maybeTableCell, (node) => $isTableNode(node))\n if (!$isTableNode(table)) {\n return\n }\n\n tableDOMElement = getTableElement(table, editor.getElementByKey(table.getKey()))\n\n if (tableDOMElement) {\n const rowCount = table.getChildrenSize()\n const colCount = (table.getChildAtIndex(0) as TableRowNode)?.getChildrenSize()\n\n const rowIndex = $getTableRowIndexFromTableCellNode(maybeTableCell)\n const colIndex = $getTableColumnIndexFromTableCellNode(maybeTableCell)\n\n if (rowIndex === rowCount - 1) {\n hoveredRowNode = maybeTableCell\n } else if (colIndex === colCount - 1) {\n hoveredColumnNode = maybeTableCell\n }\n }\n }\n },\n { editor },\n )\n\n if (!tableDOMElement) {\n return\n }\n\n // this is the scrollable div container of the table (in case of overflow)\n const tableContainerElement = (tableDOMElement as HTMLTableElement).parentElement\n\n if (!tableContainerElement) {\n return\n }\n\n const {\n bottom: tableElemBottom,\n height: tableElemHeight,\n left: tableElemLeft,\n right: tableElemRight,\n width: tableElemWidth,\n y: tableElemY,\n } = (tableDOMElement as HTMLTableElement).getBoundingClientRect()\n\n let tableHasScroll = false\n if (\n tableContainerElement &&\n tableContainerElement.classList.contains('LexicalEditorTheme__tableScrollableWrapper')\n ) {\n tableHasScroll = tableContainerElement.scrollWidth > tableContainerElement.clientWidth\n }\n\n const { left: editorElemLeft, y: editorElemY } = anchorElem.getBoundingClientRect()\n\n if (hoveredRowNode) {\n setShownColumn(false)\n setShownRow(true)\n setPosition({\n height: BUTTON_WIDTH_PX,\n left:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetLeft\n : tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetWidth\n : tableElemWidth,\n })\n } else if (hoveredColumnNode) {\n setShownColumn(true)\n setShownRow(false)\n setPosition({\n height: tableElemHeight,\n left: tableElemRight - editorElemLeft + 5,\n top: tableElemY - editorElemY,\n width: BUTTON_WIDTH_PX,\n })\n }\n },\n 50,\n 250,\n )\n\n // Hide the buttons on any table dimensions change to prevent last row cells\n // overlap behind the 'Add Row' button when text entry changes cell height\n const tableResizeObserver = useMemo(() => {\n return new ResizeObserver(() => {\n setShownRow(false)\n setShownColumn(false)\n })\n }, [])\n\n useEffect(() => {\n if (!shouldListenMouseMove) {\n return\n }\n\n document.addEventListener('mousemove', debouncedOnMouseMove)\n\n return () => {\n setShownRow(false)\n setShownColumn(false)\n\n document.removeEventListener('mousemove', debouncedOnMouseMove)\n }\n }, [shouldListenMouseMove, debouncedOnMouseMove])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerMutationListener(\n TableNode,\n (mutations) => {\n editor.getEditorState().read(\n () => {\n let resetObserver = false\n for (const [key, type] of mutations) {\n switch (type) {\n case 'created': {\n tableSetRef.current.add(key)\n resetObserver = true\n break\n }\n case 'destroyed': {\n tableSetRef.current.delete(key)\n resetObserver = true\n break\n }\n default:\n break\n }\n }\n if (resetObserver) {\n // Reset resize observers\n tableResizeObserver.disconnect()\n for (const tableKey of tableSetRef.current) {\n const { tableElement } = $getTableAndElementByKey(tableKey)\n tableResizeObserver.observe(tableElement)\n }\n setShouldListenMouseMove(tableSetRef.current.size > 0)\n }\n },\n { editor },\n )\n },\n { skipInitialization: false },\n ),\n )\n }, [editor, tableResizeObserver])\n\n const insertAction = (insertRow: boolean) => {\n editor.update(() => {\n if (tableCellDOMNodeRef.current) {\n const maybeTableNode = $getNearestNodeFromDOMNode(tableCellDOMNodeRef.current)\n maybeTableNode?.selectEnd()\n if (insertRow) {\n $insertTableRowAtSelection()\n setShownRow(false)\n } else {\n $insertTableColumnAtSelection()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!isEditable) {\n return null\n }\n\n return (\n <>\n {isShownRow && (\n <button\n aria-label=\"Add Row\"\n className={editorConfig.editorConfig.lexical.theme.tableAddRows}\n onClick={() => insertAction(true)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n {isShownColumn && (\n <button\n aria-label=\"Add Column\"\n className={editorConfig.editorConfig.lexical.theme.tableAddColumns}\n onClick={() => insertAction(false)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n </>\n )\n}\n\nfunction getMouseInfo(\n event: MouseEvent,\n editorConfig: EditorConfig,\n): {\n isOutside: boolean\n tableDOMNode: HTMLElement | null\n} {\n const target = event.target\n\n if (isHTMLElement(target)) {\n const tableDOMNode = target.closest<HTMLElement>(\n `td.${editorConfig.theme.tableCell}, th.${editorConfig.theme.tableCell}`,\n )\n\n const isOutside = !(\n tableDOMNode ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddRows}`) ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddColumns}`) ||\n target.closest<HTMLElement>(`div.${editorConfig.theme.tableCellResizer}`)\n )\n\n return { isOutside, tableDOMNode }\n } else {\n return { isOutside: true, tableDOMNode: null }\n }\n}\n\nexport function TableHoverActionsPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): null | React.ReactPortal {\n const isEditable = useLexicalEditable()\n\n if (!isEditable) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n", "'use client'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport debounce from './debounce.js'\n\n// Define the type for debounced function that includes cancel method\ninterface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n}\n\nexport function useDebounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n maxWait?: number,\n) {\n // Update the ref type to include cancel method\n const debouncedRef = useRef<DebouncedFunction<T> | null>(null)\n\n useEffect(() => {\n debouncedRef.current = debounce(fn, ms, { maxWait }) as DebouncedFunction<T>\n\n return () => {\n debouncedRef.current?.cancel()\n }\n }, [fn, ms, maxWait])\n\n const callback = useCallback((...args: Parameters<T>) => {\n if (debouncedRef.current) {\n debouncedRef.current(...args)\n }\n }, [])\n\n return callback\n}\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck - not worth it migrate jsdoc to tsdoc\n'use client'\n// Copied & modified from https://github.com/lodash/lodash/blob/main/src/debounce.ts\n/*\nThe MIT License\n\nCopyright JS Foundation and other contributors <https://js.foundation/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n */\n\n/** Error message constants. */\nconst FUNC_ERROR_TEXT = 'Expected a function'\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nconst nativeMax = Math.max,\n nativeMin = Math.min\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [sortOnOptions={}] The options object.\n * @param {boolean} [sortOnOptions.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [sortOnOptions.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [sortOnOptions.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n let lastArgs,\n lastCallTime,\n lastInvokeTime = 0,\n lastThis,\n leading = false,\n maxing = false,\n maxWait,\n result,\n timerID,\n trailing = true\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT)\n }\n wait = wait || 0\n if (typeof options === 'object') {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? nativeMax(options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc(time) {\n const args = lastArgs,\n thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerID = setTimeout(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait(time) {\n const timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall\n\n return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting\n }\n\n function shouldInvoke(time) {\n const timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (\n lastCallTime === undefined ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (maxing && timeSinceLastInvoke >= maxWait)\n )\n }\n\n function timerExpired() {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerID = setTimeout(timerExpired, remainingWait(time))\n }\n\n function trailingEdge(time) {\n timerID = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel() {\n if (timerID !== undefined) {\n clearTimeout(timerID)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerID = undefined\n }\n\n function flush() {\n return timerID === undefined ? result : trailingEdge(Date.now())\n }\n\n function debounced() {\n const time = Date.now(),\n isInvoking = shouldInvoke(time)\n\n // eslint-disable-next-line prefer-rest-params\n lastArgs = arguments\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerID === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerID)\n timerID = setTimeout(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerID === undefined) {\n timerID = setTimeout(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n return debounced\n}\n\n// eslint-disable-next-line no-restricted-exports\nexport default debounce\n", "'use client'\n\nimport type {\n EditorThemeClasses,\n Klass,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TablePlugin as LexicalReactTablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { INSERT_TABLE_COMMAND, TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical'\nimport { createContext, use, useEffect, useMemo, useState } from 'react'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport './index.scss'\n\nexport type CellContextShape = {\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n set: (\n cellEditorConfig: CellEditorConfig | null,\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null,\n ) => void\n}\n\nexport type CellEditorConfig = Readonly<{\n namespace: string\n nodes?: ReadonlyArray<Klass<LexicalNode>>\n onError: (error: Error, editor: LexicalEditor) => void\n readOnly?: boolean\n theme?: EditorThemeClasses\n}>\n\nexport const OPEN_TABLE_DRAWER_COMMAND: LexicalCommand<{}> = createCommand(\n 'OPEN_EMBED_DRAWER_COMMAND',\n)\n\nexport const CellContext = createContext<CellContextShape>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n set: () => {\n // Empty\n },\n})\n\nexport function TableContext({ children }: { children: JSX.Element }) {\n const [contextValue, setContextValue] = useState<{\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n }>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n })\n return (\n <CellContext\n value={useMemo(\n () => ({\n cellEditorConfig: contextValue.cellEditorConfig,\n cellEditorPlugins: contextValue.cellEditorPlugins,\n set: (cellEditorConfig, cellEditorPlugins) => {\n setContextValue({ cellEditorConfig, cellEditorPlugins })\n },\n }),\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\n )}\n >\n {children}\n </CellContext>\n )\n}\n\nexport const TablePlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const cellContext = use(CellContext)\n const editDepth = useEditDepth()\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n\n const drawerSlug = formatDrawerSlug({\n slug: 'lexical-table-create-' + uuid,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([TableNode, TableRowNode, TableCellNode])) {\n throw new Error(\n 'TablePlugin: TableNode, TableRowNode, or TableCellNode is not registered on editor',\n )\n }\n\n return mergeRegister(\n editor.registerCommand(\n OPEN_TABLE_DRAWER_COMMAND,\n () => {\n let rangeSelection: null | RangeSelection = null\n\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n rangeSelection = selection\n }\n })\n\n if (rangeSelection) {\n toggleDrawer()\n }\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [cellContext, editor, toggleDrawer])\n\n return (\n <React.Fragment>\n <FieldsDrawer\n drawerSlug={drawerSlug}\n drawerTitle=\"Create Table\"\n featureKey=\"experimental_table\"\n handleDrawerSubmit={(_fields, data) => {\n if (!data.columns || !data.rows) {\n return\n }\n\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {\n columns: String(data.columns),\n rows: String(data.rows),\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n <LexicalReactTablePlugin\n hasCellBackgroundColor={false}\n hasCellMerge\n hasHorizontalScroll={true}\n />\n </React.Fragment>\n )\n}\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport type { ExclusiveUploadFeatureProps } from '../server/index.js'\n\nimport { UploadIcon } from '../../../lexical/ui/icons/Upload/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from './drawer/commands.js'\nimport { $isUploadNode, UploadNode } from './nodes/UploadNode.js'\nimport { UploadPlugin } from './plugin/index.js'\n\nexport type UploadFeaturePropsClient = {\n collections: {\n [collection: string]: {\n hasExtraFields: boolean\n }\n }\n} & ExclusiveUploadFeatureProps\n\nexport const UploadFeatureClient = createClientFeature<UploadFeaturePropsClient>({\n nodes: [UploadNode],\n plugins: [\n {\n Component: UploadPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: UploadIcon,\n key: 'upload',\n keywords: ['upload', 'image', 'file', 'img', 'picture', 'photo', 'media'],\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: UploadIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isUploadNode(firstNode)\n },\n key: 'upload',\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UploadIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6667 4H5.33333C4.59695 4 4 4.59695 4 5.33333V14.6667C4 15.403 4.59695 16 5.33333 16H14.6667C15.403 16 16 15.403 16 14.6667V5.33333C16 4.59695 15.403 4 14.6667 4Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99984 9.33366C8.73622 9.33366 9.33317 8.73671 9.33317 8.00033C9.33317 7.26395 8.73622 6.66699 7.99984 6.66699C7.26346 6.66699 6.6665 7.26395 6.6665 8.00033C6.6665 8.73671 7.26346 9.33366 7.99984 9.33366Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 11.9995L13.9427 9.94214C13.6926 9.69218 13.3536 9.55176 13 9.55176C12.6464 9.55176 12.3074 9.69218 12.0573 9.94214L6 15.9995\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "'use client'\nimport type { DOMConversionMap, EditorConfig, LexicalEditor, LexicalNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type {\n Internal_UploadData,\n SerializedUploadNode,\n UploadData,\n} from '../../server/nodes/UploadNode.js'\n\nimport { $convertUploadElement } from '../../server/nodes/conversions.js'\nimport { UploadServerNode } from '../../server/nodes/UploadNode.js'\nimport { PendingUploadComponent } from '../component/pending/index.js'\n\nconst RawUploadComponent = React.lazy(() =>\n import('../../client/component/index.js').then((module) => ({ default: module.UploadComponent })),\n)\n\nexport class UploadNode extends UploadServerNode {\n static override clone(node: UploadServerNode): UploadServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n override decorate(editor?: LexicalEditor, config?: EditorConfig): JSX.Element {\n if ((this.__data as Internal_UploadData).pending) {\n return <PendingUploadComponent />\n }\n return (\n <RawUploadComponent\n className={config?.theme?.upload ?? 'LexicalEditorTheme__upload'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedUploadNode {\n return super.exportJSON()\n }\n}\n\nexport function $createUploadNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n\n return $applyNodeReplacement(new UploadNode({ data: data as UploadData }))\n}\n\nexport function $isUploadNode(node: LexicalNode | null | undefined): node is UploadNode {\n return node instanceof UploadNode\n}\n", "// This file contains functions used to convert dom elements to upload or pending upload lexical nodes. It requires the actual node\n// creation functions to be passed in to stay compatible with both client and server code.\nimport type { DOMConversionOutput } from 'lexical'\n\nimport ObjectID from 'bson-objectid'\n\nimport type { $createUploadNode } from '../../client/nodes/UploadNode.js'\nimport type { $createUploadServerNode, Internal_UploadData } from './UploadNode.js'\n\nexport function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\n return (\n img.parentElement != null &&\n img.parentElement.tagName === 'LI' &&\n img.previousSibling === null &&\n img.getAttribute('aria-roledescription') === 'checkbox'\n )\n}\n\nexport function $convertUploadElement(\n domNode: HTMLImageElement,\n $createNode: typeof $createUploadNode | typeof $createUploadServerNode,\n): DOMConversionOutput | null {\n if (domNode.hasAttribute('data-lexical-pending-upload-form-id')) {\n const formID = domNode.getAttribute('data-lexical-pending-upload-form-id')\n\n if (formID != null) {\n const node = $createNode({\n data: {\n pending: {\n formID,\n src: domNode.getAttribute('src') || '',\n },\n } as Internal_UploadData,\n })\n return { node }\n }\n }\n if (\n domNode.hasAttribute('data-lexical-upload-relation-to') &&\n domNode.hasAttribute('data-lexical-upload-id')\n ) {\n const id = domNode.getAttribute('data-lexical-upload-id')\n const relationTo = domNode.getAttribute('data-lexical-upload-relation-to')\n\n if (id != null && relationTo != null) {\n const node = $createNode({\n data: {\n fields: {},\n relationTo,\n value: id,\n },\n })\n return { node }\n }\n }\n\n // Create pending UploadNode. Auto-Upload functionality will then be handled by the node transform\n const node = $createNode({\n data: {\n pending: {\n formID: new ObjectID.default().toHexString(),\n src: domNode.getAttribute('src') || '',\n },\n } as Internal_UploadData,\n })\n\n return { node }\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type {\n CollectionSlug,\n DataFromCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in CollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\n/**\n * Internal use only - UploadData type that can contain a pending state\n * @internal\n */\nexport type Internal_UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n pending?: {\n /**\n * ID that corresponds to the bulk upload form ID\n */\n formID: string\n /**\n * src value of the image dom element\n */\n src: string\n }\n} & UploadData<TUploadExtraFieldsData>\n\n/**\n * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.\n * This type is for internal use only as it will be deprecated in the future.\n * @internal\n *\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: number | string | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode = StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'upload'> &\n UploadData\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n", "'use client'\n\nimport { ShimmerEffect } from '@payloadcms/ui'\n\nimport '../index.scss'\n\nexport const PendingUploadComponent = (): React.ReactNode => {\n return (\n <div className={'lexical-upload'}>\n <ShimmerEffect height={'95px'} width={'203px'} />\n </div>\n )\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useBulkUpload, useEffectEvent, useModal } from '@payloadcms/ui'\nimport ObjectID from 'bson-objectid'\nimport {\n $createRangeSelection,\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_LOW,\n createCommand,\n DROP_COMMAND,\n getDOMSelectionFromTarget,\n isHTMLElement,\n PASTE_COMMAND,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { Internal_UploadData, UploadData } from '../../server/nodes/UploadNode.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { useEnabledRelationships } from '../../../relationship/client/utils/useEnabledRelationships.js'\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $createUploadNode, $isUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\ndeclare global {\n interface DragEvent {\n rangeOffset?: number\n rangeParent?: Node\n }\n}\n\nfunction canDropImage(event: DragEvent): boolean {\n const target = event.target\n return !!(\n isHTMLElement(target) &&\n !target.closest('code, span.editor-image') &&\n isHTMLElement(target.parentElement) &&\n target.parentElement.closest('div.ContentEditable__root')\n )\n}\n\nfunction getDragSelection(event: DragEvent): null | Range | undefined {\n // Source: https://github.com/AlessioGr/lexical/blob/main/packages/lexical-playground/src/plugins/ImagesPlugin/index.tsx\n let range\n const domSelection = getDOMSelectionFromTarget(event.target)\n if (document.caretRangeFromPoint) {\n range = document.caretRangeFromPoint(event.clientX, event.clientY)\n } else if (event.rangeParent && domSelection !== null) {\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0)\n range = domSelection.getRangeAt(0)\n } else {\n throw Error(`Cannot get the selection when dragging`)\n }\n\n return range\n}\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\ntype FileToUpload = {\n alt?: string\n file: File\n /**\n * Bulk Upload Form ID that should be created, which can then be matched\n * against the node formID if the upload is successful\n */\n formID: string\n}\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n collectionSlugsBlacklist: clientProps?.disabledCollections,\n collectionSlugsWhitelist: clientProps?.enabledCollections,\n uploads: true,\n })\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n\n const { isModalOpen, openModal } = useModal()\n\n const openBulkUpload = useEffectEvent(({ files }: { files: FileToUpload[] }) => {\n if (files?.length === 0) {\n return\n }\n\n setInitialForms((initialForms) => [\n ...(initialForms ?? []),\n ...files.map((file) => ({\n file: file.file,\n formID: file.formID,\n })),\n ])\n\n if (!isModalOpen(bulkUploadDrawerSlug)) {\n if (!enabledCollectionSlugs.length || !enabledCollectionSlugs[0]) {\n return\n }\n\n setCollectionSlug(enabledCollectionSlugs[0])\n setSelectableCollections(enabledCollectionSlugs)\n\n setOnCancel(() => {\n // Remove all the pending upload nodes that were added but not uploaded\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n\n if ($isUploadNode(node)) {\n const nodeData = node.getData()\n if ((nodeData as Internal_UploadData)?.pending) {\n node.remove()\n }\n }\n }\n })\n })\n\n setOnSuccess((newDocs) => {\n const newDocsMap = new Map(newDocs.map((doc) => [doc.formID, doc]))\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n if ($isUploadNode(node)) {\n const nodeData: Internal_UploadData = node.getData()\n\n if (nodeData?.pending) {\n const newDoc = newDocsMap.get(nodeData.pending?.formID)\n if (newDoc) {\n node.replace(\n $createUploadNode({\n data: {\n id: new ObjectID.default().toHexString(),\n fields: {},\n relationTo: newDoc.collectionSlug,\n value: newDoc.doc.id,\n } as UploadData,\n }),\n )\n }\n }\n }\n }\n })\n })\n\n openModal(bulkUploadDrawerSlug)\n }\n })\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n /**\n * Handle auto-uploading files if you copy & paste an image dom element from the clipboard\n */\n editor.registerNodeTransform(UploadNode, (node) => {\n const nodeData: Internal_UploadData = node.getData()\n if (!nodeData?.pending) {\n return\n }\n\n async function upload() {\n let transformedImage: FileToUpload | null = null\n\n const src = nodeData?.pending?.src\n const formID = nodeData?.pending?.formID as string\n\n if (src?.startsWith('data:')) {\n // It's a base64-encoded image\n const mimeMatch = src.match(/data:(image\\/[a-zA-Z]+);base64,/)\n const mimeType = mimeMatch ? mimeMatch[1] : 'image/png' // Default to PNG if MIME type not found\n const base64Data = src.replace(/^data:image\\/[a-zA-Z]+;base64,/, '')\n const byteCharacters = atob(base64Data)\n const byteNumbers = new Array(byteCharacters.length)\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers)\n const file = new File([byteArray], 'pasted-image.' + mimeType?.split('/', 2)[1], {\n type: mimeType,\n })\n transformedImage = { alt: undefined, file, formID }\n } else if (src?.startsWith('http') || src?.startsWith('https')) {\n // It's an image URL\n const res = await fetch(src)\n const blob = await res.blob()\n const inferredFileName =\n src.split('/').pop() || 'pasted-image' + blob.type.split('/', 2)[1]\n const file = new File([blob], inferredFileName, {\n type: blob.type,\n })\n\n transformedImage = { alt: undefined, file, formID }\n }\n\n if (!transformedImage) {\n return\n }\n\n openBulkUpload({ files: [transformedImage] })\n }\n void upload()\n }),\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n // Pending UploadNodes are automatically created when importDOM is called. However, if you paste a file from your computer\n // directly, importDOM won't be called, as it's not a HTML dom element. So we need to handle that case here.\n\n if (!(event instanceof ClipboardEvent)) {\n return false\n }\n const clipboardData = event.clipboardData\n\n if (!clipboardData?.types?.length || clipboardData?.types?.includes('text/html')) {\n // HTML is handled through importDOM => registerNodeTransform for pending UploadNode\n return false\n }\n\n const files: FileToUpload[] = []\n if (clipboardData?.files?.length) {\n Array.from(clipboardData.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Insert a pending UploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Handle drag & drop of files from the desktop into the editor\n editor.registerCommand(\n DROP_COMMAND,\n (event) => {\n if (!(event instanceof DragEvent)) {\n return false\n }\n\n const dt = event.dataTransfer\n\n if (!dt?.types?.length) {\n return false\n }\n\n const files: FileToUpload[] = []\n if (dt?.files?.length) {\n Array.from(dt.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Prevent the default browser drop handling, which would open the file in the browser\n event.preventDefault()\n event.stopPropagation()\n\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n if (canDropImage(event)) {\n const range = getDragSelection(event)\n const selection = $createRangeSelection()\n if (range !== null && range !== undefined) {\n selection.applyDOMRange(range)\n }\n $setSelection(selection)\n\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { ListDrawerProps } from '@payloadcms/ui'\nimport type { LexicalEditor } from 'lexical'\nimport type { UploadCollectionSlug } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { toast } from '@payloadcms/ui'\nimport { $getNodeByKey, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useLexicalListDrawer } from '../../../../utilities/fieldsDrawer/useLexicalListDrawer.js'\nimport { $createUploadNode } from '../nodes/UploadNode.js'\nimport { INSERT_UPLOAD_COMMAND } from '../plugin/index.js'\nimport { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from './commands.js'\n\nconst insertUpload = ({\n editor,\n relationTo,\n replaceNodeKey,\n value,\n}: {\n editor: LexicalEditor\n relationTo: string\n replaceNodeKey: null | string\n value: number | string\n}) => {\n if (!replaceNodeKey) {\n editor.dispatchCommand(INSERT_UPLOAD_COMMAND, {\n // @ts-expect-error - TODO: fix this\n fields: null,\n relationTo,\n value,\n })\n } else {\n editor.update(() => {\n const node = $getNodeByKey(replaceNodeKey)\n if (node) {\n node.replace(\n $createUploadNode({\n data: {\n // @ts-expect-error - TODO: fix this\n fields: null,\n relationTo,\n value,\n },\n }),\n )\n }\n })\n }\n}\n\ntype Props = {\n enabledCollectionSlugs: UploadCollectionSlug[]\n}\n\nconst UploadDrawerComponent: React.FC<Props> = ({ enabledCollectionSlugs }) => {\n const [editor] = useLexicalComposerContext()\n\n const [replaceNodeKey, setReplaceNodeKey] = useState<null | string>(null)\n\n const { closeListDrawer, ListDrawer, openListDrawer } = useLexicalListDrawer({\n collectionSlugs: enabledCollectionSlugs,\n uploads: true,\n })\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_UPLOAD_WITH_DRAWER_COMMAND,\n (payload) => {\n setReplaceNodeKey(payload?.replace ? payload?.replace.nodeKey : null)\n openListDrawer()\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor, openListDrawer])\n\n const onSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n ({ collectionSlug, doc }) => {\n closeListDrawer()\n insertUpload({\n editor,\n relationTo: collectionSlug,\n replaceNodeKey,\n value: doc.id,\n })\n },\n [editor, closeListDrawer, replaceNodeKey],\n )\n\n return <ListDrawer onSelect={onSelect} />\n}\n\nconst UploadDrawerComponentFallback: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_UPLOAD_WITH_DRAWER_COMMAND,\n () => {\n toast.error('No upload collections enabled')\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n\nexport const UploadDrawer = ({ enabledCollectionSlugs }: Props): React.ReactNode => {\n if (!enabledCollectionSlugs?.length) {\n return <UploadDrawerComponentFallback />\n }\n\n return <UploadDrawerComponent enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\n\nimport type { RichTextFieldClient } from 'payload'\n\nimport { ShimmerEffect, useConfig } from '@payloadcms/ui'\nimport React, { lazy, Suspense, useEffect, useState } from 'react'\n\nimport type { FeatureProviderClient } from '../features/typesClient.js'\nimport type { SanitizedClientEditorConfig } from '../lexical/config/types.js'\nimport type { LexicalRichTextFieldProps } from '../types.js'\n\nimport { defaultEditorLexicalConfig } from '../lexical/config/client/default.js'\nimport { loadClientFeatures } from '../lexical/config/client/loader.js'\nimport { sanitizeClientEditorConfig } from '../lexical/config/client/sanitize.js'\n\nconst RichTextEditor = lazy(() =>\n import('./Field.js').then((module) => ({ default: module.RichText })),\n)\n\nexport const RichTextField: React.FC<LexicalRichTextFieldProps> = (props) => {\n const {\n admin = {},\n clientFeatures,\n featureClientImportMap = {},\n featureClientSchemaMap,\n field,\n lexicalEditorConfig = defaultEditorLexicalConfig,\n schemaPath,\n } = props\n\n const { config } = useConfig()\n\n const [finalSanitizedEditorConfig, setFinalSanitizedEditorConfig] =\n useState<null | SanitizedClientEditorConfig>(null)\n\n useEffect(() => {\n if (finalSanitizedEditorConfig) {\n return\n }\n\n const featureProvidersLocal: FeatureProviderClient<any, any>[] = []\n for (const clientFeature of Object.values(clientFeatures)) {\n if (!clientFeature.clientFeatureProvider) {\n continue\n }\n featureProvidersLocal.push(\n clientFeature.clientFeatureProvider(clientFeature.clientFeatureProps),\n ) // Execute the clientFeatureProvider function here, as the server cannot execute functions imported from use client files\n }\n\n const resolvedClientFeatures = loadClientFeatures({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field: field as RichTextFieldClient,\n schemaPath: schemaPath ?? field.name,\n unSanitizedEditorConfig: {\n features: featureProvidersLocal,\n lexical: lexicalEditorConfig,\n },\n })\n\n setFinalSanitizedEditorConfig(\n sanitizeClientEditorConfig(resolvedClientFeatures, lexicalEditorConfig, admin),\n )\n }, [\n admin,\n clientFeatures,\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field,\n finalSanitizedEditorConfig,\n lexicalEditorConfig,\n schemaPath,\n ]) // TODO: Optimize this and use useMemo for this in the future. This might break sub-richtext-blocks from the blocks feature. Need to investigate\n\n return (\n <Suspense fallback={<ShimmerEffect height=\"35vh\" />}>\n {finalSanitizedEditorConfig && (\n <RichTextEditor {...props} editorConfig={finalSanitizedEditorConfig} />\n )}\n </Suspense>\n )\n}\n", "import type { EditorThemeClasses } from 'lexical'\n\nexport const LexicalEditorTheme: EditorThemeClasses = {\n block: 'LexicalEditorTheme__block',\n blockCursor: 'LexicalEditorTheme__blockCursor',\n characterLimit: 'LexicalEditorTheme__characterLimit',\n code: 'LexicalEditorTheme__code',\n inlineBlock: 'LexicalEditorTheme__inlineBlock',\n\n heading: {\n h1: 'LexicalEditorTheme__h1',\n h2: 'LexicalEditorTheme__h2',\n h3: 'LexicalEditorTheme__h3',\n h4: 'LexicalEditorTheme__h4',\n h5: 'LexicalEditorTheme__h5',\n h6: 'LexicalEditorTheme__h6',\n },\n hr: 'LexicalEditorTheme__hr',\n hrSelected: 'LexicalEditorTheme__hrSelected',\n indent: 'LexicalEditorTheme__indent',\n link: 'LexicalEditorTheme__link',\n list: {\n checklist: 'LexicalEditorTheme__checklist',\n listitem: 'LexicalEditorTheme__listItem',\n listitemChecked: 'LexicalEditorTheme__listItemChecked',\n listitemUnchecked: 'LexicalEditorTheme__listItemUnchecked',\n nested: {\n listitem: 'LexicalEditorTheme__nestedListItem',\n },\n olDepth: [\n 'LexicalEditorTheme__ol1',\n 'LexicalEditorTheme__ol2',\n 'LexicalEditorTheme__ol3',\n 'LexicalEditorTheme__ol4',\n 'LexicalEditorTheme__ol5',\n ],\n ul: 'LexicalEditorTheme__ul',\n },\n ltr: 'LexicalEditorTheme__ltr',\n mark: 'LexicalEditorTheme__mark',\n markOverlap: 'LexicalEditorTheme__markOverlap',\n paragraph: 'LexicalEditorTheme__paragraph',\n placeholder: 'LexicalEditorTheme__placeholder',\n quote: 'LexicalEditorTheme__quote',\n relationship: 'LexicalEditorTheme__relationship',\n rtl: 'LexicalEditorTheme__rtl',\n tab: 'LexicalEditorTheme__tabNode',\n table: 'LexicalEditorTheme__table',\n tableAddColumns: 'LexicalEditorTheme__tableAddColumns',\n tableAddRows: 'LexicalEditorTheme__tableAddRows',\n tableAlignment: {\n center: 'LexicalEditorTheme__tableAlignmentCenter',\n right: 'LexicalEditorTheme__tableAlignmentRight',\n },\n tableCell: 'LexicalEditorTheme__tableCell',\n tableCellActionButton: 'LexicalEditorTheme__tableCellActionButton',\n tableCellActionButtonContainer: 'LexicalEditorTheme__tableCellActionButtonContainer',\n tableCellHeader: 'LexicalEditorTheme__tableCellHeader',\n tableCellResizer: 'LexicalEditorTheme__tableCellResizer',\n tableCellSelected: 'LexicalEditorTheme__tableCellSelected',\n tableFrozenColumn: 'LexicalEditorTheme__tableFrozenColumn',\n tableRowStriping: 'LexicalEditorTheme__tableRowStriping',\n tableScrollableWrapper: 'LexicalEditorTheme__tableScrollableWrapper',\n tableSelected: 'LexicalEditorTheme__tableSelected',\n tableSelection: 'LexicalEditorTheme__tableSelection',\n text: {\n bold: 'LexicalEditorTheme__textBold',\n code: 'LexicalEditorTheme__textCode',\n italic: 'LexicalEditorTheme__textItalic',\n strikethrough: 'LexicalEditorTheme__textStrikethrough',\n subscript: 'LexicalEditorTheme__textSubscript',\n superscript: 'LexicalEditorTheme__textSuperscript',\n underline: 'LexicalEditorTheme__textUnderline',\n underlineStrikethrough: 'LexicalEditorTheme__textUnderlineStrikethrough',\n },\n upload: 'LexicalEditorTheme__upload',\n}\n", "'use client'\nimport type { EditorConfig as LexicalEditorConfig } from 'lexical'\n\nimport { LexicalEditorTheme } from '../../theme/EditorTheme.js'\n\nexport const defaultEditorLexicalConfig: LexicalEditorConfig = {\n namespace: 'lexical',\n theme: LexicalEditorTheme,\n}\n", "'use client'\n\nimport type { ClientConfig, RichTextFieldClient } from 'payload'\n\nimport type {\n ClientFeatureProviderMap,\n ResolvedClientFeature,\n ResolvedClientFeatureMap,\n} from '../../../features/typesClient.js'\nimport type { FeatureClientSchemaMap } from '../../../types.js'\nimport type { ClientEditorConfig } from '../types.js'\n\n/**\n * This function expects client functions to ALREADY be ordered & dependencies checked on the server\n * @param unSanitizedEditorConfig\n */\nexport function loadClientFeatures({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field,\n schemaPath,\n unSanitizedEditorConfig,\n}: {\n config: ClientConfig\n featureClientImportMap: Record<string, any>\n featureClientSchemaMap: FeatureClientSchemaMap\n field?: RichTextFieldClient\n schemaPath: string\n unSanitizedEditorConfig: ClientEditorConfig\n}): ResolvedClientFeatureMap {\n const featureProviderMap: ClientFeatureProviderMap = new Map()\n\n for (const featureProvider of unSanitizedEditorConfig.features) {\n if (\n !featureProvider?.clientFeatureProps?.featureKey ||\n featureProvider?.clientFeatureProps?.order === undefined ||\n featureProvider?.clientFeatureProps?.order === null\n ) {\n throw new Error(\n 'A Feature you have installed does not return the client props as clientFeatureProps. Please make sure to always return those props, even if they are null, as other important props like order and featureKey are later on injected.',\n )\n }\n featureProviderMap.set(featureProvider.clientFeatureProps.featureKey, featureProvider)\n }\n\n // sort unSanitizedEditorConfig.features by order\n unSanitizedEditorConfig.features = unSanitizedEditorConfig.features.sort(\n (a, b) => a.clientFeatureProps.order - b.clientFeatureProps.order,\n )\n\n const resolvedFeatures: ResolvedClientFeatureMap = new Map()\n\n // Make sure all dependencies declared in the respective features exist\n let loaded = 0\n for (const featureProvider of unSanitizedEditorConfig.features) {\n const feature: Partial<ResolvedClientFeature<any>> =\n typeof featureProvider.feature === 'function'\n ? featureProvider.feature({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n })\n : featureProvider.feature\n\n feature.key = featureProvider.clientFeatureProps.featureKey\n feature.order = loaded\n\n resolvedFeatures.set(\n featureProvider.clientFeatureProps.featureKey,\n feature as ResolvedClientFeature<any>,\n )\n\n loaded++\n }\n\n return resolvedFeatures\n}\n", "'use client'\n\nimport type { EditorConfig as LexicalEditorConfig } from 'lexical'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { ToolbarGroup } from '../../../features/toolbars/types.js'\nimport type {\n ResolvedClientFeatureMap,\n SanitizedClientFeatures,\n} from '../../../features/typesClient.js'\nimport type { LexicalFieldAdminClientProps } from '../../../types.js'\nimport type { SanitizedClientEditorConfig } from '../types.js'\n\nexport const sanitizeClientFeatures = (\n features: ResolvedClientFeatureMap,\n): SanitizedClientFeatures => {\n const sanitized: SanitizedClientFeatures = {\n enabledFeatures: [],\n enabledFormats: [],\n markdownTransformers: [],\n nodes: [],\n plugins: [],\n providers: [],\n slashMenu: {\n dynamicGroups: [],\n groups: [],\n },\n toolbarFixed: {\n groups: [],\n },\n toolbarInline: {\n groups: [],\n },\n }\n\n // Allow customization of groups for toolbarFixed\n let customGroups: Record<string, Partial<ToolbarGroup>> = {}\n features.forEach((feature) => {\n if (feature.key === 'toolbarFixed' && feature.sanitizedClientFeatureProps?.customGroups) {\n customGroups = {\n ...customGroups,\n ...feature.sanitizedClientFeatureProps.customGroups,\n }\n }\n })\n\n if (!features?.size) {\n return sanitized\n }\n\n features.forEach((feature) => {\n if (feature.providers?.length) {\n sanitized.providers = sanitized.providers.concat(feature.providers)\n }\n\n if (feature.enableFormats?.length) {\n sanitized.enabledFormats.push(...feature.enableFormats)\n }\n\n if (feature.nodes?.length) {\n // Important: do not use concat\n for (const node of feature.nodes) {\n sanitized.nodes.push(node)\n }\n }\n if (feature.plugins?.length) {\n feature.plugins.forEach((plugin, i) => {\n sanitized.plugins?.push({\n clientProps: feature.sanitizedClientFeatureProps,\n Component: plugin.Component as any, // Appeases strict: true\n key: feature.key + i,\n position: plugin.position,\n })\n })\n }\n\n if (feature.toolbarInline?.groups?.length) {\n for (const group of feature.toolbarInline.groups) {\n // 1. find the group with the same key or create new one\n let foundGroup = sanitized.toolbarInline.groups.find(\n (sanitizedGroup) => sanitizedGroup.key === group.key,\n )\n if (!foundGroup) {\n foundGroup = {\n ...group,\n items: [],\n }\n } else {\n sanitized.toolbarInline.groups = sanitized.toolbarInline.groups.filter(\n (sanitizedGroup) => sanitizedGroup.key !== group.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (group?.items?.length) {\n foundGroup.items = foundGroup.items.concat(group.items)\n }\n sanitized.toolbarInline?.groups.push(foundGroup)\n }\n }\n\n if (feature.toolbarFixed?.groups?.length) {\n for (const group of feature.toolbarFixed.groups) {\n // 1. find the group with the same key or create new one\n let foundGroup = sanitized.toolbarFixed.groups.find(\n (sanitizedGroup) => sanitizedGroup.key === group.key,\n )\n if (!foundGroup) {\n foundGroup = {\n ...group,\n items: [],\n }\n } else {\n sanitized.toolbarFixed.groups = sanitized.toolbarFixed.groups.filter(\n (sanitizedGroup) => sanitizedGroup.key !== group.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (group?.items?.length) {\n foundGroup.items = foundGroup.items.concat(group.items)\n }\n sanitized.toolbarFixed?.groups.push(foundGroup)\n }\n }\n\n if (feature.slashMenu?.groups) {\n if (feature.slashMenu.dynamicGroups?.length) {\n sanitized.slashMenu.dynamicGroups = sanitized.slashMenu.dynamicGroups.concat(\n feature.slashMenu.dynamicGroups,\n )\n }\n\n for (const optionGroup of feature.slashMenu.groups) {\n // 1. find the group with the same name or create new one\n let group = sanitized.slashMenu.groups.find((group) => group.key === optionGroup.key)\n if (!group) {\n group = {\n ...optionGroup,\n items: [],\n }\n } else {\n sanitized.slashMenu.groups = sanitized.slashMenu.groups.filter(\n (group) => group.key !== optionGroup.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (optionGroup?.items?.length) {\n group.items = group.items.concat(optionGroup.items)\n }\n sanitized.slashMenu.groups.push(group)\n }\n }\n\n if (feature.markdownTransformers?.length) {\n // Important: do not use concat\n for (const transformer of feature.markdownTransformers) {\n if (typeof transformer === 'function') {\n sanitized.markdownTransformers.push(\n transformer({\n allNodes: sanitized.nodes,\n allTransformers: sanitized.markdownTransformers,\n }),\n )\n } else {\n sanitized.markdownTransformers.push(transformer)\n }\n }\n }\n sanitized.enabledFeatures.push(feature.key)\n })\n\n // Apply custom group configurations to toolbarFixed groups\n if (Object.keys(customGroups).length > 0) {\n sanitized.toolbarFixed.groups = sanitized.toolbarFixed.groups.map((group) => {\n const customConfig = customGroups[group.key]\n if (customConfig) {\n return deepMerge(group, customConfig)\n }\n return group\n })\n }\n\n // Sort sanitized.toolbarInline.groups by order property\n sanitized.toolbarInline.groups.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n // Sort sanitized.toolbarFixed.groups by order property\n sanitized.toolbarFixed.groups.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n\n // Sort sanitized.toolbarInline.groups.[group].entries by order property\n for (const group of sanitized.toolbarInline.groups) {\n group.items.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n }\n\n // Sort sanitized.toolbarFixed.groups.[group].entries by order property\n for (const group of sanitized.toolbarFixed.groups) {\n group.items.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n }\n\n return sanitized\n}\n\nexport function sanitizeClientEditorConfig(\n resolvedClientFeatureMap: ResolvedClientFeatureMap,\n lexical?: LexicalEditorConfig,\n admin?: LexicalFieldAdminClientProps,\n): SanitizedClientEditorConfig {\n return {\n admin,\n features: sanitizeClientFeatures(resolvedClientFeatureMap),\n lexical: lexical!,\n resolvedFeatureMap: resolvedClientFeatureMap,\n }\n}\n", "'use client'\n\n/**\n * @deprecated - remove in 4.0. lexical already exports an isHTMLElement utility\n */\nexport function isHTMLElement(x: unknown): x is HTMLElement {\n return x instanceof HTMLElement\n}\n", "'use client'\nexport function joinClasses(...args: Array<boolean | null | string | undefined>): string {\n return args.filter(Boolean).join(' ')\n}\n", "'use client'\ntype Force = [number, number]\ntype Listener = (force: Force, e: TouchEvent) => void\ninterface ElementValues {\n handleTouchend: (e: TouchEvent) => void\n handleTouchstart: (e: TouchEvent) => void\n listeners: Set<Listener>\n start: Force | null\n}\n\nconst elements = new WeakMap<HTMLElement, ElementValues>()\n\nfunction readTouch(e: TouchEvent): [number, number] | null {\n const touch = e.changedTouches[0]\n if (touch === undefined) {\n return null\n }\n return [touch.clientX, touch.clientY]\n}\n\nfunction addListener(element: HTMLElement, cb: Listener): () => void {\n let elementValues = elements.get(element)\n if (elementValues === undefined) {\n const listeners = new Set<Listener>()\n const handleTouchstart = (e: TouchEvent): void => {\n if (elementValues !== undefined) {\n elementValues.start = readTouch(e)\n }\n }\n const handleTouchend = (e: TouchEvent): void => {\n if (elementValues === undefined) {\n return\n }\n const { start } = elementValues\n if (start === null) {\n return\n }\n const end = readTouch(e)\n for (const listener of listeners) {\n if (end !== null) {\n listener([end[0] - start[0], end[1] - start[1]], e)\n }\n }\n }\n element.addEventListener('touchstart', handleTouchstart)\n element.addEventListener('touchend', handleTouchend)\n\n elementValues = {\n handleTouchend,\n handleTouchstart,\n listeners,\n start: null,\n }\n elements.set(element, elementValues)\n }\n elementValues.listeners.add(cb)\n return () => {\n deleteListener(element, cb)\n }\n}\n\nfunction deleteListener(element: HTMLElement, cb: Listener): void {\n const elementValues = elements.get(element)\n if (elementValues === undefined) {\n return\n }\n const { listeners } = elementValues\n listeners.delete(cb)\n if (listeners.size === 0) {\n elements.delete(element)\n element.removeEventListener('touchstart', elementValues.handleTouchstart)\n element.removeEventListener('touchend', elementValues.handleTouchend)\n }\n}\n\nexport function addSwipeLeftListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (x < 0 && -x > Math.abs(y)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeRightListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (x > 0 && x > Math.abs(y)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeUpListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (y < 0 && -y > Math.abs(x)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeDownListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (y > 0 && y > Math.abs(x)) {\n cb(x, e)\n }\n })\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockEditButton = () => {\n const { EditButton } = useInlineBlockComponentContext()\n\n return EditButton ? <EditButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockRemoveButton = () => {\n const { RemoveButton } = useInlineBlockComponentContext()\n\n return RemoveButton ? <RemoveButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockLabel = () => {\n const { Label } = useInlineBlockComponentContext()\n\n return Label ? <Label /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockContainer = ({ children }: { children: React.ReactNode }) => {\n const { InlineBlockContainer } = useInlineBlockComponentContext()\n\n return InlineBlockContainer ? <InlineBlockContainer>{children}</InlineBlockContainer> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { type BlockCollapsibleProps, useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockCollapsible: React.FC<BlockCollapsibleProps> = (props) => {\n const { children, ...rest } = props\n const { BlockCollapsible } = useBlockComponentContext()\n\n return BlockCollapsible ? <BlockCollapsible {...rest}>{children}</BlockCollapsible> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockEditButton = () => {\n const { EditButton } = useBlockComponentContext()\n\n return EditButton ? <EditButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockRemoveButton = () => {\n const { RemoveButton } = useBlockComponentContext()\n\n return RemoveButton ? <RemoveButton /> : null\n}\n", "import { stringify } from 'qs-esm'\n\nimport type { HTMLPopulateFn } from '../lexicalToHtml/async/types.js'\n\nexport const getRestPopulateFn: (args: {\n /**\n * E.g. `http://localhost:3000/api`\n */\n apiURL: string\n depth?: number\n draft?: boolean\n locale?: string\n}) => HTMLPopulateFn = ({ apiURL, depth, draft, locale }) => {\n const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => {\n const query = stringify(\n { depth: depth ?? 0, draft: draft ?? false, locale, select },\n { addQueryPrefix: true },\n )\n\n const res = await fetch(`${apiURL}/${collectionSlug}/${id}${query}`, {\n credentials: 'include',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n }).then((res) => res.json())\n\n return res\n }\n\n return populateFn\n}\n", "import type { BlockJSX } from 'payload'\n\n/**\n * @internal\n * @experimental - API may change in minor releases\n */\nexport const codeConverter: BlockJSX = {\n customEndRegex: {\n optional: true,\n regExp: /[ \\t]*```$/,\n },\n customStartRegex: /^[ \\t]*```(\\w+)?/,\n doNotTrimChildren: true,\n export: ({ fields }) => {\n const isSingleLine = !fields.code.includes('\\n') && !fields.language?.length\n if (isSingleLine) {\n return '```' + fields.code + '```'\n }\n\n return '```' + (fields.language || '') + (fields.code ? '\\n' + fields.code : '') + '\\n' + '```'\n },\n import: ({ children, closeMatch, openMatch }) => {\n const language = openMatch?.[1]\n\n // Removed first and last \\n from children if present\n if (children.startsWith('\\n')) {\n children = children.slice(1)\n }\n if (children.endsWith('\\n')) {\n children = children.slice(0, -1)\n }\n\n const isSingleLineAndComplete =\n !!closeMatch && !children.includes('\\n') && openMatch?.input?.trim() !== '```' + language\n\n if (isSingleLineAndComplete) {\n return {\n code: language + (children?.length ? children : ''), // No need to add space to children as they are not trimmed\n language: '',\n }\n }\n\n return {\n code: children,\n language,\n }\n },\n}\n", "'use client'\n\nimport type { CodeFieldClient, CodeFieldClientProps } from 'payload'\n\nimport { CodeField, useFormFields } from '@payloadcms/ui'\nimport React, { useId, useMemo } from 'react'\n\nimport { defaultLanguages } from './defaultLanguages.js'\n\nexport type AdditionalCodeComponentProps = {\n /**\n * @default first key of the `languages` prop\n */\n defaultLanguage?: string\n /**\n * @default all languages supported by Monaco Editor\n */\n languages?: Record<string, string>\n /**\n * Override the name of the block.\n *\n * @default 'Code'\n */\n slug?: string\n /**\n * Configure typescript settings for the editor\n */\n typescript?: {\n /**\n * By default, the editor will not perform semantic validation. This means that\n * while syntax errors will be highlighted, other issues like missing imports or incorrect\n * types will not be.\n *\n * @default false\n */\n enableSemanticValidation?: boolean\n /**\n * Additional types to fetch and include in the editor for autocompletion.\n *\n * For example, to include types for payload, you would set this to\n *\n * [{ url: 'https://unpkg.com/payload@latest/dist/index.d.ts', filePath: 'file:///node_modules/payload/index.d.ts' }]\n */\n fetchTypes?: Array<{\n filePath: string\n url: string\n }>\n /**\n * @default undefined\n */\n paths?: Record<string, string[]>\n /**\n * @default \"ESNext\"\n */\n target?: string\n /**\n * @default ['node_modules/@types']\n */\n typeRoots?: string[]\n }\n}\n\nexport const CodeComponent: React.FC<AdditionalCodeComponentProps & CodeFieldClientProps> = ({\n autoComplete,\n field,\n forceRender,\n languages = defaultLanguages,\n path,\n permissions,\n readOnly,\n renderedBlocks,\n schemaPath,\n typescript,\n validate,\n}) => {\n const languageField = useFormFields(([fields]) => fields['language'])\n\n const language: string =\n (languageField?.value as string) || (languageField?.initialValue as string) || 'typescript'\n\n // unique id per component instance to ensure Monaco creates a distinct model\n // for each TypeScript code block. Using React's useId is SSR-safe and builtin.\n const instanceId = useId()\n\n const label = languages[language]\n\n const props: CodeFieldClient = useMemo<CodeFieldClient>(\n () => ({\n ...field,\n type: 'code',\n admin: {\n ...field.admin,\n editorOptions: {},\n editorProps: {\n // If typescript is set, @monaco-editor/react needs to set the URI to a .ts or .tsx file when it calls createModel().\n // Provide a unique defaultPath per instance so Monaco doesn't reuse the same model\n // across multiple code block instances. We use field.name + instanceId for debugability.\n defaultPath: language === 'ts' ? `file-${field.name}-${instanceId}.tsx` : undefined,\n },\n language,\n },\n }),\n [field, language, instanceId],\n )\n\n const key = `${field.name}-${language}-${label}`\n\n return (\n props && (\n <CodeField\n autoComplete={autoComplete}\n field={props}\n forceRender={forceRender}\n key={key}\n onMount={(_editor, monaco) => {\n monaco.editor.defineTheme('vs-dark', {\n base: 'vs-dark',\n colors: {\n 'editor.background': '#222222',\n },\n inherit: true,\n rules: [],\n })\n\n monaco.editor.defineTheme('vs', {\n base: 'vs',\n colors: {\n 'editor.background': '#f5f5f5',\n },\n inherit: true,\n rules: [],\n })\n monaco.languages.typescript.typescriptDefaults.setCompilerOptions({\n allowNonTsExtensions: true,\n // Set module resolution to NodeJs to enable autocompletion\n allowJs: true,\n allowSyntheticDefaultImports: true,\n esModuleInterop: true,\n jsx: monaco.languages.typescript.JsxEmit.React,\n moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,\n noEmit: true,\n paths: typescript?.paths,\n reactNamespace: 'React',\n target: monaco.languages.typescript.ScriptTarget[\n typescript?.target ?? ('ESNext' as any)\n ] as any,\n typeRoots: typescript?.typeRoots ?? ['node_modules/@types'],\n })\n\n monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: typescript?.enableSemanticValidation ? false : true,\n noSyntaxValidation: false,\n })\n\n const run = async () => {\n if (\n typescript?.fetchTypes &&\n Array.isArray(typescript.fetchTypes) &&\n typescript.fetchTypes.length > 0\n ) {\n await Promise.all(\n typescript.fetchTypes.map(async (type) => {\n const types = await fetch(type.url)\n const typesText = await types.text()\n monaco.languages.typescript.typescriptDefaults.addExtraLib(\n typesText,\n type.filePath,\n )\n }),\n )\n }\n }\n void run()\n }}\n path={path}\n permissions={permissions}\n readOnly={readOnly}\n renderedBlocks={renderedBlocks}\n schemaPath={schemaPath}\n validate={validate}\n />\n )\n )\n}\n", "/**\n * Source: https://github.com/microsoft/monaco-editor/tree/main/src/basic-languages\n */\nexport const defaultLanguages: Record<string, string> = {\n abap: 'ABAP',\n apex: 'Apex',\n azcli: 'Azure CLI',\n bat: 'Batch',\n bicep: 'Bicep',\n cameligo: 'CameLIGO',\n clojure: 'Clojure',\n coffee: 'CoffeeScript',\n cpp: 'C++',\n csharp: 'C#',\n csp: 'CSP',\n css: 'CSS',\n cypher: 'Cypher',\n dart: 'Dart',\n dockerfile: 'Dockerfile',\n ecl: 'ECL',\n elixir: 'Elixir',\n flow9: 'Flow9',\n freemarker2: 'FreeMarker 2',\n fsharp: 'F#',\n go: 'Go',\n graphql: 'GraphQL',\n handlebars: 'Handlebars',\n hcl: 'HCL',\n html: 'HTML',\n ini: 'INI',\n java: 'Java',\n javascript: 'JavaScript',\n julia: 'Julia',\n kotlin: 'Kotlin',\n less: 'Less',\n lexon: 'Lexon',\n liquid: 'Liquid',\n lua: 'Lua',\n m3: 'M3',\n markdown: 'Markdown',\n mdx: 'MDX',\n mips: 'MIPS',\n msdax: 'DAX',\n mysql: 'MySQL',\n 'objective-c': 'Objective-C',\n pascal: 'Pascal',\n pascaligo: 'PascaLIGO',\n perl: 'Perl',\n pgsql: 'PostgreSQL',\n php: 'PHP',\n pla: 'PLA',\n plaintext: 'Plain Text',\n postiats: 'Postiats',\n powerquery: 'Power Query',\n powershell: 'PowerShell',\n protobuf: 'Protobuf',\n pug: 'Pug',\n python: 'Python',\n qsharp: 'Q#',\n r: 'R',\n razor: 'Razor',\n redis: 'Redis',\n redshift: 'Amazon Redshift',\n restructuredtext: 'reStructuredText',\n ruby: 'Ruby',\n rust: 'Rust',\n sb: 'Small Basic',\n scala: 'Scala',\n scheme: 'Scheme',\n scss: 'SCSS',\n shell: 'Shell',\n solidity: 'Solidity',\n sophia: 'Sophia',\n sparql: 'SPARQL',\n sql: 'SQL',\n st: 'Structured Text',\n swift: 'Swift',\n systemverilog: 'SystemVerilog',\n tcl: 'Tcl',\n twig: 'Twig',\n typescript: 'TypeScript',\n typespec: 'TypeSpec',\n vb: 'Visual Basic',\n wgsl: 'WGSL',\n xml: 'XML',\n yaml: 'YAML',\n}\n", "'use client'\nimport type { ComboboxEntry } from '@payloadcms/ui'\nimport type {} from 'payload'\n\nimport './index.scss'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n ChevronIcon,\n Combobox,\n CopyToClipboard,\n PopupList,\n RenderFields,\n useForm,\n useFormFields,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { AdditionalCodeComponentProps } from './Code.js'\n\nimport { CodeBlockIcon } from '../../../../../lexical/ui/icons/CodeBlock/index.js'\nimport { useBlockComponentContext } from '../../../client/component/BlockContent.js'\nimport { Collapse } from './Collapse/index.js'\nimport { defaultLanguages } from './defaultLanguages.js'\nimport { FloatingCollapse } from './FloatingCollapse/index.js'\n\nconst baseClass = 'payload-richtext-code-block'\nexport const CodeBlockBlockComponent: React.FC<Pick<AdditionalCodeComponentProps, 'languages'>> = (\n args,\n) => {\n const { languages: languagesFromProps } = args\n const languages = languagesFromProps || defaultLanguages\n\n const { BlockCollapsible, formSchema, RemoveButton } = useBlockComponentContext()\n const { setModified } = useForm()\n const { t } = useTranslation()\n\n const { codeField } = useFormFields(([fields]) => ({\n codeField: fields?.code,\n }))\n\n const { selectedLanguageField, setSelectedLanguage } = useFormFields(([fields, dispatch]) => ({\n selectedLanguageField: fields?.language,\n setSelectedLanguage: (language: string) => {\n dispatch({\n type: 'UPDATE',\n path: 'language',\n value: language,\n })\n setModified(true)\n },\n }))\n\n const selectedLanguageLabel = languages[selectedLanguageField?.value as keyof typeof languages]\n\n const isEditable = useLexicalEditable()\n\n const languageEntries = React.useMemo<ComboboxEntry[]>(() => {\n return Object.entries(languages).map(([languageCode, languageLabel]) => ({\n name: `${languageCode} ${languageLabel}`,\n Component: (\n <PopupList.Button\n active={false}\n disabled={false}\n onClick={() => {\n setSelectedLanguage(languageCode)\n }}\n >\n <span className={`${baseClass}__language-code`} data-language={languageCode}>\n {languageLabel}\n </span>\n </PopupList.Button>\n ),\n }))\n }, [languages, setSelectedLanguage])\n\n return (\n <BlockCollapsible\n Actions={\n <div className={`${baseClass}__actions`}>\n <Combobox\n button={\n <div\n className={`${baseClass}__language-selector-button`}\n data-selected-language={selectedLanguageField?.value}\n >\n <span>{selectedLanguageLabel}</span>\n <ChevronIcon className={`${baseClass}__chevron`} />\n </div>\n }\n buttonType=\"custom\"\n className={`${baseClass}__language-selector`}\n disabled={!isEditable}\n entries={languageEntries}\n horizontalAlign=\"right\"\n minEntriesForSearch={8}\n searchPlaceholder={t('fields:searchForLanguage')}\n showScrollbar\n size=\"large\"\n />\n <CopyToClipboard value={(codeField?.value as string) ?? ''} />\n\n <Collapse />\n\n {isEditable && <RemoveButton />}\n </div>\n }\n className={baseClass}\n collapsibleProps={{\n AfterCollapsible: <FloatingCollapse />,\n disableHeaderToggle: true,\n disableToggleIndicator: true,\n }}\n Pill={\n <div className={`${baseClass}__pill`}>\n <CodeBlockIcon />\n </div>\n }\n >\n <RenderFields\n fields={formSchema}\n forceRender={true}\n parentIndexPath=\"\"\n parentPath={''}\n parentSchemaPath=\"\"\n permissions={true}\n readOnly={!isEditable}\n />\n </BlockCollapsible>\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const CodeBlockIcon: React.FC = () => (\n <svg fill=\"none\" height=\"12\" viewBox=\"0 0 15 12\" width=\"15\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.3738 8.62598L14.0404 5.95931L11.3738 3.29264M3.37376 3.29264L0.707092 5.95931L3.37376 8.62598M9.04043 0.625977L5.70709 11.2926\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'code-block-collapse-button'\nimport { useCollapsible } from '@payloadcms/ui'\n\nimport { CollapseIcon } from '../../../../../../lexical/ui/icons/Collapse/index.js'\n\nexport const Collapse: React.FC = () => {\n const { toggle } = useCollapsible()\n return (\n <button className={baseClass} onClick={toggle} type=\"button\">\n <CollapseIcon />\n </button>\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const CollapseIcon: React.FC = () => (\n <svg fill=\"none\" height=\"15\" viewBox=\"0 0 15 15\" width=\"15\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.16667 13.8333V9.83333M7.16667 9.83333L9.16667 11.8333M7.16667 9.83333L5.16667 11.8333M7.16667 4.5V0.5M7.16667 4.5L9.16667 2.5M7.16667 4.5L5.16667 2.5M1.83333 7.16667H0.5M5.83333 7.16667H4.5M9.83333 7.16667H8.5M13.8333 7.16667H12.5\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'code-block-floating-collapse-button'\nimport { useCollapsible, useTranslation } from '@payloadcms/ui'\n\nimport { CollapseIcon } from '../../../../../../lexical/ui/icons/Collapse/index.js'\n\nexport const FloatingCollapse: React.FC = () => {\n const { isCollapsed, toggle } = useCollapsible()\n const { t } = useTranslation()\n\n if (!isCollapsed) {\n return null\n }\n\n return (\n <button className={baseClass} onClick={toggle} type=\"button\">\n <span>{t('general:collapse')}</span>\n <CollapseIcon />\n </button>\n )\n}\n", "'use client'\nimport type { RichTextField } from 'payload'\n\nimport {\n FieldContext,\n FieldPathContext,\n type FieldType,\n type RenderFieldServerFnArgs,\n ServerFunctionsContext,\n type ServerFunctionsContextType,\n ShimmerEffect,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef } from 'react'\n\nimport type { DefaultTypedEditorState } from '../../nodeTypes.js'\nimport type { LexicalRichTextField } from '../../types.js'\n\n/**\n * Utility to render a lexical editor on the client.\n *\n * @experimental - may break in minor releases\n * @todo - replace this with a general utility that works for all fields. Maybe merge with packages/ui/src/forms/RenderFields/RenderField.tsx\n */\nexport const RenderLexical: React.FC<\n /**\n * If value or setValue, or both, is provided, this component will manage its own value.\n * If neither is passed, it will rely on the parent form to manage the value.\n */\n {\n /**\n * Override the loading state while the field component is being fetched and rendered.\n */\n Loading?: React.ReactElement\n\n setValue?: FieldType<DefaultTypedEditorState | undefined>['setValue']\n value?: FieldType<DefaultTypedEditorState | undefined>['value']\n } & RenderFieldServerFnArgs<LexicalRichTextField>\n> = (args) => {\n const { field, initialValue, Loading, path, schemaPath, setValue, value } = args\n const [Component, setComponent] = React.useState<null | React.ReactNode>(null)\n const serverFunctionContext = useServerFunctions()\n const { _internal_renderField } = serverFunctionContext\n\n const [entityType, entitySlug] = schemaPath.split('.', 2)\n\n const fieldPath = path ?? (field && 'name' in field ? field?.name : '') ?? ''\n\n const renderLexical = useCallback(() => {\n async function render() {\n const { Field } = await _internal_renderField({\n field: {\n ...((field as RichTextField) || {}),\n type: 'richText',\n admin: {\n ...((field as RichTextField)?.admin || {}),\n // When using \"fake\" anchor fields, hidden is often set to true. We need to override that here to ensure the field is rendered.\n hidden: false,\n },\n },\n initialValue: initialValue ?? undefined,\n path,\n schemaPath,\n })\n\n setComponent(Field)\n }\n void render()\n }, [_internal_renderField, schemaPath, path, field, initialValue])\n\n const mounted = useRef(false)\n\n useEffect(() => {\n if (mounted.current) {\n return\n }\n mounted.current = true\n void renderLexical()\n }, [renderLexical])\n\n if (!Component) {\n return typeof Loading !== 'undefined' ? Loading : <ShimmerEffect />\n }\n\n /**\n * By default, the lexical will make form state requests (e.g. to get drawer fields), passing in the arguments\n * of the current field. However, we need to override those arguments to get it to make requests based on the\n * *target* field. The server only knows the schema map of the target field.\n */\n const adjustedServerFunctionContext: ServerFunctionsContextType = {\n ...serverFunctionContext,\n getFormState: async (getFormStateArgs) => {\n return serverFunctionContext.getFormState({\n ...getFormStateArgs,\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n })\n },\n }\n\n if (typeof value === 'undefined' && !setValue) {\n return (\n <ServerFunctionsContext value={{ ...adjustedServerFunctionContext }}>\n <FieldPathContext key={fieldPath} value={fieldPath}>\n {Component}\n </FieldPathContext>\n </ServerFunctionsContext>\n )\n }\n\n const fieldValue: FieldType<DefaultTypedEditorState | undefined> = {\n disabled: false,\n formInitializing: false,\n formProcessing: false,\n formSubmitted: false,\n initialValue: value,\n path: fieldPath,\n setValue: setValue ?? (() => undefined),\n showError: false,\n value,\n }\n\n return (\n <ServerFunctionsContext value={{ ...adjustedServerFunctionContext }}>\n <FieldPathContext key={fieldPath} value={fieldPath}>\n <FieldContext value={fieldValue}>{Component}</FieldContext>\n </FieldPathContext>\n </ServerFunctionsContext>\n )\n}\n", "import type { SerializedLexicalNode } from 'lexical'\n\nimport type { DefaultNodeTypes, DefaultTypedEditorState, TypedEditorState } from '../nodeTypes.js'\n\n/**\n * Helper to build lexical editor state JSON from text and/or nodes.\n *\n * @param nodes - The nodes to include in the editor state. If you pass the `text` argument, this will append your nodes after the first paragraph node.\n * @param text - The text content to include in the editor state. This will create a paragraph node with a text node for you and set that as the first node.\n * @returns The constructed editor state JSON.\n *\n * @example\n *\n * just passing text:\n *\n * ```ts\n * const editorState = buildEditorState<DefaultNodeTypes>({ text: 'Hello world' }) // result typed as DefaultTypedEditorState\n * ```\n *\n * @example\n *\n * passing nodes:\n *\n * ```ts\n * const editorState = // result typed as TypedEditorState<DefaultNodeTypes | SerializedBlockNode> (or TypedEditorState<SerializedBlockNode>)\n * buildEditorState<DefaultNodeTypes | SerializedBlockNode>({ // or just buildEditorState<SerializedBlockNode> if you *only* want to allow block nodes\n * nodes: [\n * {\n * type: 'block',\n * fields: {\n * id: 'id',\n * blockName: 'Cool block',\n * blockType: 'myBlock',\n * },\n * format: 'left',\n * version: 1,\n * }\n * ],\n * })\n * ```\n */\nexport function buildEditorState<T extends SerializedLexicalNode>({\n nodes,\n text,\n}: {\n nodes?: TypedEditorState<T>['root']['children']\n text?: string\n}): TypedEditorState<T> {\n const editorJSON: DefaultTypedEditorState = {\n root: {\n type: 'root',\n children: [],\n direction: 'ltr',\n format: '',\n indent: 0,\n version: 1,\n },\n }\n\n if (text) {\n editorJSON.root.children.push({\n type: 'paragraph',\n children: [\n {\n type: 'text',\n detail: 0,\n format: 0,\n mode: 'normal',\n style: '',\n text,\n version: 1,\n },\n ],\n direction: 'ltr',\n format: '',\n indent: 0,\n textFormat: 0,\n textStyle: '',\n version: 1,\n })\n }\n\n if (nodes?.length) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editorJSON.root.children.push(...(nodes as any))\n }\n\n return editorJSON as TypedEditorState<T>\n}\n\n/**\n *\n * Alias for `buildEditorState<DefaultNodeTypes>`\n *\n * @experimental this API may change or be removed in a minor release\n * @internal\n */\nexport const buildDefaultEditorState: typeof buildEditorState<DefaultNodeTypes> =\n buildEditorState<DefaultNodeTypes>\n"],
5
- "mappings": "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,IAAO,4BACP,IAAO,2BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,4BACP,IAAO,2BACT,EACAC,KAAM,CACJ,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,2BACP,IAAO,2BACP,IAAO,2BACP,IAAO,2BACP,IAAO,0BACT,EACAC,OAAQ,CACN,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,2BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACT,EACAC,IAAK,CACH,GAAM,2BACN,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACT,EACAC,KAAM,CACJ,GAAM,4BACN,IAAO,0BACP,IAAO,4BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,2BACT,EACAC,IAAK,CACH,GAAM,4BACN,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,2BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACT,EACAC,MAAO,CACL,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACT,EACAC,MAAO,CACL,GAAM,6BACN,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACP,IAAO,0BACT,EACAC,KAAM,CACJ,GAAM,4BACN,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,2BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACT,EACA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",
6
- "names": ["slashMenuBasicGroupWithItems", "items", "key", "label", "i18n", "t", "c", "_c", "useLexicalComposerContext", "$isDecoratorBlockNode", "$findMatchingParent", "$getSelection", "$isElementNode", "$isNodeSelection", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "FORMAT_ELEMENT_COMMAND", "useEffect", "AlignCenterIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignJustifyIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignLeftIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignRightIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "createClientFeature", "feature", "props", "featureProviderClient", "clientFeatureProps", "config", "featureClientImportMap", "featureClientSchemaMap", "featureProviderMap", "field", "resolvedFeatures", "schemaPath", "unSanitizedEditorConfig", "toReturn", "sanitizedClientFeatureProps", "newFeature", "toolbarAlignGroupWithItems", "items", "type", "ChildComponent", "AlignLeftIcon", "key", "order", "getFormatType", "node", "$isElementNode", "__format", "toolbarGroups", "toolbarAlignGroupWithItems", "ChildComponent", "AlignLeftIcon", "isActive", "selection", "$isRangeSelection", "getNodes", "$isDecoratorBlockNode", "parent", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "FORMAT_ELEMENT_COMMAND", "order", "AlignCenterIcon", "AlignRightIcon", "AlignJustifyIcon", "AlignPlugin", "$", "_c", "useLexicalComposerContext", "t0", "t1", "registerCommand", "_temp2", "COMMAND_PRIORITY_LOW", "useEffect", "AlignFeatureClient", "createClientFeature", "plugins", "Component", "position", "toolbarFixed", "groups", "toolbarInline", "_temp", "parentNode", "isInline", "format", "$getSelection", "$isNodeSelection", "nodes", "element", "$findMatchingParent", "setFormat", "$createQuoteNode", "$isQuoteNode", "QuoteNode", "$setBlocksType", "$getSelection", "$isRangeSelection", "BlockquoteIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "TextIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarTextDropdownGroupWithItems", "items", "type", "ChildComponent", "TextIcon", "key", "order", "$createQuoteNode", "$isQuoteNode", "QuoteNode", "MarkdownTransformer", "type", "dependencies", "export", "node", "exportChildren", "lines", "split", "output", "line", "push", "join", "regExp", "replace", "parentNode", "children", "_match", "isImport", "previousNode", "getPreviousSibling", "splice", "getChildrenSize", "select", "remove", "append", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "BlockquoteIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isQuoteNode", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "update", "$getSelection", "$setBlocksType", "$createQuoteNode", "order", "BlockquoteFeatureClient", "createClientFeature", "markdownTransformers", "MarkdownTransformer", "nodes", "QuoteNode", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "getTranslation", "BlockIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "rx", "stroke", "x", "y", "InlineBlocksIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "clipRule", "d", "fillRule", "getBlockImageComponent", "imageURL", "imageAltText", "_jsx", "alt", "className", "src", "style", "maxHeight", "maxWidth", "BlockIcon", "$parseSerializedNode", "JSOX", "extractPropsFromJSXPropsString", "propsString", "props", "key", "collectingKey", "i", "length", "char", "result", "handleValue", "value", "newIndex", "startIndex", "handleQuotedString", "handleObject", "handleArray", "handleUnquotedString", "bracketCount", "parse", "isSingleQuoted", "parseObject", "objString", "replace", "propsToJSXString", "props", "propsArray", "key", "value", "Object", "entries", "push", "escapeQuotes", "Array", "isArray", "map", "v", "JSON", "stringify", "replacer", "join", "str", "replace", "linesFromStartToContentAndPropsString", "isEndOptional", "lines", "regexpEndRegex", "startLineIndex", "startMatch", "trimChildren", "propsString", "content", "linesCopy", "slice", "isWithinContent", "contentSubTagStartAmount", "bracketCount", "quoteChar", "isSelfClosing", "isWithinCodeBlockAmount", "beforeStartLine", "index", "endlineLastCharIndex", "endLineIndex", "mainLoop", "lineIndex", "lineCopy", "entries", "line", "trim", "amountOfBeginningSpacesRemoved", "i", "length", "charIndex", "char", "nextChar", "match", "undefined", "Error", "join", "JSON", "stringify", "afterEndLine", "ObjectID", "$applyNodeReplacement", "DecoratorBlockNode", "addClassNamesToElement", "ObjectID", "$applyNodeReplacement", "ServerBlockNode", "__cacheBuster", "__fields", "constructor", "cacheBuster", "fields", "format", "key", "clone", "node", "__format", "__key", "getType", "importDOM", "importJSON", "serializedNode", "version", "data", "$createServerBlockNode", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "theme", "block", "decorate", "editor", "exportDOM", "text", "createTextNode", "getTextContent", "append", "exportJSON", "type", "getFields", "getCacheBuster", "getLatest", "setFields", "preventFormStateUpdate", "writable", "getWritable", "id", "default", "toHexString", "useLexicalComposerContext", "useLexicalEditable", "getTranslation", "Button", "Collapsible", "Drawer", "EditDepthProvider", "ErrorPill", "Form", "formatDrawerSlug", "FormSubmit", "Pill", "RenderFields", "SectionTitle", "useConfig", "useDocumentForm", "useDocumentInfo", "useEditDepth", "useFormSubmitted", "useServerFunctions", "useTranslation", "abortAndIgnore", "$getNodeByKey", "deepCopyObjectSimpleWithoutReactComponents", "reduceFieldsToValues", "React", "useCallback", "useEffect", "useMemo", "useRef", "v4", "uuid", "c", "_c", "useLexicalEditable", "RenderFields", "useFormSubmitted", "React", "createContext", "BlockComponentContext", "baseClass", "BlockCollapsible", "BlockDrawer", "CustomBlock", "EditButton", "errorCount", "formSchema", "initialState", "nodeKey", "RemoveButton", "useBlockComponentContext", "use", "BlockContent", "props", "$", "Collapsible", "contextProps", "fieldHasErrors", "isEditable", "t0", "props_0", "children", "rest", "_jsx", "CollapsibleWithErrorProps", "_jsxs", "value", "fields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "readOnly", "removeEmptyArrayValues", "fields", "key", "field", "Array", "isArray", "rows", "disableFormData", "BlockComponent", "props", "cacheBuster", "className", "baseClass", "formData", "nodeKey", "submitted", "useFormSubmitted", "id", "collectionSlug", "globalSlug", "useDocumentInfo", "fieldProps", "featureClientSchemaMap", "field", "parentLexicalRichTextField", "initialLexicalFormState", "schemaPath", "uuid", "uuidFromContext", "useEditorConfigContext", "fields", "parentDocumentFields", "useDocumentForm", "onChangeAbortControllerRef", "useRef", "AbortController", "editDepth", "useEditDepth", "errorCount", "setErrorCount", "React", "useState", "config", "useConfig", "drawerSlug", "formatDrawerSlug", "slug", "depth", "toggleDrawer", "useLexicalDrawer", "getDocPreferences", "setDocFieldPreferences", "editor", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "blockType", "getFormState", "useServerFunctions", "schemaFieldsPath", "initialState", "setInitialState", "cachedFormState", "formState", "mergedState", "Object", "fromEntries", "entries", "map", "fieldName", "fieldState", "initialValue", "value", "blockName", "passesCondition", "valid", "hasMounted", "prevCacheBuster", "useEffect", "current", "CustomLabel", "setCustomLabel", "customComponents", "BlockLabel", "undefined", "CustomBlock", "setCustomBlock", "Block", "abortController", "state", "data", "docPermissions", "docPreferences", "documentFormState", "deepCopyObjectSimpleWithoutReactComponents", "excludeFiles", "initialBlockData", "operation", "readOnly", "renderAllFields", "signal", "newFormStateData", "reduceFieldsToValues", "update", "node", "$getNodeByKey", "$isBlockNode", "newData", "setFields", "_components", "abortAndIgnore", "isCollapsed", "setIsCollapsed", "collapsed", "componentMapRenderedBlockPath", "blocksField", "clientBlock", "blockReferences", "blocksMap", "blocks", "i18n", "t", "useTranslation", "onChange", "useCallback", "prevFormState", "submit", "controller", "newFormState", "initialBlockFormState", "removeEmptyArrayValues", "setTimeout", "rowErrorCount", "formField", "values", "removeBlock", "remove", "blockDisplayName", "labels", "singular", "getTranslation", "onCollapsedChange", "changedCollapsed", "then", "currentDocPreferences", "collapsedArray", "name", "newCollapsed", "length", "includes", "push", "splice", "indexOf", "hello", "EditButton", "useMemo", "_jsx", "Button", "buttonStyle", "disabled", "el", "icon", "onClick", "e", "preventDefault", "stopPropagation", "onMouseDown", "round", "size", "tooltip", "label", "RemoveButton", "BlockCollapsible", "Actions", "children", "collapsibleProps", "disableBlockName", "editButton", "fieldHasErrors", "Label", "Pill", "CustomPill", "removeButton", "Collapsible", "filter", "Boolean", "join", "collapsibleStyle", "header", "_jsxs", "pillStyle", "admin", "SectionTitle", "path", "ErrorPill", "count", "withMessage", "_Fragment", "onToggle", "incomingCollapsedState", "blockID", "BlockDrawer", "EditDepthProvider", "Drawer", "title", "RenderFields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "FormSubmit", "programmaticSubmit", "Form", "beforeSubmit", "onSubmit", "BlockContent", "formSchema", "BlockNode", "ServerBlockNode", "clone", "node", "getType", "importJSON", "serializedNode", "version", "fields", "data", "$createBlockNode", "setFormat", "format", "decorate", "_editor", "config", "_jsx", "BlockComponent", "cacheBuster", "getCacheBuster", "className", "theme", "block", "formData", "getFields", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "id", "ObjectID", "default", "toHexString", "$isBlockNode", "createHeadlessEditor", "getLexicalToMarkdown", "allNodes", "allTransformers", "lexicalToMarkdown", "editorState", "headlessEditor", "createHeadlessEditor", "nodes", "setEditorState", "parseEditorState", "e", "console", "error", "markdown", "getEditorState", "read", "$convertToMarkdownString", "createHeadlessEditor", "getMarkdownToLexical", "allNodes", "allTransformers", "markdownToLexical", "markdown", "headlessEditor", "createHeadlessEditor", "nodes", "update", "$convertFromMarkdownString", "discrete", "getEditorState", "toJSON", "createTagRegexes", "tagName", "escapedTagName", "replace", "regExpEnd", "RegExp", "regExpStart", "getBlockMarkdownTransformers", "blocks", "inlineBlocks", "length", "transformers", "block", "transformer", "getMarkdownTransformerForBlock", "concat", "isInlineBlock", "jsx", "regex", "slug", "toReturn", "push", "allNodes", "allTransformers", "type", "dependencies", "InlineBlockNode", "export", "node", "$isInlineBlockNode", "getFields", "blockType", "toLowerCase", "nodeFields", "lexicalToMarkdown", "getLexicalToMarkdown", "exportResult", "fields", "hasProps", "props", "Object", "keys", "children", "propsToJSXString", "getEndIndex", "match", "endlineLastCharIndex", "linesFromStartToContentAndPropsString", "isEndOptional", "lines", "getTextContent", "regexpEndRegex", "startLineIndex", "startMatch", "trimChildren", "importRegExp", "customStartRegex", "regExp", "content", "propsString", "index", "import", "markdownToLexical", "getMarkdownToLexical", "blockFields", "closeMatch", "htmlToLexical", "openMatch", "extractPropsFromJSXPropsString", "inlineBlockNode", "$createInlineBlockNode", "BlockNode", "$isBlockNode", "sanitizedChildren", "includes", "child", "split", "sanitizedChild", "doNotTrimChildren", "handleImportAfterStartMatch", "customEndRegex", "undefined", "rootNode", "optional", "afterEndLine", "beforeStartLine", "unsanitizedContent", "endLineIndex", "endsWith", "slice", "startsWith", "$createBlockNode", "prevNodes", "nextNodes", "markdown", "root", "firstPrevNode", "append", "$parseSerializedNode", "lastChild", "getChildren", "linesInBetween", "line", "childrenString", "join", "trim", "createCommand", "INSERT_BLOCK_COMMAND", "INSERT_INLINE_BLOCK_COMMAND", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$wrapNodeInElement", "mergeRegister", "formatDrawerSlug", "useEditDepth", "$createParagraphNode", "$getNodeByKey", "$getPreviousSelection", "$getSelection", "$insertNodes", "$isParagraphNode", "$isRangeSelection", "$isRootOrShadowRoot", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "BlocksPlugin", "$", "_c", "editor", "useLexicalComposerContext", "targetNodeKey", "setTargetNodeKey", "useState", "setCreatedInlineBlock", "uuid", "useEditorConfigContext", "editDepth", "useEditDepth", "t0", "t1", "formatDrawerSlug", "slug", "depth", "drawerSlug", "toggleDrawer", "useLexicalDrawer", "t2", "hasNodes", "BlockNode", "Error", "mergeRegister", "registerCommand", "INSERT_BLOCK_COMMAND", "payload", "update", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "blockNode", "$createBlockNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "COMMAND_PRIORITY_EDITOR", "INSERT_INLINE_BLOCK_COMMAND", "fields", "node", "$getNodeByKey", "$isInlineBlockNode", "setFields", "inlineBlockNode", "$createInlineBlockNode", "$insertNodes", "$isRootOrShadowRoot", "getParentOrThrow", "$wrapNodeInElement", "$createParagraphNode", "selectEnd", "t3", "useEffect", "BlocksFeatureClient", "createClientFeature", "config", "featureClientSchemaMap", "props", "schemaPath", "schemaMapRenderedBlockPathPrefix", "schemaMapRenderedInlineBlockPathPrefix", "clientSchema", "blocksFields", "Object", "entries", "filter", "key", "startsWith", "replace", "includes", "map", "value", "inlineBlocksFields", "clientBlocks", "field", "blockReferences", "blocksMap", "blocks", "block", "undefined", "clientInlineBlocks", "markdownTransformers", "getBlockMarkdownTransformers", "inlineBlocks", "nodes", "BlockNode", "InlineBlockNode", "plugins", "Component", "BlocksPlugin", "position", "sanitizedClientFeatureProps", "slashMenu", "groups", "length", "items", "Icon", "getBlockImageComponent", "imageURL", "imageAltText", "slug", "keywords", "label", "i18n", "labels", "singular", "getTranslation", "onSelect", "editor", "dispatchCommand", "INSERT_BLOCK_COMMAND", "blockName", "blockType", "t", "inlineBlock", "InlineBlocksIcon", "INSERT_INLINE_BLOCK_COMMAND", "Boolean", "toolbarFixed", "type", "ChildComponent", "BlockIcon", "index", "isActive", "order", "c", "_c", "useLexicalComposerContext", "$createParagraphNode", "$createTextNode", "$getRoot", "getDOMSelection", "React", "useCallback", "useEffect", "useLayoutEffect", "useRef", "useState", "documentMode", "CAN_USE_DOM", "document", "IS_APPLE", "test", "navigator", "platform", "IS_FIREFOX", "userAgent", "CAN_USE_BEFORE_INPUT", "window", "InputEvent", "IS_SAFARI", "IS_IOS", "MSStream", "IS_ANDROID", "IS_WINDOWS", "IS_CHROME", "IS_APPLE_WEBKIT", "copy", "text", "textArea", "document", "createElement", "value", "style", "position", "opacity", "body", "appendChild", "focus", "select", "result", "execCommand", "console", "log", "error", "removeChild", "download", "filename", "a", "setAttribute", "encodeURIComponent", "display", "click", "formatStep", "step", "formattedStep", "formatOneStep", "name", "x", "y", "anchorPath", "toString", "anchorOffset", "focusPath", "focusOffset", "count", "join", "isSelectAll", "event", "key", "toLowerCase", "IS_APPLE", "metaKey", "ctrlKey", "sanitizeSelection", "selection", "anchorNode", "focusNode", "getPathFromNodeToEditor", "node", "rootElement", "currentNode", "path", "unshift", "Array", "from", "parentNode", "childNodes", "indexOf", "keyPresses", "Set", "useTestRecorder", "editor", "steps", "setSteps", "useState", "isRecording", "setIsRecording", "setCurrentInnerHTML", "templatedTest", "setTemplatedTest", "previousSelectionRef", "useRef", "skipNextSelectionChangeRef", "preRef", "getCurrentEditor", "useCallback", "generateTestContent", "getRootElement", "browserSelection", "getDOMSelection", "_window", "contains", "map", "pushStep", "currentSteps", "currentIndex", "length", "lastStep", "slice", "useLayoutEffect", "onKeyDown", "has", "onKeyUp", "registerRootListener", "prevRootElement", "removeEventListener", "addEventListener", "current", "scrollTo", "scrollHeight", "useEffect", "testContent", "registerUpdateListener", "dirtyElements", "dirtyLeaves", "editorState", "currentSelection", "_selection", "previousSelection", "skipNextSelectionChange", "size", "innerHTML", "toggleEditorSelection", "currentEditor", "update", "root", "$getRoot", "clear", "$createTextNode", "append", "$createParagraphNode", "currentIsRecording", "onSnapshotClick", "onCopyClick", "onDownloadClick", "_jsx", "className", "id", "onClick", "e", "preventDefault", "title", "type", "_jsxs", "ref", "TestRecorderPlugin", "$", "_c", "useLexicalComposerContext", "testRecorderButton", "testRecorderOutput", "t0", "Fragment", "children", "TestRecorderFeatureClient", "createClientFeature", "plugins", "Component", "TestRecorderPlugin", "position", "c", "_c", "useLexicalComposerContext", "TreeView", "TreeViewPlugin", "$", "editor", "t0", "_jsx", "timeTravelButtonClassName", "timeTravelPanelButtonClassName", "timeTravelPanelClassName", "timeTravelPanelSliderClassName", "treeTypeButtonClassName", "viewClassName", "TreeViewFeatureClient", "createClientFeature", "plugins", "Component", "TreeViewPlugin", "position", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "BoldIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarFormatGroupWithItems", "items", "type", "key", "order", "BOLD_ITALIC_STAR", "type", "format", "tag", "BOLD_ITALIC_UNDERSCORE", "intraword", "BOLD_STAR", "BOLD_UNDERSCORE", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "BoldIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "BoldFeatureClient", "createClientFeature", "featureProviderMap", "markdownTransformers", "BOLD_STAR", "BOLD_UNDERSCORE", "get", "push", "BOLD_ITALIC_UNDERSCORE", "BOLD_ITALIC_STAR", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "CodeIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "INLINE_CODE", "type", "format", "tag", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "CodeIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "InlineCodeFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "INLINE_CODE", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "ItalicIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "ITALIC_STAR", "type", "format", "tag", "ITALIC_UNDERSCORE", "intraword", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "ItalicIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "ItalicFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "ITALIC_STAR", "ITALIC_UNDERSCORE", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "StrikethroughIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "STRIKETHROUGH", "type", "format", "tag", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "StrikethroughIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "StrikethroughFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "STRIKETHROUGH", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "SubscriptIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "SubscriptIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "SubscriptFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "SuperscriptIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "SuperscriptIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "SuperscriptFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "UnderlineIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "UnderlineIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "UnderlineFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "kebabToCamelCase", "str", "replace", "_", "letter", "toUpperCase", "TextStateIcon", "css", "convertedCss", "Object", "fromEntries", "entries", "map", "key", "value", "_jsx", "style", "alignItems", "borderRadius", "display", "fontSize", "height", "justifyContent", "width", "useLexicalComposerContext", "$forEachSelectedTextNode", "$getNodeByKey", "$getState", "$setState", "createState", "TextNode", "useEffect", "registerTextStates", "state", "stateMap", "Map", "stateKey", "stateValues", "stateConfig", "parse", "value", "Object", "keys", "includes", "undefined", "set", "setTextState", "editor", "update", "textNode", "stateMapEntry", "get", "Error", "StatePlugin", "registerMutationListener", "mutatedNodes", "getEditorState", "read", "nodeKey", "mutation", "node", "dom", "getElementByKey", "mergedStyles", "create", "forEach", "stateEntry", "stateValue", "dataset", "css", "assign", "style", "cssText", "toolbarGroups", "props", "stateMap", "items", "stateKey", "state", "key", "stateValue", "meta", "push", "ChildComponent", "_jsx", "TextStateIcon", "css", "label", "onSelect", "editor", "setTextState", "type", "color", "i18n", "t", "undefined", "order", "TextStateFeatureClient", "createClientFeature", "registerTextStates", "plugins", "Component", "StatePlugin", "position", "toolbarFixed", "groups", "toolbarInline", "c", "_c", "useLexicalComposerContext", "$createHeadingNode", "$isHeadingNode", "HeadingNode", "$setBlocksType", "$getSelection", "$isRangeSelection", "useEffect", "H1Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H2Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H3Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H4Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H5Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H6Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "$createHeadingNode", "$isHeadingNode", "HeadingNode", "createBlockNode", "createNode", "parentNode", "children", "match", "node", "append", "replace", "select", "MarkdownTransformer", "enabledHeadingSizes", "pattern", "map", "tag", "Number", "slice", "size", "join", "regExp", "RegExp", "type", "dependencies", "HeadingNode", "export", "node", "exportChildren", "$isHeadingNode", "level", "getTag", "repeat", "replace", "createBlockNode", "match", "length", "$createHeadingNode", "$setHeading", "headingSize", "selection", "$getSelection", "$setBlocksType", "$createHeadingNode", "iconImports", "h1", "H1Icon", "h2", "H2Icon", "h3", "H3Icon", "h4", "H4Icon", "h5", "H5Icon", "h6", "H6Icon", "HeadingFeatureClient", "createClientFeature", "props", "enabledHeadingSizes", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "map", "i", "ChildComponent", "isActive", "$isRangeSelection", "node", "getNodes", "$isHeadingNode", "getTag", "parent", "getParent", "key", "label", "i18n", "t", "headingLevel", "charAt", "onSelect", "editor", "update", "order", "markdownTransformers", "MarkdownTransformer", "nodes", "HeadingNode", "plugins", "Component", "HeadingPlugin", "position", "sanitizedClientFeatureProps", "slashMenu", "groups", "length", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "t0", "$", "_c", "clientProps", "t1", "t2", "undefined", "t3", "at", "lowestAllowed", "useLexicalComposerContext", "t4", "t5", "registerNodeTransform", "includes", "setTag", "useEffect", "$isNodeSelection", "HorizontalRuleIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "x", "y", "AddIcon", "_jsxs", "fill", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "toolbarAddDropdownGroupWithItems", "items", "type", "ChildComponent", "AddIcon", "key", "order", "addClassNamesToElement", "$applyNodeReplacement", "createCommand", "DecoratorNode", "INSERT_HORIZONTAL_RULE_COMMAND", "HorizontalRuleServerNode", "clone", "node", "__key", "getType", "importDOM", "hr", "conversion", "$convertHorizontalRuleElement", "priority", "importJSON", "serializedNode", "$createHorizontalRuleServerNode", "createDOM", "config", "element", "document", "createElement", "theme", "decorate", "exportDOM", "exportJSON", "type", "version", "getTextContent", "isInline", "updateDOM", "$applyNodeReplacement", "HorizontalRuleNode", "HorizontalRuleServerNode", "clone", "node", "getType", "importJSON", "serializedNode", "$createHorizontalRuleNode", "decorate", "exportJSON", "$createHorizontalRuleNode", "$applyNodeReplacement", "HorizontalRuleNode", "$isHorizontalRuleNode", "node", "MarkdownTransformer", "type", "dependencies", "HorizontalRuleNode", "export", "node", "exportChildren", "$isHorizontalRuleNode", "regExp", "replace", "parentNode", "$createHorizontalRuleNode", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "useEffect", "HorizontalRulePlugin", "$", "_c", "editor", "useLexicalComposerContext", "t0", "t1", "registerCommand", "INSERT_HORIZONTAL_RULE_COMMAND", "_temp", "COMMAND_PRIORITY_EDITOR", "useEffect", "type", "selection", "$getSelection", "$isRangeSelection", "focus", "getNode", "horizontalRuleNode", "$createHorizontalRuleNode", "$insertNodeToNearestRoot", "HorizontalRuleFeatureClient", "createClientFeature", "markdownTransformers", "MarkdownTransformer", "nodes", "HorizontalRuleNode", "plugins", "Component", "HorizontalRulePlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "HorizontalRuleIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_HORIZONTAL_RULE_COMMAND", "undefined", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isHorizontalRuleNode", "$findMatchingParent", "$isElementNode", "INDENT_CONTENT_COMMAND", "OUTDENT_CONTENT_COMMAND", "IndentDecreaseIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "IndentIncreaseIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "useLexicalComposerContext", "TabIndentationPlugin", "$findMatchingParent", "mergeRegister", "$getSelection", "$isElementNode", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "INDENT_CONTENT_COMMAND", "KEY_TAB_COMMAND", "OUTDENT_CONTENT_COMMAND", "TabNode", "useEffect", "IndentPlugin", "clientProps", "editor", "disabledNodes", "disableTabNode", "length", "registerCommand", "$handleIndentAndOutdent", "block", "includes", "getType", "indent", "getIndent", "setIndent", "registerUpdateListener", "dirtyElements", "editorState", "update", "nodeKey", "node", "_nodeMap", "get", "event", "preventDefault", "dispatchCommand", "shiftKey", "undefined", "registerNodeTransform", "remove", "_jsx", "indentOrOutdent", "selection", "alreadyHandled", "Set", "nodes", "getNodes", "i", "key", "getKey", "has", "parentBlock", "parentNode", "isInline", "parentKey", "canIndent", "add", "size", "toolbarIndentGroupWithItems", "items", "type", "key", "order", "toolbarGroups", "disabledNodes", "toolbarIndentGroupWithItems", "ChildComponent", "IndentDecreaseIcon", "isActive", "isEnabled", "selection", "nodes", "getNodes", "isOutdentable", "node", "isIndentable", "getIndent", "some", "Boolean", "$findMatchingParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "OUTDENT_CONTENT_COMMAND", "undefined", "order", "IndentIncreaseIcon", "isIndentableAndNotDisabled", "includes", "getType", "INDENT_CONTENT_COMMAND", "IndentFeatureClient", "createClientFeature", "props", "plugins", "Component", "IndentPlugin", "position", "sanitizedClientFeatureProps", "toolbarFixed", "groups", "toolbarInline", "$isElementNode", "canIndent", "$findMatchingParent", "$getSelection", "$isRangeSelection", "LinkIcon", "_jsx", "className", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "strokeLinejoin", "$isAtNodeEnd", "getSelectedNode", "selection", "anchor", "focus", "anchorNode", "getNode", "focusNode", "isBackward", "toolbarFeatureButtonsGroupWithItems", "items", "type", "key", "order", "$createTextNode", "addClassNamesToElement", "isHTMLAnchorElement", "ObjectID", "$applyNodeReplacement", "$createTextNode", "$getSelection", "$isElementNode", "$isRangeSelection", "createCommand", "ElementNode", "SUPPORTED_URL_PROTOCOLS", "Set", "LinkNode", "__fields", "__id", "constructor", "id", "fields", "linkType", "newTab", "key", "clone", "node", "__key", "getType", "importDOM", "a", "conversion", "$convertAnchorElement", "priority", "importJSON", "serializedNode", "$createLinkNode", "updateFromJSON", "version", "doc", "value", "default", "toHexString", "canBeEmpty", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "href", "sanitizeUrl", "url", "target", "rel", "manageRel", "theme", "link", "exportJSON", "getFields", "returnObject", "type", "getID", "extractWithChild", "child", "selection", "destination", "anchorNode", "anchor", "getNode", "focusNode", "focus", "isParentOf", "getTextContent", "length", "getLatest", "insertNewAfter", "restoreSelection", "getParentOrThrow", "linkNode", "append", "isInline", "parsedUrl", "URL", "has", "protocol", "setFields", "writable", "getWritable", "setID", "updateDOM", "prevNode", "removeAttribute", "domNode", "content", "textContent", "getAttribute", "$isLinkNode", "TOGGLE_LINK_COMMAND", "$toggleLink", "payload", "selectedNodes", "nodes", "extract", "forEach", "parent", "getParent", "getChildren", "insertBefore", "remove", "firstNode", "$getLinkAncestor", "text", "getLastChild", "prevParent", "is", "getPreviousSibling", "insertAfter", "children", "$getAncestor", "ancestor", "predicate", "input", "action", "result", "mutableInput", "includes", "re", "RegExp", "replace", "trim", "LinkMarkdownTransformer", "type", "dependencies", "LinkNode", "export", "_node", "exportChildren", "$isLinkNode", "node", "url", "getFields", "importRegExp", "regExp", "replace", "textNode", "match", "linkText", "linkUrl", "linkNode", "$createLinkNode", "fields", "doc", "linkType", "newTab", "linkTextNode", "$createTextNode", "setFormat", "getFormat", "append", "trigger", "$applyNodeReplacement", "$isElementNode", "AutoLinkNode", "LinkNode", "clone", "node", "id", "fields", "__fields", "key", "__key", "getType", "importDOM", "importJSON", "serializedNode", "$createAutoLinkNode", "updateFromJSON", "version", "doc", "value", "exportJSON", "serialized", "type", "children", "direction", "format", "indent", "insertNewAfter", "selection", "restoreSelection", "element", "getParentOrThrow", "$isElementNode", "linkNode", "append", "setFields", "$applyNodeReplacement", "$isAutoLinkNode", "c", "_c", "useLexicalComposerContext", "mergeRegister", "$createTextNode", "$getSelection", "$isElementNode", "$isLineBreakNode", "$isNodeSelection", "$isRangeSelection", "$isTextNode", "TextNode", "TextNodeValue", "useEffect", "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", "$isElementNode", "getLastDescendant", "$isLineBreakNode", "$isTextNode", "getTextContent", "isNextNodeValid", "nextNode", "getNextSibling", "getFirstDescendant", "isContentAroundIsValid", "matchStart", "matchEnd", "nodes", "extractMatchingNodes", "startIndex", "endIndex", "unmodifiedBeforeNodes", "matchingNodes", "unmodifiedAfterNodes", "matchingOffset", "currentOffset", "currentNodes", "currentNode", "currentNodeLength", "currentNodeStart", "push", "shift", "$createAutoLinkNode_", "fields", "linkType", "linkNode", "$createAutoLinkNode", "remainingTextNode", "linkTextNode", "splitText", "textNode", "$createTextNode", "setFormat", "getFormat", "setDetail", "getDetail", "setStyle", "getStyle", "append", "replace", "firstTextNode", "offset", "firstLinkTextNode", "linkNodes", "forEach", "currentNodeEnd", "endNode", "selection", "$getSelection", "selectedTextNode", "getNodes", "find", "$isRangeSelection", "select", "anchor", "focus", "$isNodeSelection", "$handleLinkCreation", "onChange", "initialText", "map", "join", "invalidMatchEnd", "matchLength", "actualMatchStart", "actualMatchEnd", "substring", "handleLinkEdit", "children", "getChildren", "childrenLength", "i", "child", "isSimpleText", "replaceWithChildren", "getFields", "flds", "setFields", "handleBadNeighbors", "previousSibling", "nextSibling", "$isAutoLinkNode", "isEmailURI", "startsWith", "j", "insertAfter", "remove", "getLatest", "getTextNodesToMatch", "textNodesToMatch", "useAutoLink", "editor", "$", "_c", "t0", "t1", "hasNodes", "AutoLinkNode", "Error", "onChangeWrapped", "prevUrl", "mergeRegister", "registerNodeTransform", "TextNodeValue", "parent", "getParentOrThrow", "previous", "$isLinkNode", "useEffect", "URL_REGEX", "EMAIL_REGEX", "MATCHERS", "AutoLinkPlugin", "useLexicalComposerContext", "ClickableLinkPlugin", "LexicalClickableLinkPlugin", "_jsx", "createPortal", "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", "formatAdminURL", "React", "useCallback", "useEffect", "useRef", "useState", "setFloatingElemPositionForLinkEditor", "targetRect", "floatingElem", "anchorElem", "verticalGap", "VERTICAL_GAP", "horizontalOffset", "HORIZONTAL_OFFSET", "scrollerElem", "parentElement", "style", "opacity", "transform", "floatingElemRect", "getBoundingClientRect", "anchorElementRect", "editorScrollerRect", "top", "left", "height", "width", "right", "createCommand", "TOGGLE_LINK_WITH_MODAL_COMMAND", "preventDefault", "event", "LinkEditor", "anchorElem", "editor", "useLexicalComposerContext", "linkNode", "setLinkNode", "useState", "editorRef", "useRef", "linkUrl", "setLinkUrl", "linkLabel", "setLinkLabel", "fieldProps", "schemaPath", "uuid", "useEditorConfigContext", "isEditable", "useLexicalEditable", "config", "getEntityConfig", "useConfig", "i18n", "t", "useTranslation", "stateData", "setStateData", "editDepth", "useEditDepth", "isLink", "setIsLink", "selectedNodes", "setSelectedNodes", "locale", "useLocale", "isAutoLink", "setIsAutoLink", "drawerSlug", "formatDrawerSlug", "slug", "depth", "toggleDrawer", "useLexicalDrawer", "setNotLink", "useCallback", "current", "style", "opacity", "transform", "undefined", "$updateLinkEditor", "selection", "$getSelection", "selectedNodeDomRect", "$isRangeSelection", "focusNode", "getSelectedNode", "getElementByKey", "getKey", "getBoundingClientRect", "focusLinkParent", "$findMatchingParent", "$isLinkNode", "badNode", "getNodes", "filter", "node", "$isLineBreakNode", "find", "is", "fields", "getFields", "data", "id", "getID", "text", "getTextContent", "linkType", "url", "routes", "admin", "doc", "relationTo", "value", "relatedField", "collectionSlug", "label", "String", "collection", "Error", "loadingLabel", "getTranslation", "labels", "singular", "replace", "requests", "get", "formatAdminURL", "apiRoute", "api", "path", "serverURL", "headers", "language", "params", "code", "then", "res", "ok", "status", "json", "useAsTitle", "title", "catch", "$isAutoLinkNode", "editorElem", "nativeSelection", "getDOMSelection", "_window", "activeElement", "document", "rootElement", "getRootElement", "contains", "anchorNode", "getRangeAt", "y", "setFloatingElemPositionForLinkEditor", "className", "useEffect", "mergeRegister", "registerCommand", "TOGGLE_LINK_WITH_MODAL_COMMAND", "payload", "dispatchCommand", "TOGGLE_LINK_COMMAND", "COMMAND_PRIORITY_LOW", "scrollerElem", "parentElement", "update", "getEditorState", "read", "window", "addEventListener", "removeEventListener", "registerUpdateListener", "editorState", "SELECTION_CHANGE_COMMAND", "KEY_ESCAPE_COMMAND", "COMMAND_PRIORITY_HIGH", "_jsxs", "React", "Fragment", "_jsx", "ref", "length", "href", "rel", "target", "__fields", "newTab", "ExternalLinkIcon", "_Fragment", "onClick", "onMouseDown", "tabIndex", "type", "EditIcon", "CloseMenuIcon", "FieldsDrawer", "drawerTitle", "featureKey", "handleDrawerSubmit", "newLinkPayload", "bareLinkFields", "linkParent", "getParent", "$createLinkNode", "schemaPathSuffix", "FloatingLinkEditorPlugin", "props", "anchorElem", "document", "body", "createPortal", "_jsx", "LinkEditor", "c", "_c", "useLexicalComposerContext", "mergeRegister", "$getSelection", "$isElementNode", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "PASTE_COMMAND", "useEffect", "absoluteRegExp", "relativeOrAnchorRegExp", "validateUrl", "url", "includes", "test", "absoluteRegExp", "relativeOrAnchorRegExp", "urlObj", "URL", "protocol", "hostname", "LinkPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "t2", "defaultLinkType", "defaultLinkURL", "hasNodes", "LinkNode", "Error", "mergeRegister", "registerCommand", "TOGGLE_LINK_COMMAND", "payload", "$toggleLink", "fields", "linkType", "url", "COMMAND_PRIORITY_LOW", "PASTE_COMMAND", "event", "selection", "$getSelection", "$isRangeSelection", "isCollapsed", "ClipboardEvent", "clipboardData", "clipboardText", "getData", "validateUrl", "getNodes", "some", "_temp", "linkFields", "doc", "newTab", "dispatchCommand", "text", "preventDefault", "useEffect", "node", "$isElementNode", "toolbarGroups", "toolbarFeatureButtonsGroupWithItems", "ChildComponent", "LinkIcon", "isActive", "selection", "$isRangeSelection", "selectedNode", "getSelectedNode", "$findMatchingParent", "$isLinkNode", "isEnabled", "$getSelection", "getTextContent", "length", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "TOGGLE_LINK_COMMAND", "selectedText", "selectedNodes", "getEditorState", "read", "getNodes", "linkFields", "doc", "TOGGLE_LINK_WITH_MODAL_COMMAND", "fields", "text", "order", "LinkFeatureClient", "createClientFeature", "props", "markdownTransformers", "LinkMarkdownTransformer", "nodes", "LinkNode", "disableAutoLinks", "AutoLinkNode", "filter", "Boolean", "plugins", "Component", "LinkPlugin", "position", "AutoLinkPlugin", "ClickableLinkPlugin", "FloatingLinkEditorPlugin", "sanitizedClientFeatureProps", "toolbarFixed", "groups", "toolbarInline", "$isListNode", "INSERT_CHECK_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "ChecklistIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "rx", "stroke", "x", "y", "d", "strokeWidth", "ListPlugin", "LexicalListPlugin", "_jsx", "shouldRegisterListBaseNodes", "type", "featureProviderMap", "has", "slashMenuListGroupWithItems", "items", "key", "label", "i18n", "t", "$isListNode", "ListItemNode", "ListNode", "$createListItemNode", "$createListNode", "$isListItemNode", "$isListNode", "LIST_INDENT_SIZE", "listReplace", "listType", "parentNode", "children", "match", "previousNode", "getPreviousSibling", "nextNode", "getNextSibling", "listItem", "undefined", "getListType", "firstChild", "getFirstChild", "insertBefore", "append", "remove", "list", "Number", "replace", "select", "indent", "Math", "floor", "length", "setIndent", "listExport", "listNode", "exportChildren", "depth", "output", "getChildren", "index", "listItemNode", "getChildrenSize", "push", "repeat", "prefix", "getStart", "getChecked", "join", "CHECK_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "CheckListPlugin", "LexicalCheckListPlugin", "_jsx", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "ChecklistIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_CHECK_LIST_COMMAND", "undefined", "order", "ChecklistFeatureClient", "createClientFeature", "featureProviderMap", "plugins", "Component", "LexicalCheckListPlugin", "position", "shouldRegister", "shouldRegisterListBaseNodes", "push", "LexicalListPlugin", "markdownTransformers", "CHECK_LIST", "nodes", "ListNode", "ListItemNode", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "$isListNode", "INSERT_ORDERED_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "OrderedListIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "$isListNode", "ListItemNode", "ListNode", "ORDERED_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "OrderedListIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_ORDERED_LIST_COMMAND", "undefined", "order", "OrderedListFeatureClient", "createClientFeature", "featureProviderMap", "shouldRegister", "shouldRegisterListBaseNodes", "markdownTransformers", "ORDERED_LIST", "nodes", "ListNode", "ListItemNode", "plugins", "Component", "LexicalListPlugin", "position", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "$isListNode", "INSERT_UNORDERED_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "UnorderedListIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "cx", "cy", "r", "stroke", "strokeWidth", "d", "$isListNode", "ListItemNode", "ListNode", "UNORDERED_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "UnorderedListIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_UNORDERED_LIST_COMMAND", "undefined", "order", "UnorderedListFeatureClient", "createClientFeature", "markdownTransformers", "UNORDERED_LIST", "nodes", "ListNode", "ListItemNode", "plugins", "Component", "LexicalListPlugin", "position", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "addClassNamesToElement", "$applyNodeReplacement", "DecoratorNode", "React", "Component", "lazy", "then", "module", "default", "UnknownConvertedNodeComponent", "UnknownConvertedNode", "__data", "constructor", "data", "key", "clone", "node", "__key", "getType", "importJSON", "serializedNode", "$createUnknownConvertedNode", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "decorate", "_jsx", "exportJSON", "type", "version", "isInline", "updateDOM", "prevNode", "dom", "LexicalPluginToLexicalFeatureClient", "createClientFeature", "nodes", "UnknownConvertedNode", "addClassNamesToElement", "$applyNodeReplacement", "DecoratorNode", "React", "Component", "lazy", "then", "module", "default", "UnknownConvertedNodeComponent", "UnknownConvertedNode", "__data", "constructor", "data", "key", "clone", "node", "__key", "getType", "importJSON", "serializedNode", "$createUnknownConvertedNode", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "decorate", "_jsx", "exportJSON", "type", "version", "isInline", "updateDOM", "prevNode", "dom", "SlateToLexicalFeatureClient", "createClientFeature", "nodes", "UnknownConvertedNode", "$setBlocksType", "$createParagraphNode", "$getSelection", "$isParagraphNode", "$isRangeSelection", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "TextIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isParagraphNode", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "update", "$getSelection", "$setBlocksType", "$createParagraphNode", "order", "ParagraphFeatureClient", "createClientFeature", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "c", "_c", "useLexicalComposerContext", "useEffect", "useState", "BlockquoteJSXConverter", "quote", "node", "nodesToJSX", "children", "nodes", "_jsx", "HeadingJSXConverter", "heading", "node", "nodesToJSX", "children", "nodes", "NodeTag", "tag", "_jsx", "HorizontalRuleJSXConverter", "horizontalrule", "_jsx", "LinebreakJSXConverter", "linebreak", "_jsx", "LinkJSXConverter", "internalDocToHref", "autolink", "node", "nodesToJSX", "children", "nodes", "rel", "fields", "newTab", "undefined", "target", "_jsx", "href", "url", "link", "linkType", "linkNode", "console", "error", "v4", "uuidv4", "ListJSXConverter", "list", "node", "nodesToJSX", "children", "nodes", "NodeTag", "tag", "_jsx", "className", "listType", "listitem", "parent", "hasSubLists", "some", "child", "type", "uuid", "checked", "role", "style", "listStyleType", "tabIndex", "value", "_jsxs", "_Fragment", "id", "readOnly", "htmlFor", "undefined", "ParagraphJSXConverter", "paragraph", "node", "nodesToJSX", "children", "nodes", "length", "_jsx", "TabJSXConverter", "tab", "TableJSXConverter", "table", "node", "nodesToJSX", "children", "nodes", "_jsx", "className", "style", "borderCollapse", "tablecell", "TagName", "headerState", "headerStateClass", "backgroundColor", "undefined", "border", "padding", "colSpan", "rowSpan", "tablerow", "NodeFormat", "DOM_ELEMENT_TYPE", "DOM_TEXT_TYPE", "NO_DIRTY_NODES", "HAS_DIRTY_NODES", "FULL_RECONCILE", "IS_NORMAL", "IS_TOKEN", "IS_SEGMENTED", "IS_INERT", "IS_BOLD", "IS_ITALIC", "IS_STRIKETHROUGH", "IS_UNDERLINE", "IS_CODE", "IS_SUBSCRIPT", "IS_SUPERSCRIPT", "IS_HIGHLIGHT", "IS_DIRECTIONLESS", "IS_UNMERGEABLE", "IS_ALIGN_LEFT", "IS_ALIGN_CENTER", "IS_ALIGN_RIGHT", "IS_ALIGN_JUSTIFY", "IS_ALIGN_START", "IS_ALIGN_END", "IS_ALL_FORMATTING", "NON_BREAKING_SPACE", "DOUBLE_LINE_BREAK", "RTL", "LTR", "RTL_REGEX", "RegExp", "LTR_REGEX", "TEXT_TYPE_TO_FORMAT", "bold", "code", "highlight", "italic", "strikethrough", "subscript", "superscript", "underline", "DETAIL_TYPE_TO_DETAIL", "directionless", "unmergeable", "ELEMENT_TYPE_TO_FORMAT", "center", "end", "justify", "left", "right", "start", "ELEMENT_FORMAT_TO_TYPE", "TEXT_MODE_TO_TYPE", "normal", "segmented", "token", "TEXT_TYPE_TO_MODE", "TextJSXConverter", "text", "node", "format", "NodeFormat", "IS_BOLD", "_jsx", "IS_ITALIC", "IS_STRIKETHROUGH", "style", "textDecoration", "IS_UNDERLINE", "IS_CODE", "IS_SUBSCRIPT", "IS_SUPERSCRIPT", "UploadJSXConverter", "upload", "node", "uploadNode", "value", "uploadDoc", "alt", "fields", "url", "mimeType", "startsWith", "_jsx", "href", "rel", "filename", "sizes", "Object", "keys", "length", "height", "src", "width", "pictureJSX", "size", "imageSize", "filesize", "imageSizeURL", "push", "media", "srcSet", "type", "defaultJSXConverters", "ParagraphJSXConverter", "TextJSXConverter", "LinebreakJSXConverter", "BlockquoteJSXConverter", "TableJSXConverter", "HeadingJSXConverter", "HorizontalRuleJSXConverter", "ListJSXConverter", "LinkJSXConverter", "UploadJSXConverter", "TabJSXConverter", "jsx", "_jsx", "Fragment", "_Fragment", "React", "hasText", "value", "hasChildren", "root", "children", "length", "hasOnlyEmptyParagraph", "type", "paragraphNode", "paragraphNodeChild", "convertLexicalToJSX", "converters", "data", "disableIndent", "disableTextAlign", "hasText", "convertLexicalNodesToJSX", "nodes", "root", "children", "parent", "_jsx", "_Fragment", "unknownConverter", "unknown", "map", "node", "i", "converterForNode", "type", "blocks", "fields", "blockType", "console", "error", "inlineBlocks", "reactNode", "childIndex", "nodesToJSX", "args", "style", "Array", "isArray", "includes", "format", "textAlign", "indent", "paddingInlineStart", "Number", "React", "isValidElement", "newStyle", "props", "cloneElement", "key", "filter", "Boolean", "RichText", "className", "converters", "data", "editorState", "disableContainer", "disableIndent", "disableTextAlign", "finalConverters", "defaultConverters", "defaultJSXConverters", "content", "Array", "isArray", "convertLexicalToJSX", "_jsx", "_Fragment", "RichTextPlugin", "$", "_c", "editor", "useLexicalComposerContext", "t0", "getEditorState", "toJSON", "editorState", "setEditorState", "useState", "t1", "t2", "registerUpdateListener", "t3", "editorState_0", "useEffect", "_jsx", "className", "children", "RichText", "converters", "defaultJSXConverters", "data", "DebugJsxConverterFeatureClient", "createClientFeature", "plugins", "Component", "RichTextPlugin", "position", "tailwindColors", "amber", "black", "blue", "current", "cyan", "emerald", "fuchsia", "gray", "green", "indigo", "inherit", "lime", "neutral", "orange", "pink", "purple", "red", "rose", "sky", "slate", "stone", "teal", "transparent", "violet", "white", "yellow", "zinc", "defaultColors", "text", "css", "label", "background", "$isNodeSelection", "RelationshipIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "clipPath", "d", "stroke", "strokeLinecap", "strokeLinejoin", "id", "transform", "$applyNodeReplacement", "React", "DecoratorBlockNode", "addClassNamesToElement", "$applyNodeReplacement", "$relationshipElementToServerNode", "domNode", "id", "getAttribute", "relationTo", "node", "$createServerRelationshipNode", "value", "RelationshipServerNode", "__data", "constructor", "data", "format", "key", "clone", "__format", "__key", "getType", "importDOM", "div", "hasAttribute", "conversion", "priority", "importJSON", "serializedNode", "version", "importedData", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "theme", "relationship", "decorate", "_editor", "_config", "exportDOM", "setAttribute", "String", "text", "createTextNode", "getTextContent", "append", "exportJSON", "getData", "type", "getLatest", "setData", "writable", "getWritable", "RelationshipComponent", "lazy", "then", "module", "default", "$relationshipElementToNode", "domNode", "id", "getAttribute", "relationTo", "node", "$createRelationshipNode", "value", "RelationshipNode", "RelationshipServerNode", "clone", "getType", "importDOM", "div", "hasAttribute", "conversion", "priority", "importJSON", "serializedNode", "version", "importedData", "setFormat", "format", "decorate", "editor", "config", "_jsx", "className", "theme", "relationship", "data", "__data", "__format", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "$isRelationshipNode", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$getPreviousSelection", "$getSelection", "$isParagraphNode", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "createCommand", "useEffect", "c", "_c", "useLexicalComposerContext", "toast", "$getNodeByKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "c", "_c", "useLexicalComposerContext", "useListDrawer", "useModal", "$getNodeByKey", "$getPreviousSelection", "$getRoot", "$getSelection", "$isRangeSelection", "$setSelection", "useEffect", "useState", "useLexicalListDrawer", "args", "$", "editor", "selectionState", "setSelectionState", "wasOpen", "setWasOpen", "BaseListDrawer", "BaseListDrawerToggler", "t0", "closeDrawer", "baseCloseDrawer", "drawerSlug", "listDrawerSlug", "isDrawerOpen", "openDrawer", "baseOpenDrawer", "modalState", "t1", "Symbol", "for", "selection", "$storeSelection", "t2", "update", "anchor", "focus", "key", "clone", "selectEnd", "discrete", "skipTransforms", "restoreSelection", "t3", "closeListDrawer", "t4", "t5", "thisModalState", "isOpen", "setTimeout", "t6", "props", "_jsx", "onClick", "t7", "t8", "isListDrawerOpen", "ListDrawer", "ListDrawerToggler", "insertRelationship", "editor", "relationTo", "replaceNodeKey", "value", "update", "node", "$getNodeByKey", "replace", "$createRelationshipNode", "dispatchCommand", "INSERT_RELATIONSHIP_COMMAND", "RelationshipDrawerComponent", "t0", "$", "_c", "enabledCollectionSlugs", "useLexicalComposerContext", "setReplaceNodeKey", "useState", "t1", "t2", "collectionSlugs", "selectedCollection", "closeListDrawer", "ListDrawer", "openListDrawer", "useLexicalListDrawer", "t3", "t4", "registerCommand", "INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND", "payload", "nodeKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "t5", "t6", "collectionSlug", "doc", "id", "onSelect", "_jsx", "RelationshipDrawerComponentFallback", "_temp", "RelationshipDrawer", "length", "toast", "error", "useConfig", "useEntityVisibility", "React", "useEnabledRelationships", "options", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "uploads", "config", "collections", "visibleEntities", "useMemo", "enabledCollectionSlugs", "enabledCollections", "whitelistSet", "Set", "blacklistSet", "collection", "slug", "admin", "enableRichTextRelationship", "upload", "includes", "has", "push", "INSERT_RELATIONSHIP_COMMAND", "createCommand", "RelationshipPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "disabledCollections", "t2", "enabledCollections", "t3", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "enabledCollectionSlugs", "useEnabledRelationships", "t4", "t5", "hasNodes", "RelationshipNode", "Error", "registerCommand", "_temp", "COMMAND_PRIORITY_EDITOR", "useEffect", "t6", "_jsx", "RelationshipDrawer", "payload", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "relationshipNode", "$createRelationshipNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "RelationshipFeatureClient", "createClientFeature", "nodes", "RelationshipNode", "plugins", "Component", "RelationshipPlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "RelationshipIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND", "replace", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isRelationshipNode", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "useScrollInfo", "useThrottledEffect", "useTranslation", "React", "useMemo", "c", "_c", "mergeRegister", "$addUpdateTag", "$getSelection", "useDeferredValue", "useEffect", "useState", "baseClass", "ToolbarButton", "t0", "$", "_c", "children", "editor", "item", "t1", "Symbol", "for", "active", "enabled", "_state", "setState", "useState", "deferredState", "useDeferredValue", "editorConfigContext", "useEditorConfigContext", "t2", "t3", "t4", "key", "t5", "filter", "Boolean", "className", "join", "t6", "getEditorState", "read", "selection", "$getSelection", "newActive", "isActive", "newEnabled", "isEnabled", "prev", "updateStates", "runDeprioritized", "useRunDeprioritized", "t7", "t8", "listener", "cleanup", "mergeRegister", "registerUpdateListener", "document", "addEventListener", "removeEventListener", "useEffect", "t9", "focus", "update", "_temp", "onSelect", "handleClick", "handleMouseDown", "_temp2", "t10", "_jsx", "onClick", "onMouseDown", "type", "$addUpdateTag", "e", "preventDefault", "c", "_c", "React", "useCallback", "useDeferredValue", "useEffect", "useMemo", "mergeRegister", "useTranslation", "$getSelection", "Button", "$addUpdateTag", "isDOMNode", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "createPortal", "baseClass", "DropDownContext", "createContext", "DropDownItem", "active", "children", "editor", "enabled", "Icon", "item", "itemKey", "tooltip", "className", "key", "filter", "Boolean", "join", "ref", "dropDownContext", "use", "Error", "registerItem", "current", "_jsx", "buttonStyle", "disabled", "extraButtonProps", "icon", "iconPosition", "iconStyle", "onClick", "focus", "update", "onSelect", "isActive", "onMouseDown", "e", "preventDefault", "type", "DropDownItems", "dropDownRef", "itemsContainerClassNames", "onClose", "items", "setItems", "highlightedItem", "setHighlightedItem", "itemRef", "prev", "handleKeyDown", "event", "includes", "index", "indexOf", "length", "contextValue", "value", "onKeyDown", "DropDown", "buttonAriaLabel", "buttonClassName", "dropdownKey", "label", "stopCloseOnClickSelf", "buttonRef", "showDropDown", "setShowDropDown", "handleClose", "button", "dropDown", "left", "top", "getBoundingClientRect", "scrollTopOffset", "window", "scrollY", "document", "documentElement", "scrollTop", "style", "offsetHeight", "Math", "min", "innerWidth", "offsetWidth", "handle", "target", "contains", "addEventListener", "removeEventListener", "portal", "body", "_jsxs", "Fragment", "baseClass", "ToolbarItem", "t0", "$", "_c", "active", "anchorElem", "editor", "enabled", "item", "i18n", "useTranslation", "fieldProps", "t1", "useEditorConfigContext", "featureClientSchemaMap", "schemaPath", "Component", "t2", "_jsx", "key", "title", "croppedTitle", "label", "length", "substring", "DropDownItem", "Icon", "ChildComponent", "undefined", "itemKey", "tooltip", "children", "className", "MemoToolbarItem", "React", "memo", "ToolbarDropdown", "classNames", "group", "itemsContainerClassNames", "maxActiveItems", "onActiveChange", "toolbarState", "setToolbarState", "useState", "activeItemKeys", "enabledGroup", "enabledItemKeys", "deferredToolbarState", "useDeferredValue", "editorConfigContext", "items", "groupKey", "runDeprioritized", "useRunDeprioritized", "updateStates", "useCallback", "getEditorState", "read", "selection", "$getSelection", "_activeItemKeys", "_activeItems", "_enabledItemKeys", "isActive", "push", "isEnabled", "activeItems", "useEffect", "mergeRegister", "registerUpdateListener", "renderedItems", "useMemo", "map", "includes", "DropDown", "buttonAriaLabel", "buttonClassName", "filter", "Boolean", "join", "disabled", "dropdownKey", "ButtonGroupItem", "anchorElem", "editor", "item", "Component", "_jsx", "key", "ChildComponent", "ToolbarButton", "ToolbarGroupComponent", "t0", "$", "_c", "editorConfig", "group", "index", "i18n", "useTranslation", "fieldProps", "t1", "useEditorConfigContext", "featureClientSchemaMap", "schemaPath", "dropdownLabel", "setDropdownLabel", "useState", "undefined", "DropdownIcon", "setDropdownIcon", "t2", "items", "type", "length", "t3", "useEffect", "t4", "t5", "activeItems", "label", "substring", "t", "count", "onActiveChange", "t6", "features", "toolbarFixed", "groups", "_jsxs", "className", "children", "ToolbarDropdown", "Icon", "itemsContainerClassNames", "maxActiveItems", "map", "item_0", "FixedToolbar", "clientProps", "parentWithFixedToolbar", "currentToolbarRef", "useRef", "isEditable", "useLexicalEditable", "y", "useScrollInfo", "parentToolbarElem", "useMemo", "disableIfParentHasFixedToolbar", "sibling", "editorContainerRef", "current", "previousElementSibling", "classList", "contains", "useThrottledEffect", "currentToolbarElem", "currentRect", "getBoundingClientRect", "parentRect", "bottom", "top", "remove", "add", "onFocus", "event", "stopPropagation", "ref", "Fragment", "i", "getParentEditorWithFixedToolbar", "editorConfigContext", "parentEditor", "resolvedFeatureMap", "has", "FixedToolbarPlugin", "currentEditor", "useLexicalComposerContext", "currentEditorConfig", "applyToFocusedEditor", "focusedEditor", "Symbol", "for", "bb0", "document", "body", "FixedToolbarFeatureClient", "createClientFeature", "plugins", "Component", "FixedToolbarPlugin", "position", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "mergeRegister", "$getSelection", "$isRangeSelection", "$isTextNode", "COMMAND_PRIORITY_LOW", "getDOMSelection", "SELECTION_CHANGE_COMMAND", "useCallback", "useEffect", "useRef", "useState", "React", "createPortal", "getDOMRangeRect", "nativeSelection", "rootElement", "domRange", "getRangeAt", "rect", "anchorNode", "inner", "firstElementChild", "getBoundingClientRect", "setFloatingElemPosition", "args", "alwaysDisplayOnTop", "anchorElem", "anchorFlippedOffset", "floatingElem", "horizontalOffset", "HORIZONTAL_OFFSET", "horizontalPosition", "specialHandlingForCaret", "targetRect", "verticalGap", "VERTICAL_GAP", "scrollerElem", "parentElement", "style", "opacity", "transform", "floatingElemRect", "getBoundingClientRect", "anchorElementRect", "editorScrollerRect", "top", "height", "left", "width", "addedToTop", "right", "bottom", "ButtonGroupItem", "anchorElem", "editor", "item", "Component", "_jsx", "key", "ChildComponent", "ToolbarButton", "ToolbarGroupComponent", "t0", "$", "_c", "group", "index", "editorConfig", "useEditorConfigContext", "DropdownIcon", "setDropdownIcon", "useState", "t1", "items", "type", "length", "undefined", "t2", "useEffect", "t3", "t4", "activeItems", "onActiveChange", "t5", "features", "toolbarInline", "groups", "_jsxs", "className", "children", "ToolbarDropdown", "Icon", "maxActiveItems", "map", "item_0", "InlineToolbar", "floatingToolbarRef", "useRef", "caretRef", "closeFloatingToolbar", "useCallback", "current", "isOpacityZero", "style", "opacity", "isPointerEventsNone", "pointerEvents", "mouseMoveListener", "e", "buttons", "x", "clientX", "y", "clientY", "elementUnderMouse", "document", "elementFromPoint", "contains", "mouseUpListener", "addEventListener", "removeEventListener", "$updateTextFormatFloatingToolbar", "selection", "$getSelection", "nativeSelection", "getDOMSelection", "_window", "possibleLinkEditor", "querySelector", "isLinkEditorVisible", "rootElement", "getRootElement", "isCollapsed", "anchorNode", "rangeRect", "getDOMRangeRect", "offsetIfFlipped", "setFloatingElemPosition", "alwaysDisplayOnTop", "floatingElem", "horizontalPosition", "targetRect", "anchorFlippedOffset", "horizontalOffset", "specialHandlingForCaret", "verticalGap", "scrollerElem", "parentElement", "update", "getEditorState", "read", "window", "mergeRegister", "registerUpdateListener", "editorState", "registerCommand", "SELECTION_CHANGE_COMMAND", "COMMAND_PRIORITY_LOW", "ref", "i", "useInlineToolbar", "isText", "setIsText", "isEditable", "useLexicalEditable", "isComposing", "$isRangeSelection", "getTextContent", "nodes", "getNodes", "foundNodeWithText", "node", "$isTextNode", "rawTextContent", "replace", "updatePopup", "registerRootListener", "createPortal", "InlineToolbarPlugin", "useLexicalComposerContext", "InlineToolbarFeatureClient", "createClientFeature", "plugins", "Component", "InlineToolbarPlugin", "position", "TableCellNode", "TableNode", "TableRowNode", "TableIcon", "_jsx", "className", "fill", "height", "viewBox", "width", "xmlns", "clipRule", "d", "fillRule", "$createTableCellNode", "$createTableNode", "$createTableRowNode", "$isTableCellNode", "$isTableNode", "$isTableRowNode", "TableCellHeaderStates", "TableCellNode", "TableNode", "TableRowNode", "$isParagraphNode", "$isTextNode", "TABLE_ROW_REG_EXP", "TABLE_ROW_DIVIDER_REG_EXP", "TableMarkdownTransformer", "allTransformers", "type", "dependencies", "TableNode", "TableRowNode", "TableCellNode", "export", "node", "$isTableNode", "output", "row", "getChildren", "rowOutput", "$isTableRowNode", "isHeaderRow", "cell", "$isTableCellNode", "push", "$convertToMarkdownString", "replace", "trim", "__headerState", "TableCellHeaderStates", "ROW", "join", "map", "_", "regExp", "parentNode", "_1", "match", "match0", "test", "table", "getPreviousSibling", "rows", "lastRow", "length", "forEach", "setHeaderStyles", "remove", "matchCells", "mapToTableCells", "sibling", "maxCells", "$isParagraphNode", "getChildrenSize", "firstChild", "getFirstChild", "$isTextNode", "cells", "getTextContent", "Math", "max", "unshift", "previousSibling", "$createTableNode", "tableRow", "$createTableRowNode", "append", "i", "$createTableCell", "getTableColumnsSize", "selectEnd", "textContent", "$createTableCellNode", "NO_STATUS", "$convertFromMarkdownString", "split", "text", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$computeTableMapSkipCellCheck", "$deleteTableColumnAtSelection", "$deleteTableRowAtSelection", "$getNodeTriplet", "$getTableCellNodeFromLexicalNode", "$getTableColumnIndexFromTableCellNode", "$getTableNodeFromLexicalNodeOrThrow", "$getTableRowIndexFromTableCellNode", "$insertTableColumnAtSelection", "$insertTableRowAtSelection", "$isTableCellNode", "$isTableSelection", "$mergeCells", "$unmergeCell", "getTableElement", "getTableObserverFromTableElement", "TableCellHeaderStates", "TableCellNode", "mergeRegister", "useScrollInfo", "$getSelection", "$isElementNode", "$isRangeSelection", "$isTextNode", "$setSelection", "COMMAND_PRIORITY_CRITICAL", "getDOMSelection", "isDOMNode", "SELECTION_CHANGE_COMMAND", "React", "useCallback", "useEffect", "useRef", "useState", "createPortal", "MeatballsIcon", "_jsxs", "fill", "height", "viewBox", "width", "xmlns", "_jsx", "d", "computeSelectionCount", "selection", "selectionShape", "getShape", "columns", "toX", "fromX", "rows", "toY", "fromY", "$canUnmerge", "$getSelection", "$isRangeSelection", "isCollapsed", "$isTableSelection", "anchor", "is", "focus", "cell", "$getNodeTriplet", "__colSpan", "__rowSpan", "$selectLastDescendant", "node", "lastDescendant", "getLastDescendant", "$isTextNode", "select", "$isElementNode", "selectEnd", "selectNext", "TableActionMenu", "cellMerge", "contextRef", "onClose", "setIsMenuOpen", "tableCellNode", "_tableCellNode", "editor", "useLexicalComposerContext", "dropDownRef", "useRef", "updateTableCellNode", "useState", "selectionCounts", "updateSelectionCounts", "canMergeCells", "setCanMergeCells", "canUnmergeCell", "setCanUnmergeCell", "y", "useScrollInfo", "useEffect", "registerMutationListener", "TableCellNode", "nodeMutations", "get", "getKey", "getEditorState", "read", "getLatest", "skipInitialization", "currentSelectionCounts", "menuButtonElement", "current", "dropDownElement", "rootElement", "getRootElement", "rootEleRect", "getBoundingClientRect", "menuButtonRect", "style", "opacity", "dropDownElementRect", "margin", "leftPosition", "right", "width", "window", "innerWidth", "position", "left", "pageXOffset", "topPosition", "top", "height", "innerHeight", "bottom", "handleClickOutside", "event", "isDOMNode", "target", "contains", "addEventListener", "removeEventListener", "clearTableSelection", "useCallback", "update", "isAttached", "tableNode", "$getTableNodeFromLexicalNodeOrThrow", "tableElement", "getTableElement", "getElementByKey", "Error", "tableObserver", "getTableObserverFromTableElement", "$clearHighlight", "markDirty", "$setSelection", "mergeTableCellsAtSelection", "tableCells", "getNodes", "filter", "$isTableCellNode", "targetCell", "$mergeCells", "unmergeTableCellsAtSelection", "$unmergeCell", "insertTableRowAtSelection", "shouldInsertAfter", "i", "$insertTableRowAtSelection", "insertTableColumnAtSelection", "$insertTableColumnAtSelection", "deleteTableRowAtSelection", "$deleteTableRowAtSelection", "deleteTableAtSelection", "remove", "deleteTableColumnAtSelection", "$deleteTableColumnAtSelection", "toggleTableRowIsHeader", "tableRowIndex", "$getTableRowIndexFromTableCellNode", "gridMap", "$computeTableMapSkipCellCheck", "rowCells", "Set", "newStyle", "getHeaderStyles", "TableCellHeaderStates", "ROW", "col", "length", "mapCell", "has", "add", "setHeaderStyles", "toggleTableColumnIsHeader", "tableColumnIndex", "$getTableColumnIndexFromTableCellNode", "columnCells", "COLUMN", "row", "toggleRowStriping", "setRowStriping", "getRowStriping", "toggleFirstColumnFreeze", "setFrozenColumns", "getFrozenColumns", "mergeCellButton", "_jsx", "className", "onClick", "type", "createPortal", "_jsxs", "e", "stopPropagation", "ref", "Fragment", "__headerState", "document", "body", "TableCellActionMenuContainer", "anchorElem", "menuButtonRef", "menuRootRef", "isMenuOpen", "setTableMenuCellNode", "$moveMenu", "menu", "nativeSelection", "getDOMSelection", "_window", "activeElement", "disable", "classList", "tableCellParentNodeDOM", "anchorNode", "tableCellNodeFromSelection", "$getTableCellNodeFromLexicalNode", "getNode", "enabled", "isSelecting", "toggle", "tableCellRect", "anchorRect", "transform", "timeoutId", "callback", "undefined", "delayedCallback", "setTimeout", "mergeRegister", "registerUpdateListener", "registerCommand", "SELECTION_CHANGE_COMMAND", "COMMAND_PRIORITY_CRITICAL", "registerRootListener", "prevRootElement", "clearTimeout", "prevTableCellDOM", "MeatballsIcon", "TableActionMenuPlugin", "t0", "$", "_c", "isEditable", "useLexicalEditable", "t1", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$computeTableMapSkipCellCheck", "$getTableNodeFromLexicalNodeOrThrow", "$getTableRowIndexFromTableCellNode", "$isTableCellNode", "$isTableRowNode", "getDOMCellFromTarget", "getTableElement", "TableNode", "calculateZoomLevel", "mergeRegister", "$getNearestNodeFromDOMNode", "isHTMLElement", "SKIP_SCROLL_INTO_VIEW_TAG", "React", "useCallback", "useEffect", "useRef", "useState", "createPortal", "MIN_ROW_HEIGHT", "MIN_COLUMN_WIDTH", "TableCellResizer", "editor", "targetRef", "useRef", "resizerRef", "tableRectRef", "hasTable", "setHasTable", "useState", "editorConfig", "useEditorConfigContext", "mouseStartPosRef", "mouseCurrentPos", "updateMouseCurrentPos", "activeCell", "updateActiveCell", "isMouseDown", "updateIsMouseDown", "draggingDirection", "updateDraggingDirection", "resetState", "useCallback", "current", "isMouseDownOnEvent", "event", "buttons", "useEffect", "tableKeys", "Set", "mergeRegister", "registerMutationListener", "TableNode", "nodeMutations", "nodeKey", "mutation", "delete", "add", "size", "registerNodeTransform", "tableNode", "getColWidths", "numColumns", "getColumnCount", "columnWidth", "setColWidths", "Array", "fill", "onMouseMove", "target", "isHTMLElement", "x", "clientX", "y", "clientY", "contains", "cell", "getDOMCellFromTarget", "getEditorState", "read", "tableCellNode", "$getNearestNodeFromDOMNode", "elem", "Error", "$getTableNodeFromLexicalNodeOrThrow", "tableElement", "getTableElement", "getElementByKey", "getKey", "getBoundingClientRect", "onMouseDown", "onMouseUp", "removeRootListener", "registerRootListener", "rootElement", "prevRootElement", "removeEventListener", "addEventListener", "isHeightChanging", "direction", "updateRowHeight", "heightChange", "update", "$isTableCellNode", "baseRowIndex", "$getTableRowIndexFromTableCellNode", "tableRows", "getChildren", "tableRowIndex", "getColSpan", "getRowSpan", "length", "tableRow", "$isTableRowNode", "height", "getHeight", "undefined", "rowCells", "Math", "min", "map", "getCellNodeHeight", "Infinity", "newHeight", "max", "setHeight", "tag", "SKIP_SCROLL_INTO_VIEW_TAG", "activeEditor", "clientHeight", "getCellColumnIndex", "tableMap", "columnIndex", "forEach", "row", "columnIndexInner", "updateColumnWidth", "widthChange", "$computeTableMapSkipCellCheck", "colWidths", "width", "newColWidths", "newWidth", "mouseUpHandler", "handler", "preventDefault", "stopPropagation", "zoom", "calculateZoomLevel", "document", "toggleResize", "resizerStyles", "setResizerStyles", "bottom", "left", "right", "top", "zoneWidth", "styles", "backgroundColor", "cursor", "window", "scrollX", "scrollY", "tableRect", "_jsx", "ref", "_jsxs", "Fragment", "className", "lexical", "theme", "tableCellResizer", "style", "TableCellResizerPlugin", "$", "_c", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "t0", "createPortal", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$getTableAndElementByKey", "$getTableColumnIndexFromTableCellNode", "$getTableRowIndexFromTableCellNode", "$insertTableColumnAtSelection", "$insertTableRowAtSelection", "$isTableCellNode", "$isTableNode", "getTableElement", "TableNode", "$findMatchingParent", "mergeRegister", "$getNearestNodeFromDOMNode", "isHTMLElement", "useEffect", "useMemo", "useRef", "useState", "createPortal", "c", "_c", "useEffect", "useRef", "FUNC_ERROR_TEXT", "nativeMax", "Math", "max", "nativeMin", "min", "debounce", "func", "wait", "options", "lastArgs", "lastCallTime", "lastInvokeTime", "lastThis", "leading", "maxing", "maxWait", "result", "timerID", "trailing", "TypeError", "invokeFunc", "time", "args", "thisArg", "undefined", "apply", "leadingEdge", "setTimeout", "timerExpired", "remainingWait", "timeSinceLastCall", "timeSinceLastInvoke", "timeWaiting", "shouldInvoke", "Date", "now", "trailingEdge", "cancel", "clearTimeout", "flush", "debounced", "isInvoking", "arguments", "debounce_default", "useDebounce", "fn", "ms", "maxWait", "$", "_c", "debouncedRef", "useRef", "t0", "t1", "current", "debounce", "cancel", "useEffect", "t2", "Symbol", "for", "t3", "args", "BUTTON_WIDTH_PX", "TableHoverActionsContainer", "anchorElem", "editor", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "editorConfig", "useEditorConfigContext", "isShownRow", "setShownRow", "useState", "isShownColumn", "setShownColumn", "shouldListenMouseMove", "setShouldListenMouseMove", "position", "setPosition", "tableSetRef", "useRef", "Set", "tableCellDOMNodeRef", "debouncedOnMouseMove", "useDebounce", "event", "isOutside", "tableDOMNode", "getMouseInfo", "lexical", "current", "hoveredRowNode", "hoveredColumnNode", "tableDOMElement", "getEditorState", "read", "maybeTableCell", "$getNearestNodeFromDOMNode", "$isTableCellNode", "table", "$findMatchingParent", "node", "$isTableNode", "getTableElement", "getElementByKey", "getKey", "rowCount", "getChildrenSize", "colCount", "getChildAtIndex", "rowIndex", "$getTableRowIndexFromTableCellNode", "colIndex", "$getTableColumnIndexFromTableCellNode", "tableContainerElement", "parentElement", "bottom", "tableElemBottom", "height", "tableElemHeight", "left", "tableElemLeft", "right", "tableElemRight", "width", "tableElemWidth", "y", "tableElemY", "getBoundingClientRect", "tableHasScroll", "classList", "contains", "scrollWidth", "clientWidth", "editorElemLeft", "editorElemY", "offsetLeft", "top", "offsetWidth", "tableResizeObserver", "useMemo", "ResizeObserver", "useEffect", "document", "addEventListener", "removeEventListener", "mergeRegister", "registerMutationListener", "TableNode", "mutations", "resetObserver", "key", "type", "add", "delete", "disconnect", "tableKey", "tableElement", "$getTableAndElementByKey", "observe", "size", "skipInitialization", "insertAction", "insertRow", "update", "selectEnd", "$insertTableRowAtSelection", "$insertTableColumnAtSelection", "_jsxs", "_Fragment", "_jsx", "className", "theme", "tableAddRows", "onClick", "style", "tableAddColumns", "target", "isHTMLElement", "closest", "tableCell", "tableCellResizer", "TableHoverActionsPlugin", "t0", "$", "_c", "t1", "undefined", "body", "t2", "createPortal", "c", "_c", "useLexicalComposerContext", "TablePlugin", "LexicalReactTablePlugin", "INSERT_TABLE_COMMAND", "TableCellNode", "TableNode", "TableRowNode", "mergeRegister", "formatDrawerSlug", "useEditDepth", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "createCommand", "createContext", "use", "useEffect", "useMemo", "useState", "React", "OPEN_TABLE_DRAWER_COMMAND", "createCommand", "CellContext", "createContext", "cellEditorConfig", "cellEditorPlugins", "set", "TableContext", "children", "contextValue", "setContextValue", "useState", "_jsx", "value", "useMemo", "TablePlugin", "$", "_c", "editor", "useLexicalComposerContext", "cellContext", "use", "editDepth", "useEditDepth", "fieldProps", "t0", "uuid", "useEditorConfigContext", "schemaPath", "t1", "t2", "formatDrawerSlug", "slug", "depth", "drawerSlug", "toggleDrawer", "useLexicalDrawer", "t3", "hasNodes", "TableNode", "TableRowNode", "TableCellNode", "Error", "mergeRegister", "registerCommand", "rangeSelection", "getEditorState", "read", "selection", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "t4", "useEffect", "t5", "_fields", "data", "columns", "rows", "dispatchCommand", "INSERT_TABLE_COMMAND", "String", "t6", "_jsxs", "Fragment", "FieldsDrawer", "drawerTitle", "featureKey", "handleDrawerSubmit", "schemaPathSuffix", "LexicalReactTablePlugin", "hasCellBackgroundColor", "hasCellMerge", "hasHorizontalScroll", "TableFeatureClient", "createClientFeature", "markdownTransformers", "TableMarkdownTransformer", "nodes", "TableNode", "TableCellNode", "TableRowNode", "plugins", "Component", "TablePlugin", "position", "TableCellResizerPlugin", "TableActionMenuPlugin", "TableHoverActionsPlugin", "providers", "TableContext", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "TableIcon", "key", "keywords", "label", "onSelect", "editor", "dispatchCommand", "OPEN_TABLE_DRAWER_COMMAND", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "$isNodeSelection", "UploadIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeLinecap", "strokeLinejoin", "ObjectID", "$applyNodeReplacement", "React", "ObjectID", "$convertUploadElement", "domNode", "$createNode", "hasAttribute", "formID", "getAttribute", "node", "data", "pending", "src", "id", "relationTo", "fields", "value", "ObjectID", "default", "toHexString", "DecoratorBlockNode", "addClassNamesToElement", "ObjectID", "$applyNodeReplacement", "UploadServerNode", "DecoratorBlockNode", "__data", "constructor", "data", "format", "key", "clone", "node", "__format", "__key", "getType", "importDOM", "img", "conversion", "domNode", "$convertUploadElement", "$createUploadServerNode", "priority", "importJSON", "serializedNode", "version", "value", "id", "ObjectID", "default", "toHexString", "importedData", "fields", "pending", "relationTo", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "addClassNamesToElement", "theme", "upload", "decorate", "exportDOM", "setAttribute", "String", "formID", "src", "exportJSON", "getData", "type", "getLatest", "setData", "writable", "getWritable", "updateDOM", "$applyNodeReplacement", "ShimmerEffect", "PendingUploadComponent", "_jsx", "className", "height", "width", "RawUploadComponent", "lazy", "then", "module", "default", "UploadComponent", "UploadNode", "UploadServerNode", "clone", "node", "getType", "importDOM", "img", "conversion", "domNode", "$convertUploadElement", "$createUploadNode", "priority", "importJSON", "serializedNode", "version", "value", "id", "ObjectID", "toHexString", "importedData", "fields", "pending", "relationTo", "data", "setFormat", "format", "decorate", "editor", "config", "__data", "_jsx", "PendingUploadComponent", "className", "theme", "upload", "__format", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "$isUploadNode", "c", "_c", "useLexicalComposerContext", "$dfsIterator", "$insertNodeToNearestRoot", "mergeRegister", "useBulkUpload", "useEffectEvent", "useModal", "ObjectID", "$createRangeSelection", "$getPreviousSelection", "$getSelection", "$isParagraphNode", "$isRangeSelection", "$setSelection", "COMMAND_PRIORITY_EDITOR", "COMMAND_PRIORITY_LOW", "createCommand", "DROP_COMMAND", "getDOMSelectionFromTarget", "isHTMLElement", "PASTE_COMMAND", "useEffect", "c", "_c", "useLexicalComposerContext", "toast", "$getNodeByKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "insertUpload", "editor", "relationTo", "replaceNodeKey", "value", "update", "node", "$getNodeByKey", "replace", "$createUploadNode", "data", "fields", "dispatchCommand", "INSERT_UPLOAD_COMMAND", "UploadDrawerComponent", "t0", "$", "_c", "enabledCollectionSlugs", "useLexicalComposerContext", "setReplaceNodeKey", "useState", "t1", "collectionSlugs", "uploads", "closeListDrawer", "ListDrawer", "openListDrawer", "useLexicalListDrawer", "t2", "t3", "registerCommand", "INSERT_UPLOAD_WITH_DRAWER_COMMAND", "payload", "nodeKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "t4", "t5", "collectionSlug", "doc", "id", "onSelect", "_jsx", "UploadDrawerComponentFallback", "_temp", "UploadDrawer", "length", "toast", "error", "canDropImage", "event", "target", "isHTMLElement", "closest", "parentElement", "getDragSelection", "range", "domSelection", "getDOMSelectionFromTarget", "document", "caretRangeFromPoint", "clientX", "clientY", "rangeParent", "collapse", "rangeOffset", "getRangeAt", "Error", "INSERT_UPLOAD_COMMAND", "createCommand", "UploadPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "disabledCollections", "t2", "enabledCollections", "t3", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "uploads", "enabledCollectionSlugs", "useEnabledRelationships", "drawerSlug", "bulkUploadDrawerSlug", "setCollectionSlug", "setInitialForms", "setOnCancel", "setOnSuccess", "setSelectableCollections", "useBulkUpload", "isModalOpen", "openModal", "useModal", "t4", "t5", "files", "length", "initialForms", "map", "_temp", "update", "_temp2", "newDocs", "newDocsMap", "Map", "_temp3", "dfsNode_0", "$dfsIterator", "node_0", "dfsNode", "node", "$isUploadNode", "nodeData_0", "getData", "nodeData", "pending", "newDoc", "get", "formID", "replace", "$createUploadNode", "data", "id", "ObjectID", "default", "toHexString", "fields", "relationTo", "collectionSlug", "value", "doc", "openBulkUpload", "useEffectEvent", "hasNodes", "UploadNode", "mergeRegister", "registerNodeTransform", "node_1", "nodeData_1", "transformedImage", "src", "startsWith", "mimeMatch", "match", "mimeType", "base64Data", "byteCharacters", "atob", "byteNumbers", "Array", "i", "charCodeAt", "byteArray", "Uint8Array", "File", "split", "type", "blob", "fetch", "inferredFileName", "pop", "registerCommand", "payload", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "uploadNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "COMMAND_PRIORITY_EDITOR", "PASTE_COMMAND", "ClipboardEvent", "clipboardData", "types", "includes", "files_0", "from", "forEach", "file_2", "push", "alt", "file", "selection_0", "file_3", "pendingUploadNode", "URL", "createObjectURL", "focus_0", "focusNode_0", "COMMAND_PRIORITY_LOW", "DROP_COMMAND", "event_0", "DragEvent", "dt", "dataTransfer", "files_1", "file_4", "preventDefault", "stopPropagation", "selection_1", "$createRangeSelection", "applyDOMRange", "$setSelection", "file_5", "pendingUploadNode_0", "focus_1", "focusNode_1", "t6", "useEffect", "t7", "_jsx", "UploadDrawer", "UploadFeatureClient", "createClientFeature", "nodes", "UploadNode", "plugins", "Component", "UploadPlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "UploadIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_UPLOAD_WITH_DRAWER_COMMAND", "replace", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isUploadNode", "c", "_c", "ShimmerEffect", "useConfig", "lazy", "Suspense", "useEffect", "useState", "LexicalEditorTheme", "block", "blockCursor", "characterLimit", "code", "inlineBlock", "heading", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "hrSelected", "indent", "link", "list", "checklist", "listitem", "listitemChecked", "listitemUnchecked", "nested", "olDepth", "ul", "ltr", "mark", "markOverlap", "paragraph", "placeholder", "quote", "relationship", "rtl", "tab", "table", "tableAddColumns", "tableAddRows", "tableAlignment", "center", "right", "tableCell", "tableCellActionButton", "tableCellActionButtonContainer", "tableCellHeader", "tableCellResizer", "tableCellSelected", "tableFrozenColumn", "tableRowStriping", "tableScrollableWrapper", "tableSelected", "tableSelection", "text", "bold", "italic", "strikethrough", "subscript", "superscript", "underline", "underlineStrikethrough", "upload", "defaultEditorLexicalConfig", "namespace", "theme", "LexicalEditorTheme", "loadClientFeatures", "config", "featureClientImportMap", "featureClientSchemaMap", "field", "schemaPath", "unSanitizedEditorConfig", "featureProviderMap", "Map", "featureProvider", "features", "clientFeatureProps", "featureKey", "order", "undefined", "Error", "set", "sort", "a", "b", "resolvedFeatures", "loaded", "feature", "key", "deepMerge", "sanitizeClientFeatures", "features", "sanitized", "enabledFeatures", "enabledFormats", "markdownTransformers", "nodes", "plugins", "providers", "slashMenu", "dynamicGroups", "groups", "toolbarFixed", "toolbarInline", "customGroups", "forEach", "feature", "key", "sanitizedClientFeatureProps", "size", "length", "concat", "enableFormats", "push", "node", "plugin", "i", "clientProps", "Component", "position", "group", "foundGroup", "find", "sanitizedGroup", "filter", "items", "optionGroup", "transformer", "allNodes", "allTransformers", "Object", "keys", "map", "customConfig", "sort", "a", "b", "order", "sanitizeClientEditorConfig", "resolvedClientFeatureMap", "lexical", "admin", "resolvedFeatureMap", "RichTextEditor", "lazy", "then", "module", "default", "RichText", "RichTextField", "props", "$", "_c", "admin", "t0", "clientFeatures", "featureClientImportMap", "t1", "featureClientSchemaMap", "field", "lexicalEditorConfig", "t2", "schemaPath", "t3", "undefined", "t4", "defaultEditorLexicalConfig", "config", "useConfig", "finalSanitizedEditorConfig", "setFinalSanitizedEditorConfig", "useState", "t5", "t6", "featureProvidersLocal", "clientFeature", "Object", "values", "clientFeatureProvider", "push", "clientFeatureProps", "resolvedClientFeatures", "loadClientFeatures", "name", "unSanitizedEditorConfig", "features", "lexical", "sanitizeClientEditorConfig", "useEffect", "t7", "_jsx", "Suspense", "fallback", "ShimmerEffect", "height", "editorConfig", "isHTMLElement", "x", "HTMLElement", "joinClasses", "args", "filter", "Boolean", "join", "elements", "WeakMap", "readTouch", "e", "touch", "changedTouches", "undefined", "clientX", "clientY", "addListener", "element", "cb", "elementValues", "get", "listeners", "Set", "handleTouchstart", "start", "handleTouchend", "end", "listener", "addEventListener", "set", "add", "deleteListener", "delete", "size", "removeEventListener", "addSwipeLeftListener", "force", "x", "y", "Math", "abs", "addSwipeRightListener", "addSwipeUpListener", "addSwipeDownListener", "c", "_c", "InlineBlockEditButton", "$", "_c", "EditButton", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockRemoveButton", "$", "_c", "RemoveButton", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockLabel", "$", "_c", "Label", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockContainer", "t0", "$", "_c", "children", "useInlineBlockComponentContext", "t1", "_jsx", "BlockCollapsible", "props", "children", "rest", "useBlockComponentContext", "_jsx", "c", "_c", "BlockEditButton", "$", "_c", "EditButton", "useBlockComponentContext", "t0", "_jsx", "c", "_c", "BlockRemoveButton", "$", "_c", "RemoveButton", "useBlockComponentContext", "t0", "_jsx", "stringify", "getRestPopulateFn", "apiURL", "depth", "draft", "locale", "id", "collectionSlug", "select", "query", "addQueryPrefix", "fetch", "credentials", "headers", "Accept", "method", "then", "res", "json", "codeConverter", "customEndRegex", "optional", "regExp", "customStartRegex", "doNotTrimChildren", "export", "fields", "code", "includes", "language", "length", "import", "children", "closeMatch", "openMatch", "startsWith", "slice", "endsWith", "input", "trim", "CodeField", "useFormFields", "useId", "useMemo", "defaultLanguages", "abap", "apex", "azcli", "bat", "bicep", "cameligo", "clojure", "coffee", "cpp", "csharp", "csp", "css", "cypher", "dart", "dockerfile", "ecl", "elixir", "flow9", "freemarker2", "fsharp", "go", "graphql", "handlebars", "hcl", "html", "ini", "java", "javascript", "julia", "kotlin", "less", "lexon", "liquid", "lua", "m3", "markdown", "mdx", "mips", "msdax", "mysql", "pascal", "pascaligo", "perl", "pgsql", "php", "pla", "plaintext", "postiats", "powerquery", "powershell", "protobuf", "pug", "python", "qsharp", "r", "razor", "redis", "redshift", "restructuredtext", "ruby", "rust", "sb", "scala", "scheme", "scss", "shell", "solidity", "sophia", "sparql", "sql", "st", "swift", "systemverilog", "tcl", "twig", "typescript", "typespec", "vb", "wgsl", "xml", "yaml", "CodeComponent", "autoComplete", "field", "forceRender", "languages", "defaultLanguages", "path", "permissions", "readOnly", "renderedBlocks", "schemaPath", "typescript", "validate", "languageField", "useFormFields", "fields", "language", "value", "initialValue", "instanceId", "useId", "label", "props", "useMemo", "type", "admin", "editorOptions", "editorProps", "defaultPath", "name", "undefined", "key", "_jsx", "CodeField", "onMount", "_editor", "monaco", "editor", "defineTheme", "base", "colors", "inherit", "rules", "typescriptDefaults", "setCompilerOptions", "allowNonTsExtensions", "allowJs", "allowSyntheticDefaultImports", "esModuleInterop", "jsx", "JsxEmit", "React", "moduleResolution", "ModuleResolutionKind", "NodeJs", "noEmit", "paths", "reactNamespace", "target", "ScriptTarget", "typeRoots", "setDiagnosticsOptions", "noSemanticValidation", "enableSemanticValidation", "noSyntaxValidation", "fetchTypes", "Array", "isArray", "length", "Promise", "all", "map", "typesText", "fetch", "url", "text", "addExtraLib", "filePath", "useLexicalEditable", "ChevronIcon", "Combobox", "CopyToClipboard", "PopupList", "RenderFields", "useForm", "useFormFields", "useTranslation", "React", "CodeBlockIcon", "_jsx", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "useCollapsible", "CollapseIcon", "_jsx", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "strokeLinejoin", "baseClass", "Collapse", "toggle", "useCollapsible", "_jsx", "className", "onClick", "type", "CollapseIcon", "useCollapsible", "useTranslation", "baseClass", "FloatingCollapse", "isCollapsed", "toggle", "useCollapsible", "t", "useTranslation", "_jsxs", "className", "onClick", "type", "_jsx", "CollapseIcon", "baseClass", "CodeBlockBlockComponent", "args", "languages", "languagesFromProps", "defaultLanguages", "BlockCollapsible", "formSchema", "RemoveButton", "useBlockComponentContext", "setModified", "useForm", "t", "useTranslation", "codeField", "useFormFields", "fields", "code", "selectedLanguageField", "setSelectedLanguage", "dispatch", "language", "type", "path", "value", "selectedLanguageLabel", "isEditable", "useLexicalEditable", "languageEntries", "React", "useMemo", "Object", "entries", "map", "languageCode", "languageLabel", "name", "Component", "_jsx", "PopupList", "Button", "active", "disabled", "onClick", "className", "Actions", "_jsxs", "Combobox", "button", "ChevronIcon", "buttonType", "horizontalAlign", "minEntriesForSearch", "searchPlaceholder", "showScrollbar", "size", "CopyToClipboard", "Collapse", "collapsibleProps", "AfterCollapsible", "FloatingCollapse", "disableHeaderToggle", "disableToggleIndicator", "Pill", "CodeBlockIcon", "RenderFields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "readOnly", "c", "_c", "FieldContext", "FieldPathContext", "ServerFunctionsContext", "ShimmerEffect", "useServerFunctions", "React", "useEffect", "useRef", "RenderLexical", "args", "$", "field", "initialValue", "Loading", "path", "schemaPath", "setValue", "value", "Component", "setComponent", "useState", "serverFunctionContext", "_internal_renderField", "entityType", "entitySlug", "split", "fieldPath", "name", "t0", "Field", "type", "admin", "hidden", "undefined", "renderLexical", "mounted", "t1", "t2", "current", "_jsx", "adjustedServerFunctionContext", "getFormState", "getFormStateArgs", "collectionSlug", "globalSlug", "children", "fieldValue", "disabled", "formInitializing", "formProcessing", "formSubmitted", "_temp", "showError", "buildEditorState", "nodes", "text", "editorJSON", "root", "type", "children", "direction", "format", "indent", "version", "push", "detail", "mode", "style", "textFormat", "textStyle", "length", "buildDefaultEditorState"]
4
+ "sourcesContent": ["import type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\n\nexport function slashMenuBasicGroupWithItems(items: SlashMenuItem[]): SlashMenuGroup {\n return {\n items,\n key: 'basic',\n label: ({ i18n }) => {\n return i18n.t('lexical:general:slashMenuBasicGroupLabel')\n },\n }\n}\n", "'use client'\n\nimport type { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode'\nimport type { ElementFormatType, ElementNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $isDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode'\nimport { $findMatchingParent } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isNodeSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n FORMAT_ELEMENT_COMMAND,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { AlignCenterIcon } from '../../../lexical/ui/icons/AlignCenter/index.js'\nimport { AlignJustifyIcon } from '../../../lexical/ui/icons/AlignJustify/index.js'\nimport { AlignLeftIcon } from '../../../lexical/ui/icons/AlignLeft/index.js'\nimport { AlignRightIcon } from '../../../lexical/ui/icons/AlignRight/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarAlignGroupWithItems } from './toolbarAlignGroup.js'\n\n// DecoratorBlockNode has format, but Lexical forgot\n// to add the getters like ElementNode does.\nconst getFormatType = (node: DecoratorBlockNode | ElementNode): ElementFormatType => {\n if ($isElementNode(node)) {\n return node.getFormatType()\n }\n return node.__format\n}\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarAlignGroupWithItems([\n {\n ChildComponent: AlignLeftIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'left') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'left') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignLeft',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignLeftLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left')\n },\n order: 1,\n },\n {\n ChildComponent: AlignCenterIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'center') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'center') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignCenter',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignCenterLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center')\n },\n order: 2,\n },\n {\n ChildComponent: AlignRightIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'right') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'right') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignRight',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignRightLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right')\n },\n order: 3,\n },\n {\n ChildComponent: AlignJustifyIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isElementNode(node) || $isDecoratorBlockNode(node)) {\n if (getFormatType(node) === 'justify') {\n continue\n }\n }\n\n const parent = node.getParent()\n if ($isElementNode(parent) || $isDecoratorBlockNode(parent)) {\n if (getFormatType(parent) === 'justify') {\n continue\n }\n }\n\n return false\n }\n return true\n },\n key: 'alignJustify',\n label: ({ i18n }) => {\n return i18n.t('lexical:align:alignJustifyLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify')\n },\n order: 4,\n },\n ]),\n]\n\nconst AlignPlugin = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n // Just like the default Lexical configuration, but in\n // addition to ElementNode we also set DecoratorBlocks\n return editor.registerCommand(\n FORMAT_ELEMENT_COMMAND,\n (format) => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) && !$isNodeSelection(selection)) {\n return false\n }\n const nodes = selection.getNodes()\n for (const node of nodes) {\n const element = $findMatchingParent(\n node,\n (parentNode): parentNode is DecoratorBlockNode | ElementNode =>\n ($isElementNode(parentNode) || $isDecoratorBlockNode(parentNode)) &&\n !parentNode.isInline(),\n )\n if (element !== null) {\n element.setFormat(format)\n }\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n )\n }, [editor])\n return null\n}\n\nexport const AlignFeatureClient = createClientFeature({\n plugins: [\n {\n Component: AlignPlugin,\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const AlignCenterIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 15H15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignJustifyIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignLeftIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AlignRightIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import type { ClientConfig, RichTextFieldClient } from 'payload'\n\nimport type {\n BaseClientFeatureProps,\n ClientFeature,\n ClientFeatureProviderMap,\n FeatureProviderClient,\n FeatureProviderProviderClient,\n ResolvedClientFeatureMap,\n} from '../features/typesClient.js'\nimport type { ClientEditorConfig } from '../lexical/config/types.js'\nimport type { FeatureClientSchemaMap } from '../types.js'\n\nexport type CreateClientFeatureArgs<UnSanitizedClientProps, ClientProps> =\n | ((props: {\n config: ClientConfig\n featureClientImportMap: Record<string, any>\n featureClientSchemaMap: FeatureClientSchemaMap\n /** unSanitizedEditorConfig.features, but mapped */\n featureProviderMap: ClientFeatureProviderMap\n field?: RichTextFieldClient\n props: BaseClientFeatureProps<UnSanitizedClientProps>\n // other resolved features, which have been loaded before this one. All features declared in 'dependencies' should be available here\n resolvedFeatures: ResolvedClientFeatureMap\n schemaPath: string\n // unSanitized EditorConfig,\n unSanitizedEditorConfig: ClientEditorConfig\n }) => ClientFeature<ClientProps>)\n | Omit<ClientFeature<ClientProps>, 'sanitizedClientFeatureProps'>\n\nexport const createClientFeature: <\n UnSanitizedClientProps = undefined,\n ClientProps = UnSanitizedClientProps,\n>(\n args: CreateClientFeatureArgs<UnSanitizedClientProps, ClientProps>,\n) => FeatureProviderProviderClient<UnSanitizedClientProps, ClientProps> = (feature) => {\n const featureProviderProvideClient: FeatureProviderProviderClient<any, any> = (props) => {\n const featureProviderClient: Partial<FeatureProviderClient<any, any>> = {\n clientFeatureProps: props,\n }\n\n if (typeof feature === 'function') {\n featureProviderClient.feature = ({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n }) => {\n const toReturn = feature({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n props,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n })\n\n if (toReturn.sanitizedClientFeatureProps === null) {\n toReturn.sanitizedClientFeatureProps = props\n }\n\n return toReturn\n }\n } else {\n // We have to spread feature here! Otherwise, if the arg of createClientFeature is not a function, and 2\n // richText editors have the same feature (even if both call it, e.g. both call UploadFeature()),\n // the second richText editor here will override sanitizedClientFeatureProps of the first feature, as both richText\n // editor features share the same reference to the feature object.\n // Example: richText editor 1 and 2 both have UploadFeature. richText editor 1 calls UploadFeature() with custom fields,\n // richText editor 2 calls UploadFeature() with NO custom fields. If we don't spread feature here, richText editor 1\n // will not have any custom fields, as richText editor 2 will override the feature object.\n const newFeature: ClientFeature<any> = { ...feature }\n newFeature.sanitizedClientFeatureProps = props\n featureProviderClient.feature = newFeature\n }\n return featureProviderClient as FeatureProviderClient<any, any>\n }\n\n return featureProviderProvideClient\n}\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { AlignLeftIcon } from '../../../lexical/ui/icons/AlignLeft/index.js'\n\nexport const toolbarAlignGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: AlignLeftIcon,\n items,\n key: 'align',\n order: 30,\n }\n}\n", "'use client'\n\nimport { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { BlockquoteIcon } from '../../../lexical/ui/icons/Blockquote/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: BlockquoteIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isQuoteNode(node) && !$isQuoteNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'blockquote',\n label: ({ i18n }) => {\n return i18n.t('lexical:blockquote:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n order: 20,\n },\n ]),\n]\n\nexport const BlockquoteFeatureClient = createClientFeature({\n markdownTransformers: [MarkdownTransformer],\n nodes: [QuoteNode],\n\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: BlockquoteIcon,\n key: 'blockquote',\n keywords: ['quote', 'blockquote'],\n label: ({ i18n }) => {\n return i18n.t('lexical:blockquote:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createQuoteNode())\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const BlockquoteIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5353 10.5725C13.5353 9.47709 11.0456 9.99991 11.0456 7.85883C11.0456 6.46464 12.1162 5.61816 13.361 5.61816C14.805 5.61816 16 6.86298 16 8.92937C16 11.2945 14.4564 13.7841 11.1203 14.3816L10.8216 13.1368C12.888 12.4895 13.5353 11.4937 13.5353 10.5725ZM6.71369 10.5725C6.71369 9.47709 4.22407 9.99991 4.22407 7.85883C4.22407 6.46464 5.29461 5.61816 6.53942 5.61816C7.9834 5.61816 9.17842 6.86298 9.17842 8.92937C9.17842 11.2945 7.63485 13.7841 4.29876 14.3816L4 13.1368C6.06639 12.4895 6.71369 11.4937 6.71369 10.5725Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const TextIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.708 14.5H7.79785V13.9414H8.01367C9.00391 13.9414 9.15625 13.9033 9.15625 13.6113V6.70508H8.07715C6.82031 6.70508 6.73145 7.08594 6.28711 8.67285H5.80469L5.91895 6.12109H13.5869L13.7012 8.67285H13.2188C12.7744 7.08594 12.6855 6.70508 11.4287 6.70508H10.3496V13.6113C10.3496 13.9033 10.502 13.9414 11.4922 13.9414H11.708V14.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { TextIcon } from '../../../lexical/ui/icons/Text/index.js'\n\nexport const toolbarTextDropdownGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: TextIcon,\n items,\n key: 'text',\n order: 25,\n }\n}\n", "import { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text'\n\nimport type { ElementTransformer } from '../../packages/@lexical/markdown/index.js'\n\nexport const MarkdownTransformer: ElementTransformer = {\n type: 'element',\n dependencies: [QuoteNode],\n export: (node, exportChildren) => {\n if (!$isQuoteNode(node)) {\n return null\n }\n\n const lines = exportChildren(node).split('\\n')\n const output: string[] = []\n for (const line of lines) {\n output.push('> ' + line)\n }\n return output.join('\\n')\n },\n regExp: /^>\\s/,\n replace: (parentNode, children, _match, isImport) => {\n if (isImport) {\n const previousNode = parentNode.getPreviousSibling()\n if ($isQuoteNode(previousNode)) {\n previousNode.splice(previousNode.getChildrenSize(), 0, [...children])\n previousNode.select(0, 0)\n parentNode.remove()\n return\n }\n }\n\n const node = $createQuoteNode()\n node.append(...children)\n parentNode.replace(node)\n node.select(0, 0)\n },\n}\n", "'use client'\n\nimport type { I18nClient } from '@payloadcms/translations'\nimport type { BlocksFieldClient, ClientBlock } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\nimport { InlineBlocksIcon } from '../../../lexical/ui/icons/InlineBlocks/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { getBlockImageComponent } from './getBlockImageComponent.js'\nimport { getBlockMarkdownTransformers } from './markdown/markdownTransformer.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { InlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './plugin/commands.js'\nimport { BlocksPlugin } from './plugin/index.js'\nexport const BlocksFeatureClient = createClientFeature(\n ({ config, featureClientSchemaMap, props, schemaPath }) => {\n const schemaMapRenderedBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks`\n const schemaMapRenderedInlineBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks`\n const clientSchema = featureClientSchemaMap['blocks']\n\n if (!clientSchema) {\n return {}\n }\n\n const blocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const inlineBlocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedInlineBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedInlineBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const clientBlocks: ClientBlock[] = blocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n const clientInlineBlocks: ClientBlock[] = inlineBlocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n return {\n markdownTransformers: getBlockMarkdownTransformers({\n blocks: clientBlocks,\n inlineBlocks: clientInlineBlocks,\n }),\n nodes: [BlockNode, InlineBlockNode],\n plugins: [\n {\n Component: BlocksPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: [\n clientBlocks?.length\n ? {\n items: clientBlocks.map((block) => {\n return {\n Icon: getBlockImageComponent(block.imageURL, block.imageAltText),\n key: 'block-' + block.slug,\n keywords: ['block', 'blocks', block.slug],\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'blocks',\n label: ({ i18n }: { i18n: I18nClient<object, 'lexical:blocks:label'> }) => {\n return i18n.t('lexical:blocks:label')\n },\n }\n : null,\n clientInlineBlocks?.length\n ? {\n items: clientInlineBlocks.map((inlineBlock) => {\n return {\n Icon: InlineBlocksIcon,\n key: 'inlineBlocks-' + inlineBlock.slug,\n keywords: ['inlineBlock', 'inline block', inlineBlock.slug],\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'inlineBlocks',\n label: ({\n i18n,\n }: {\n i18n: I18nClient<object, 'lexical:blocks:inlineBlocks:label'>\n }) => {\n return i18n.t('lexical:blocks:inlineBlocks:label')\n },\n }\n : null,\n ].filter(Boolean) as SlashMenuGroup[],\n },\n toolbarFixed: {\n groups: [\n clientBlocks.length\n ? {\n type: 'dropdown',\n ChildComponent: BlockIcon,\n items: clientBlocks.map((block, index) => {\n return {\n ChildComponent: getBlockImageComponent(block.imageURL, block.imageAltText),\n isActive: undefined, // At this point, we would be inside a sub-richtext-editor. And at this point this will be run against the focused sub-editor, not the parent editor which has the actual block. Thus, no point in running this\n key: 'block-' + block.slug,\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'blocks',\n order: 20,\n }\n : null,\n clientInlineBlocks?.length\n ? {\n type: 'dropdown',\n ChildComponent: InlineBlocksIcon,\n items: clientInlineBlocks.map((inlineBlock, index) => {\n return {\n ChildComponent: inlineBlock.imageURL\n ? getBlockImageComponent(inlineBlock.imageURL, inlineBlock.imageAltText)\n : InlineBlocksIcon,\n isActive: undefined,\n key: 'inlineBlock-' + inlineBlock.slug,\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'inlineBlocks',\n order: 25,\n }\n : null,\n ].filter(Boolean) as ToolbarGroup[],\n },\n }\n },\n)\n", "'use client'\nimport React from 'react'\n\nexport const BlockIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"8\" y=\"5\" />\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"5\" y=\"11\" />\n <rect height=\"4\" rx=\"0.5\" stroke=\"currentColor\" width=\"4\" x=\"11\" y=\"11\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const InlineBlocksIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M5.33333 6.5C5.11232 6.5 4.90036 6.5878 4.74408 6.74408C4.5878 6.90036 4.5 7.11232 4.5 7.33333V12.1667C4.5 12.3877 4.5878 12.5996 4.74408 12.7559C4.90036 12.9122 5.11232 13 5.33333 13H14.6667C14.8877 13 15.0996 12.9122 15.2559 12.7559C15.4122 12.5996 15.5 12.3877 15.5 12.1667V11.6667C15.5 11.3905 15.7239 11.1667 16 11.1667C16.2761 11.1667 16.5 11.3905 16.5 11.6667V12.1667C16.5 12.6529 16.3068 13.1192 15.963 13.463C15.6192 13.8068 15.1529 14 14.6667 14H5.33333C4.8471 14 4.38079 13.8068 4.03697 13.463C3.69315 13.1192 3.5 12.6529 3.5 12.1667V7.33333C3.5 6.8471 3.69315 6.38079 4.03697 6.03697C4.38079 5.69315 4.8471 5.5 5.33333 5.5H10.3333C10.6095 5.5 10.8333 5.72386 10.8333 6C10.8333 6.27614 10.6095 6.5 10.3333 6.5H5.33333ZM13 6.5C12.7239 6.5 12.5 6.27614 12.5 6C12.5 5.72386 12.7239 5.5 13 5.5H16C16.2761 5.5 16.5 5.72386 16.5 6V9C16.5 9.27614 16.2761 9.5 16 9.5C15.7239 9.5 15.5 9.27614 15.5 9V7.20711L13.3536 9.35355C13.1583 9.54882 12.8417 9.54882 12.6464 9.35355C12.4512 9.15829 12.4512 8.84171 12.6464 8.64645L14.7929 6.5H13ZM6.16699 8.33325C6.16699 8.05711 6.39085 7.83325 6.66699 7.83325H11.0003C11.2765 7.83325 11.5003 8.05711 11.5003 8.33325C11.5003 8.60939 11.2765 8.83325 11.0003 8.83325H6.66699C6.39085 8.83325 6.16699 8.60939 6.16699 8.33325ZM6.16699 10.9999C6.16699 10.7238 6.39085 10.4999 6.66699 10.4999H13.3337C13.6098 10.4999 13.8337 10.7238 13.8337 10.9999C13.8337 11.2761 13.6098 11.4999 13.3337 11.4999H6.66699C6.39085 11.4999 6.16699 11.2761 6.16699 10.9999Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\n\nexport function getBlockImageComponent(imageURL?: string, imageAltText?: string) {\n if (!imageURL) {\n return BlockIcon\n }\n\n return () => (\n <img\n alt={imageAltText ?? 'Block Image'}\n className=\"lexical-block-custom-image\"\n src={imageURL}\n style={{ maxHeight: 20, maxWidth: 20 }}\n />\n )\n}\n", "import type { ClientBlock } from 'payload'\n\nimport {\n $parseSerializedNode,\n type ElementNode,\n type Klass,\n type LexicalNode,\n type LexicalNodeReplacement,\n type SerializedLexicalNode,\n} from 'lexical'\n\nimport type { Transformer } from '../../../../packages/@lexical/markdown/index.js'\nimport type {\n MultilineElementTransformer,\n TextMatchTransformer,\n} from '../../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { extractPropsFromJSXPropsString } from '../../../../utilities/jsx/extractPropsFromJSXPropsString.js'\nimport { propsToJSXString } from '../../../../utilities/jsx/jsx.js'\nimport { linesFromStartToContentAndPropsString } from '../../server/markdown/linesFromMatchToContentAndPropsString.js'\nimport { $createBlockNode, $isBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport {\n $createInlineBlockNode,\n $isInlineBlockNode,\n InlineBlockNode,\n} from '../nodes/InlineBlocksNode.js'\nimport { getLexicalToMarkdown } from './getLexicalToMarkdown.js'\nimport { getMarkdownToLexical } from './getMarkdownToLexical.js'\n\nfunction createTagRegexes(tagName: string) {\n const escapedTagName = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n return {\n regExpEnd: new RegExp(`</(${escapedTagName})\\\\s*>|<${escapedTagName}[^>]*?/>`, 'i'),\n regExpStart: new RegExp(`<(${escapedTagName})([^>]*?)\\\\s*(/?)>`, 'i'),\n }\n}\nexport const getBlockMarkdownTransformers = ({\n blocks,\n inlineBlocks,\n}: {\n blocks: ClientBlock[]\n inlineBlocks: ClientBlock[]\n}): ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n}) => MultilineElementTransformer | TextMatchTransformer)[] => {\n if (!blocks?.length && !inlineBlocks?.length) {\n return []\n }\n let transformers: ((props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer)[] = []\n\n if (blocks?.length) {\n for (const block of blocks) {\n const transformer = getMarkdownTransformerForBlock(block, false)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n if (inlineBlocks?.length) {\n for (const block of inlineBlocks) {\n const transformer = getMarkdownTransformerForBlock(block, true)\n\n if (transformer) {\n transformers = transformers.concat(transformer)\n }\n }\n }\n\n return transformers\n}\n\nfunction getMarkdownTransformerForBlock(\n block: ClientBlock,\n isInlineBlock: boolean,\n): Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n> | null {\n if (!block.jsx) {\n return null\n }\n const regex = createTagRegexes(block.slug)\n const toReturn: Array<\n (props: {\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>\n allTransformers: Transformer[]\n }) => MultilineElementTransformer | TextMatchTransformer\n > = []\n\n if (isInlineBlock) {\n toReturn.push(({ allNodes, allTransformers }) => ({\n type: 'text-match',\n dependencies: [InlineBlockNode],\n export: (node) => {\n if (!$isInlineBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>${exportResult.children}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n getEndIndex: (node, match) => {\n const { endlineLastCharIndex } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: match,\n trimChildren: false,\n })\n\n return endlineLastCharIndex\n },\n importRegExp: block.jsx?.customStartRegex ?? regex.regExpStart,\n regExp: /___ignoreignoreignore___/g,\n replace(node, match) {\n const { content, propsString } = linesFromStartToContentAndPropsString({\n isEndOptional: false,\n lines: [node.getTextContent()],\n regexpEndRegex: regex.regExpEnd,\n startLineIndex: 0,\n startMatch: {\n ...match,\n index: 0,\n },\n trimChildren: false,\n })\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: match,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return\n }\n\n const inlineBlockNode = $createInlineBlockNode({\n blockType: block.slug,\n ...(blockFields as any),\n })\n\n node.replace(inlineBlockNode)\n },\n }))\n\n return toReturn\n }\n\n toReturn.push(({ allNodes, allTransformers }) => ({\n dependencies: [BlockNode],\n export: (node) => {\n if (!$isBlockNode(node)) {\n return null\n }\n\n if (node.getFields()?.blockType?.toLowerCase() !== block.slug.toLowerCase()) {\n return null\n }\n\n const nodeFields = node.getFields()\n const lexicalToMarkdown = getLexicalToMarkdown(allNodes, allTransformers)\n\n const exportResult = block.jsx!.export({\n fields: nodeFields,\n lexicalToMarkdown,\n })\n if (exportResult === false) {\n return null\n }\n if (typeof exportResult === 'string') {\n return exportResult\n }\n\n const hasProps = exportResult.props && Object.keys(exportResult.props)?.length > 0\n const props = exportResult.props ?? {}\n\n if (exportResult?.children?.length) {\n const children = exportResult.children\n let sanitizedChildren = ''\n\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (children.includes('\\n')) {\n for (const child of children.split('\\n')) {\n let sanitizedChild = ''\n if (!block?.jsx?.doNotTrimChildren && child !== '') {\n sanitizedChild = ' '\n }\n sanitizedChild += child + '\\n'\n\n sanitizedChildren += sanitizedChild\n }\n } else {\n sanitizedChildren = (block?.jsx?.doNotTrimChildren ? '' : ' ') + children + '\\n'\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}>\\n${sanitizedChildren}</${nodeFields.blockType}>`\n }\n\n return `<${nodeFields.blockType}${hasProps ? ' ' + propsToJSXString({ props }) : ''}/>`\n },\n handleImportAfterStartMatch: block.jsx?.customEndRegex\n ? undefined\n : ({ lines, rootNode, startLineIndex, startMatch, transformer }) => {\n const regexpEndRegex: RegExp | undefined =\n typeof transformer.regExpEnd === 'object' && 'regExp' in transformer.regExpEnd\n ? transformer.regExpEnd.regExp\n : transformer.regExpEnd\n\n const isEndOptional =\n transformer.regExpEnd &&\n typeof transformer.regExpEnd === 'object' &&\n 'optional' in transformer.regExpEnd\n ? transformer.regExpEnd.optional\n : !transformer.regExpEnd\n\n const {\n afterEndLine,\n beforeStartLine,\n content: unsanitizedContent,\n endLineIndex,\n propsString,\n } = linesFromStartToContentAndPropsString({\n isEndOptional,\n lines,\n regexpEndRegex,\n startLineIndex,\n startMatch,\n trimChildren: false,\n })\n\n let content = ''\n\n if (block?.jsx?.doNotTrimChildren) {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n } else {\n // Ensure it has a leftpad of at least 2 spaces. The data is saved without those spaces, so we can just blindly add it to every child\n if (unsanitizedContent.includes('\\n')) {\n const split = unsanitizedContent.split('\\n')\n let index = 0\n for (const child of split) {\n index++\n\n if (child.startsWith(' ')) {\n content += child.slice(2)\n } else {\n // If one child is misaligned, skip aligning completely, unless it's just empty\n if (child === '') {\n content += child\n } else {\n content = unsanitizedContent.endsWith('\\n')\n ? unsanitizedContent.slice(0, -1)\n : unsanitizedContent\n break\n }\n }\n\n content += index === split.length ? '' : '\\n'\n }\n } else {\n content =\n (!unsanitizedContent.startsWith(' ')\n ? unsanitizedContent\n : unsanitizedContent.slice(2)) + '\\n'\n }\n }\n\n if (!block?.jsx?.import) {\n // No multiline transformer handled this line successfully\n return [false, startLineIndex]\n }\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: content,\n closeMatch: null,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: startMatch,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return [false, startLineIndex]\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n // Now handle beforeStartLine and afterEndLine. If those are not empty, we need to add them as text nodes before and after the block node.\n // However, those themselves can contain other markdown matches, so we need to parse them as well.\n // Example where this is needed: \"Hello <InlineCode>inline code</InlineCode> test.\"\n let prevNodes: null | SerializedLexicalNode[] = null\n let nextNodes: null | SerializedLexicalNode[] = null\n // TODO: Might not need this prevNodes and nextNodes handling if inline nodes are handled by textmatch transformers\n\n if (beforeStartLine?.length) {\n prevNodes = markdownToLexical({ markdown: beforeStartLine })?.root?.children ?? []\n\n const firstPrevNode = prevNodes?.[0]\n if (firstPrevNode) {\n rootNode.append($parseSerializedNode(firstPrevNode))\n }\n }\n\n rootNode.append(node)\n\n if (afterEndLine?.length) {\n nextNodes = markdownToLexical({ markdown: afterEndLine })?.root?.children\n const lastChild = rootNode.getChildren()[rootNode.getChildren().length - 1]\n\n const children = ($parseSerializedNode(nextNodes[0]!) as ElementNode)?.getChildren()\n if (children?.length) {\n for (const child of children) {\n ;(lastChild as ElementNode).append(child)\n }\n }\n }\n }\n\n return [true, endLineIndex]\n },\n regExpEnd: block.jsx?.customEndRegex ?? regex.regExpEnd,\n regExpStart: block.jsx?.customStartRegex ?? regex.regExpStart,\n // This replace is ONLY run for ``` code blocks (so any blocks with custom start and end regexes). For others, we use the special JSX handling above:\n type: 'multiline-element',\n replace: (rootNode, children, openMatch, closeMatch, linesInBetween) => {\n if (block?.jsx?.import) {\n if (!linesInBetween) {\n // convert children to linesInBetween\n let line = ''\n if (children) {\n for (const child of children) {\n line += child.getTextContent()\n }\n }\n\n linesInBetween = [line]\n }\n\n let childrenString = ''\n if (block?.jsx?.doNotTrimChildren) {\n childrenString = linesInBetween.join('\\n')\n } else {\n childrenString = linesInBetween.join('\\n').trim()\n }\n\n const propsString = openMatch[1]?.trim()\n\n const markdownToLexical = getMarkdownToLexical(allNodes, allTransformers)\n\n const blockFields = block.jsx.import({\n children: childrenString,\n closeMatch: closeMatch as RegExpMatchArray,\n htmlToLexical: null, // TODO\n markdownToLexical,\n openMatch: openMatch as RegExpMatchArray,\n props: propsString\n ? extractPropsFromJSXPropsString({\n propsString,\n })\n : {},\n })\n if (blockFields === false) {\n return false\n }\n\n const node = $createBlockNode({\n blockType: block.slug,\n ...blockFields,\n } as any)\n\n if (node) {\n rootNode.append(node)\n }\n\n return\n }\n return false // Run next transformer\n },\n }))\n\n return toReturn\n}\n", "import { JSOX } from 'jsox'\n\n/**\n * Turns a JSX props string into an object.\n *\n * @example\n *\n * Input: type=\"info\" hello={{heyyy: 'test', someNumber: 2}}\n * Output: { type: 'info', hello: { heyyy: 'test', someNumber: 2 } }\n */\nexport function extractPropsFromJSXPropsString({\n propsString,\n}: {\n propsString: string\n}): Record<string, any> {\n const props: Record<string, any> = {}\n let key = ''\n let collectingKey = true\n\n for (let i = 0; i < propsString.length; i++) {\n const char = propsString[i]\n\n if (collectingKey) {\n if (char === '=' || char === ' ') {\n if (key) {\n if (char === ' ') {\n props[key] = true\n key = ''\n } else {\n collectingKey = false\n }\n }\n } else {\n key += char\n }\n } else {\n const result = handleValue(propsString, i)\n props[key] = result.value\n i = result.newIndex\n key = ''\n collectingKey = true\n }\n }\n\n if (key) {\n props[key] = true\n }\n\n return props\n}\n\nfunction handleValue(propsString: string, startIndex: number): { newIndex: number; value: any } {\n const char = propsString[startIndex]\n\n if (char === '\"') {\n return handleQuotedString(propsString, startIndex)\n } else if (char === \"'\") {\n return handleQuotedString(propsString, startIndex, true)\n } else if (char === '{') {\n return handleObject(propsString, startIndex)\n } else if (char === '[') {\n return handleArray(propsString, startIndex)\n } else {\n return handleUnquotedString(propsString, startIndex)\n }\n}\n\nfunction handleArray(propsString: string, startIndex: number): { newIndex: number; value: any } {\n let bracketCount = 1\n let value = ''\n let i = startIndex + 1\n\n while (i < propsString.length && bracketCount > 0) {\n if (propsString[i] === '[') {\n bracketCount++\n } else if (propsString[i] === ']') {\n bracketCount--\n }\n if (bracketCount > 0) {\n value += propsString[i]\n }\n i++\n }\n\n return { newIndex: i, value: JSOX.parse(`[${value}]`) }\n}\n\nfunction handleQuotedString(\n propsString: string,\n startIndex: number,\n isSingleQuoted = false,\n): { newIndex: number; value: string } {\n let value = ''\n let i = startIndex + 1\n while (\n i < propsString.length &&\n (propsString[i] !== (isSingleQuoted ? \"'\" : '\"') || propsString[i - 1] === '\\\\')\n ) {\n value += propsString[i]\n i++\n }\n return { newIndex: i, value }\n}\n\nfunction handleObject(propsString: string, startIndex: number): { newIndex: number; value: any } {\n let bracketCount = 1\n let value = ''\n let i = startIndex + 1\n\n while (i < propsString.length && bracketCount > 0) {\n if (propsString[i] === '{') {\n bracketCount++\n } else if (propsString[i] === '}') {\n bracketCount--\n }\n if (bracketCount > 0) {\n value += propsString[i]\n }\n i++\n }\n\n return { newIndex: i, value: parseObject(value) }\n}\n\nfunction parseObject(objString: string): Record<string, any> {\n if (objString[0] !== '{') {\n return JSOX.parse(objString)\n }\n\n const result = JSOX.parse(objString.replace(/(\\w+):/g, '\"$1\":'))\n\n return result\n}\n\nfunction handleUnquotedString(\n propsString: string,\n startIndex: number,\n): { newIndex: number; value: string } {\n let value = ''\n let i = startIndex\n while (i < propsString.length && propsString[i] !== ' ') {\n value += propsString[i]\n i++\n }\n return { newIndex: i - 1, value }\n}\n", "/**\n * Converts an object of props to a JSX props string.\n *\n * This function is the inverse of `extractPropsFromJSXPropsString`.\n */\nexport function propsToJSXString({ props }: { props: Record<string, any> }): string {\n const propsArray: string[] = []\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string') {\n // Handle simple string props\n propsArray.push(`${key}=\"${escapeQuotes(value)}\"`)\n } else if (typeof value === 'number') {\n // Handle number and boolean props\n propsArray.push(`${key}={${value}}`)\n } else if (typeof value === 'boolean') {\n if (value) {\n propsArray.push(`${key}`)\n }\n } else if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n // Handle array props\n propsArray.push(`${key}={[${value.map((v) => JSON.stringify(v, replacer)).join(', ')}]}`)\n } else {\n // Handle complex object props\n propsArray.push(`${key}={${JSON.stringify(value, replacer)}}`)\n }\n }\n }\n\n return propsArray.join(' ')\n}\n\n// Helper function to escape quotes in string values\nfunction escapeQuotes(str: string): string {\n return str.replace(/\"/g, '&quot;')\n}\n\n// Custom replacer function for JSON.stringify to handle single quotes\nfunction replacer(key: string, value: any): any {\n if (typeof value === 'string') {\n return value.replace(/'/g, \"\\\\'\")\n }\n return value\n}\n\n/**\n * Converts a frontmatter string to an object.\n */\nexport function frontmatterToObject(frontmatter: string): Record<string, any> {\n const lines = frontmatter.trim().split('\\n')\n const result = {}\n let inFrontmatter = false\n\n for (const line of lines) {\n if (line.trim() === '---') {\n inFrontmatter = !inFrontmatter\n continue\n }\n\n if (inFrontmatter) {\n const [key, ...valueParts] = line.split(':')\n const value = valueParts.join(':').trim()\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n result[key.trim()] = value\n }\n }\n\n return result\n}\n\n/**\n * Converts an object to a frontmatter string.\n */\nexport function objectToFrontmatter(obj: Record<string, any>): null | string {\n if (!Object.entries(obj)?.length) {\n return null\n }\n let frontmatter = '---\\n'\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n frontmatter += `${key}: ${value.join(', ')}\\n`\n } else {\n frontmatter += `${key}: ${value}\\n`\n }\n }\n\n frontmatter += '---\\n'\n return frontmatter\n}\n\n/**\n * Takes an MDX content string and extracts the frontmatter and content.\n *\n * The resulting object contains the mdx content without the frontmatter and the frontmatter itself.\n */\nexport function extractFrontmatter(mdxContent: string) {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const frontmatterRegex = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/\n const match = mdxContent.match(frontmatterRegex)\n\n if (match) {\n const frontmatter = match[0]\n const contentWithoutFrontmatter = mdxContent.slice(frontmatter.length).trim()\n return {\n content: contentWithoutFrontmatter,\n frontmatter: frontmatter.trim(),\n }\n } else {\n // If no frontmatter is found, return the original content\n return {\n content: mdxContent.trim(),\n frontmatter: '',\n }\n }\n}\n", "export function linesFromStartToContentAndPropsString({\n isEndOptional,\n lines,\n regexpEndRegex,\n startLineIndex,\n startMatch,\n trimChildren,\n}: {\n isEndOptional?: boolean\n lines: string[]\n regexpEndRegex?: RegExp\n startLineIndex: number\n startMatch: RegExpMatchArray\n trimChildren?: boolean\n}): {\n /**\n * The matched string after the end match, in the same line as the end match. Useful for inline matches.\n */\n afterEndLine: string\n /**\n * The matched string before the start match, in the same line as the start match. Useful for inline matches.\n */\n beforeStartLine: string\n content: string\n endLineIndex: number\n endlineLastCharIndex: number\n propsString: string\n} {\n let propsString = ''\n let content = ''\n const linesCopy = lines.slice(startLineIndex)\n\n let isWithinContent = false // If false => is within prop\n let contentSubTagStartAmount = 0\n\n let bracketCount = 0\n let quoteChar: null | string = null\n let isSelfClosing = false\n let isWithinCodeBlockAmount = 0\n\n const beforeStartLine = linesCopy[0]!.slice(0, startMatch.index)\n let endlineLastCharIndex = 0\n\n let endLineIndex = startLineIndex\n\n mainLoop: for (const [lineIndex, lineCopy] of linesCopy.entries()) {\n const line = trimChildren ? lineCopy.trim() : lineCopy\n let amountOfBeginningSpacesRemoved = 0\n if (trimChildren) {\n for (let i = 0; i < lineCopy.length; i++) {\n if (lineCopy[i] === ' ') {\n amountOfBeginningSpacesRemoved++\n } else {\n break\n }\n }\n }\n\n let charIndex = 0\n\n if (lineIndex === 0) {\n charIndex = (startMatch.index ?? 0) + startMatch[0].length - amountOfBeginningSpacesRemoved // We need to also loop over the \">\" in something like \"<InlineCode>\" in order to later set isWithinContent to true\n }\n\n while (charIndex < line.length) {\n const char = line[charIndex]\n const nextChar = line[charIndex + 1]\n\n if (!isWithinContent) {\n if (char === '{' && !quoteChar) {\n bracketCount++\n } else if (char === '}' && !quoteChar) {\n bracketCount--\n } else if ((char === '\"' || char === \"'\") && !quoteChar) {\n quoteChar = char\n } else if (char === quoteChar) {\n quoteChar = null\n }\n\n if (char === '/' && nextChar === '>' && bracketCount === 0 && !quoteChar) {\n isSelfClosing = true\n endLineIndex = lineIndex\n endlineLastCharIndex = charIndex + 2\n\n break mainLoop\n } else if (char === '>' && bracketCount === 0 && !quoteChar) {\n isWithinContent = true\n charIndex++\n continue\n }\n\n propsString += char\n } else {\n if (char === '`') {\n isWithinCodeBlockAmount++\n }\n\n if (isWithinCodeBlockAmount % 2 === 0) {\n if (char === '<' && nextChar === '/') {\n contentSubTagStartAmount--\n\n if (contentSubTagStartAmount < 0) {\n if (content[content.length - 1] === '\\n') {\n content = content.slice(0, -1) // Remove the last newline\n }\n endLineIndex = lineIndex\n // Calculate endlineLastCharIndex by finding \">\" in line\n for (let i = charIndex; i < line.length; i++) {\n if (line[i] === '>') {\n endlineLastCharIndex = i + 1\n\n break\n }\n }\n break mainLoop\n }\n } else if (char === '/' && nextChar === '>') {\n contentSubTagStartAmount--\n\n if (contentSubTagStartAmount < 0) {\n if (content[content.length - 1] === '\\n') {\n content = content.slice(0, -1) // Remove the last newline\n }\n endLineIndex = lineIndex\n endlineLastCharIndex = charIndex + 2\n break mainLoop\n }\n } else if (char === '<' && nextChar !== '/') {\n contentSubTagStartAmount++\n }\n }\n\n content += char\n }\n\n charIndex++\n }\n\n if (isWithinContent) {\n if (content?.length > 0 && lineIndex > 0) {\n content += '\\n'\n }\n } else {\n propsString += '\\n'\n }\n\n if (regexpEndRegex && contentSubTagStartAmount < 0) {\n // If 0 and in same line where it got lowered to 0 then this is not the match we are looking for\n const match = line.match(regexpEndRegex)\n if (match?.index !== undefined) {\n endLineIndex = lineIndex\n endlineLastCharIndex = match.index + match[0].length - 1\n break\n }\n }\n\n if (lineIndex === linesCopy.length - 1 && !isEndOptional && !isSelfClosing) {\n throw new Error(\n 'End match not found for lines ' +\n lines.join('\\n') +\n '\\n\\n. Start match: ' +\n JSON.stringify(startMatch),\n )\n }\n }\n\n const afterEndLine = linesCopy[endLineIndex]!.trim().slice(endlineLastCharIndex)\n\n return {\n afterEndLine,\n beforeStartLine,\n content,\n endLineIndex: startLineIndex + endLineIndex,\n endlineLastCharIndex,\n propsString,\n }\n}\n", "'use client'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n type EditorConfig,\n type LexicalEditor,\n type LexicalNode,\n} from 'lexical'\nimport React, { type JSX } from 'react'\n\nimport type { BlockFieldsOptionalID, SerializedBlockNode } from '../../server/nodes/BlocksNode.js'\n\nimport { ServerBlockNode } from '../../server/nodes/BlocksNode.js'\nimport { BlockComponent } from '../component/index.js'\n\nexport class BlockNode extends ServerBlockNode {\n static override clone(node: ServerBlockNode): ServerBlockNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importJSON(serializedNode: SerializedBlockNode): BlockNode {\n if (serializedNode.version === 1) {\n // Convert (version 1 had the fields wrapped in another, unnecessary data property)\n serializedNode = {\n ...serializedNode,\n fields: {\n ...(serializedNode as any).fields.data,\n },\n version: 2,\n }\n }\n const node = $createBlockNode(serializedNode.fields)\n node.setFormat(serializedNode.format)\n return node\n }\n\n override decorate(_editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return (\n <BlockComponent\n cacheBuster={this.getCacheBuster()}\n className={config.theme.block ?? 'LexicalEditorTheme__block'}\n formData={this.getFields()}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedBlockNode {\n return super.exportJSON()\n }\n}\n\nexport function $createBlockNode(fields: BlockFieldsOptionalID): BlockNode {\n return $applyNodeReplacement(\n new BlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isBlockNode(node: BlockNode | LexicalNode | null | undefined): node is BlockNode {\n return node instanceof BlockNode\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { JsonObject } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\ntype BaseBlockFields<TBlockFields extends JsonObject = JsonObject> = {\n /** Block form data */\n blockName: string\n blockType: string\n} & TBlockFields\n\nexport type BlockFields<TBlockFields extends JsonObject = JsonObject> = {\n id: string\n} & BaseBlockFields<TBlockFields>\n\nexport type BlockFieldsOptionalID<TBlockFields extends JsonObject = JsonObject> = {\n id?: string\n} & BaseBlockFields<TBlockFields>\n\nexport type SerializedBlockNode<TBlockFields extends JsonObject = JsonObject> = {\n fields: BlockFields<TBlockFields>\n} & StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'block'>\n\nexport class ServerBlockNode extends DecoratorBlockNode {\n __cacheBuster: number\n __fields: BlockFields\n\n constructor({\n cacheBuster,\n fields,\n format,\n key,\n }: {\n cacheBuster?: number\n fields: BlockFields\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__fields = fields\n this.__cacheBuster = cacheBuster || 0\n }\n\n static override clone(node: ServerBlockNode): ServerBlockNode {\n return new this({\n cacheBuster: node.__cacheBuster,\n fields: node.__fields,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'block'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {}\n }\n\n static override importJSON(serializedNode: SerializedBlockNode): ServerBlockNode {\n if (serializedNode.version === 1) {\n // Convert (version 1 had the fields wrapped in another, unnecessary data property)\n serializedNode = {\n ...serializedNode,\n fields: {\n ...(serializedNode as any).fields.data,\n },\n version: 2,\n }\n }\n const node = $createServerBlockNode(serializedNode.fields)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.block)\n return element\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedBlockNode {\n return {\n ...super.exportJSON(),\n type: 'block',\n fields: this.getFields(),\n version: 2,\n }\n }\n\n getCacheBuster(): number {\n return this.getLatest().__cacheBuster\n }\n\n getFields(): BlockFields {\n return this.getLatest().__fields\n }\n\n override getTextContent(): string {\n return `Block Field`\n }\n\n setFields(fields: BlockFields, preventFormStateUpdate?: boolean): void {\n const writable = this.getWritable()\n writable.__fields = fields\n if (!preventFormStateUpdate) {\n writable.__cacheBuster++\n }\n }\n}\n\nexport function $createServerBlockNode(fields: BlockFieldsOptionalID): ServerBlockNode {\n return $applyNodeReplacement(\n new ServerBlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n }),\n )\n}\n\nexport function $isServerBlockNode(\n node: LexicalNode | null | ServerBlockNode | undefined,\n): node is ServerBlockNode {\n return node instanceof ServerBlockNode\n}\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Button,\n Collapsible,\n Drawer,\n EditDepthProvider,\n ErrorPill,\n Form,\n formatDrawerSlug,\n FormSubmit,\n Pill,\n RenderFields,\n SectionTitle,\n useConfig,\n useDocumentForm,\n useDocumentInfo,\n useEditDepth,\n useFormSubmitted,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/shared'\nimport { $getNodeByKey } from 'lexical'\nimport {\n type BlocksFieldClient,\n type ClientBlock,\n type CollapsedPreferences,\n type FormState,\n} from 'payload'\nimport { deepCopyObjectSimpleWithoutReactComponents, reduceFieldsToValues } from 'payload/shared'\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react'\nimport { v4 as uuid } from 'uuid'\n\nimport type { BlockFields } from '../../server/nodes/BlocksNode.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { useLexicalDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isBlockNode } from '../nodes/BlocksNode.js'\nimport { type BlockCollapsibleWithErrorProps, BlockContent } from './BlockContent.js'\nimport { removeEmptyArrayValues } from './removeEmptyArrayValues.js'\n\ntype Props = {\n /**\n * Can be modified by the node in order to trigger the re-fetch of the initial state based on the\n * formData. This is useful when node.setFields() is explicitly called from outside of the form - in\n * this case, the new field state is likely not reflected in the form state, so we need to re-fetch\n */\n readonly cacheBuster: number\n readonly className: string\n readonly formData: BlockFields\n readonly nodeKey: string\n}\n\nexport const BlockComponent: React.FC<Props> = (props) => {\n const { cacheBuster, className: baseClass, formData, nodeKey } = props\n const submitted = useFormSubmitted()\n const { id, collectionSlug, globalSlug } = useDocumentInfo()\n const {\n fieldProps: {\n featureClientSchemaMap,\n field: parentLexicalRichTextField,\n initialLexicalFormState,\n schemaPath,\n },\n uuid: uuidFromContext,\n } = useEditorConfigContext()\n\n const { fields: parentDocumentFields } = useDocumentForm()\n const onChangeAbortControllerRef = useRef(new AbortController())\n const editDepth = useEditDepth()\n const [errorCount, setErrorCount] = React.useState(0)\n\n const { config } = useConfig()\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-blocks-create-${uuidFromContext}-${formData.id}`,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n // Used for saving collapsed to preferences (and gettin' it from there again)\n // Remember, these preferences are scoped to the whole document, not just this form. This\n // is important to consider for the data path used in setDocFieldPreferences\n const { getDocPreferences, setDocFieldPreferences } = useDocumentInfo()\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const blockType = formData.blockType\n\n const { getFormState } = useServerFunctions()\n const schemaFieldsPath = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockType}.fields`\n\n const [initialState, setInitialState] = React.useState<false | FormState | undefined>(() => {\n // Initial form state that was calculated server-side. May have stale values\n const cachedFormState = initialLexicalFormState?.[formData.id]?.formState\n if (!cachedFormState) {\n return false\n }\n\n // Merge current formData values into the cached form state\n // This ensures that when the component remounts (e.g., due to view changes), we don't lose user edits\n const mergedState = Object.fromEntries(\n Object.entries(cachedFormState).map(([fieldName, fieldState]) => [\n fieldName,\n fieldName in formData\n ? {\n ...fieldState,\n initialValue: formData[fieldName],\n value: formData[fieldName],\n }\n : fieldState,\n ]),\n )\n\n // Manually add blockName, as it's not part of cachedFormState\n mergedState.blockName = {\n initialValue: formData.blockName,\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n }\n\n return mergedState\n })\n\n const hasMounted = useRef(false)\n const prevCacheBuster = useRef(cacheBuster)\n useEffect(() => {\n if (hasMounted.current) {\n if (prevCacheBuster.current !== cacheBuster) {\n setInitialState(false)\n }\n prevCacheBuster.current = cacheBuster\n } else {\n hasMounted.current = true\n }\n }, [cacheBuster])\n\n const [CustomLabel, setCustomLabel] = React.useState<React.ReactNode | undefined>(\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n initialState?.['_components']?.customComponents?.BlockLabel ?? undefined,\n )\n\n const [CustomBlock, setCustomBlock] = React.useState<React.ReactNode | undefined>(\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n initialState?.['_components']?.customComponents?.Block ?? undefined,\n )\n\n // Initial state for newly created blocks\n useEffect(() => {\n const abortController = new AbortController()\n\n const awaitInitialState = async () => {\n /*\n * This will only run if a new block is created. For all existing blocks that are loaded when the document is loaded, or when the form is saved,\n * this is not run, as the lexical field RSC will fetch the state server-side and pass it to the client. That way, we avoid unnecessary client-side\n * requests. Though for newly created blocks, we need to fetch the state client-side, as the server doesn't know about the block yet.\n */\n const { state } = await getFormState({\n id,\n collectionSlug,\n data: formData,\n docPermissions: { fields: true },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n globalSlug,\n initialBlockData: formData,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: true,\n schemaPath: schemaFieldsPath,\n signal: abortController.signal,\n })\n\n if (state) {\n state.blockName = {\n initialValue: formData.blockName,\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n }\n\n const newFormStateData: BlockFields = reduceFieldsToValues(\n deepCopyObjectSimpleWithoutReactComponents(state, { excludeFiles: true }),\n true,\n ) as BlockFields\n\n // Things like default values may come back from the server => update the node with the new data\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n const newData = newFormStateData\n newData.blockType = blockType\n\n node.setFields(newData, true)\n }\n })\n\n setInitialState(state)\n setCustomLabel(state._components?.customComponents?.BlockLabel ?? undefined)\n setCustomBlock(state._components?.customComponents?.Block ?? undefined)\n }\n }\n\n if (formData && !initialState) {\n void awaitInitialState()\n }\n\n return () => {\n abortAndIgnore(abortController)\n }\n }, [\n getFormState,\n schemaFieldsPath,\n isEditable,\n id,\n formData,\n editor,\n nodeKey,\n initialState,\n collectionSlug,\n globalSlug,\n getDocPreferences,\n parentDocumentFields,\n blockType,\n ])\n\n const [isCollapsed, setIsCollapsed] = React.useState<boolean>(\n initialLexicalFormState?.[formData.id]?.collapsed ?? false,\n )\n\n const componentMapRenderedBlockPath = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockType}`\n\n const clientSchemaMap = featureClientSchemaMap['blocks']\n\n const blocksField: BlocksFieldClient | undefined = clientSchemaMap?.[\n componentMapRenderedBlockPath\n ]?.[0] as BlocksFieldClient\n\n const clientBlock: ClientBlock | undefined = blocksField.blockReferences\n ? typeof blocksField?.blockReferences?.[0] === 'string'\n ? config.blocksMap[blocksField?.blockReferences?.[0]]\n : blocksField?.blockReferences?.[0]\n : blocksField?.blocks?.[0]\n\n const { i18n, t } = useTranslation<object, string>()\n\n const onChange = useCallback(\n async ({ formState: prevFormState, submit }: { formState: FormState; submit?: boolean }) => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n\n const controller = new AbortController()\n onChangeAbortControllerRef.current = controller\n\n const { state: newFormState } = await getFormState({\n id,\n collectionSlug,\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n formState: prevFormState,\n globalSlug,\n initialBlockFormState: prevFormState,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: submit ? true : false,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!newFormState) {\n return prevFormState\n }\n\n if (prevFormState.blockName) {\n newFormState.blockName = prevFormState.blockName\n }\n\n const newFormStateData: BlockFields = reduceFieldsToValues(\n removeEmptyArrayValues({\n fields: deepCopyObjectSimpleWithoutReactComponents(newFormState, { excludeFiles: true }),\n }),\n true,\n ) as BlockFields\n\n setTimeout(() => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n const newData = newFormStateData\n newData.blockType = blockType\n node.setFields(newData, true)\n }\n })\n }, 0)\n\n if (submit) {\n setCustomLabel(newFormState._components?.customComponents?.BlockLabel ?? undefined)\n setCustomBlock(newFormState._components?.customComponents?.Block ?? undefined)\n\n let rowErrorCount = 0\n for (const formField of Object.values(newFormState)) {\n if (formField?.valid === false) {\n rowErrorCount++\n }\n }\n setErrorCount(rowErrorCount)\n }\n\n return newFormState\n },\n\n [\n getFormState,\n id,\n collectionSlug,\n getDocPreferences,\n globalSlug,\n schemaFieldsPath,\n blockType,\n parentDocumentFields,\n isEditable,\n editor,\n nodeKey,\n ],\n )\n\n useEffect(() => {\n return () => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n }\n }, [])\n\n const removeBlock = useCallback(() => {\n editor.update(() => {\n $getNodeByKey(nodeKey)?.remove()\n })\n }, [editor, nodeKey])\n\n const blockDisplayName = clientBlock?.labels?.singular\n ? getTranslation(clientBlock.labels.singular, i18n)\n : clientBlock?.slug\n\n const onCollapsedChange = useCallback(\n (changedCollapsed: boolean) => {\n void getDocPreferences().then((currentDocPreferences) => {\n const currentFieldPreferences =\n currentDocPreferences?.fields?.[parentLexicalRichTextField.name]\n\n const collapsedArray = currentFieldPreferences?.collapsed\n\n const newCollapsed: CollapsedPreferences =\n collapsedArray && collapsedArray?.length ? collapsedArray : []\n\n if (changedCollapsed) {\n if (!newCollapsed.includes(formData.id)) {\n newCollapsed.push(formData.id)\n }\n } else {\n if (newCollapsed.includes(formData.id)) {\n newCollapsed.splice(newCollapsed.indexOf(formData.id), 1)\n }\n }\n\n setDocFieldPreferences(parentLexicalRichTextField.name, {\n collapsed: newCollapsed,\n hello: 'hi',\n })\n })\n },\n [getDocPreferences, parentLexicalRichTextField.name, setDocFieldPreferences, formData.id],\n )\n\n const EditButton = useMemo(\n () => () => (\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__editButton`}\n disabled={!isEditable}\n el=\"button\"\n icon=\"edit\"\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n toggleDrawer()\n return false\n }}\n onMouseDown={(e) => {\n // Needed to preserve lexical selection for toggleDrawer lexical selection restore.\n // I believe this is needed due to this button (usually) being inside of a collapsible.\n e.preventDefault()\n }}\n round\n size=\"small\"\n tooltip={t('lexical:blocks:inlineBlocks:edit', { label: blockDisplayName })}\n />\n ),\n [baseClass, isEditable, t, blockDisplayName, toggleDrawer],\n )\n\n const RemoveButton = useMemo(\n () => () => (\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__removeButton`}\n disabled={!isEditable}\n icon=\"x\"\n onClick={(e) => {\n e.preventDefault()\n removeBlock()\n }}\n round\n tooltip=\"Remove Block\"\n />\n ),\n [baseClass, isEditable, removeBlock],\n )\n\n const BlockCollapsible = useMemo(\n () =>\n ({\n Actions,\n children,\n className,\n collapsibleProps,\n disableBlockName,\n editButton,\n errorCount,\n fieldHasErrors,\n Label,\n Pill: CustomPill,\n removeButton,\n }: BlockCollapsibleWithErrorProps) => {\n return (\n <div className={`${baseClass}__container ${baseClass}-${blockType}`}>\n <Collapsible\n className={[\n `${baseClass}__row`,\n fieldHasErrors ? `${baseClass}__row--has-errors` : `${baseClass}__row--no-errors`,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n collapsibleStyle={fieldHasErrors ? 'error' : 'default'}\n header={\n <div className={`${baseClass}__block-header`}>\n {typeof Label !== 'undefined' ? (\n Label\n ) : typeof CustomLabel !== 'undefined' ? (\n CustomLabel\n ) : (\n <div className={`${baseClass}__block-label`}>\n {typeof CustomPill !== 'undefined' ? (\n CustomPill\n ) : (\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${blockType}`}\n pillStyle=\"white\"\n size=\"small\"\n >\n {blockDisplayName ?? blockType}\n </Pill>\n )}\n {!disableBlockName && !clientBlock?.admin?.disableBlockName && (\n <SectionTitle path=\"blockName\" readOnly={!isEditable} />\n )}\n\n {fieldHasErrors && (\n <ErrorPill count={errorCount ?? 0} i18n={i18n} withMessage />\n )}\n </div>\n )}\n\n <div className={`${baseClass}__block-actions`}>\n {typeof Actions !== 'undefined' ? (\n Actions\n ) : (\n <>\n {(CustomBlock && editButton !== false) || (!CustomBlock && editButton) ? (\n <EditButton />\n ) : null}\n {removeButton !== false && isEditable ? <RemoveButton /> : null}\n </>\n )}\n </div>\n </div>\n }\n isCollapsed={isCollapsed}\n key={0}\n onToggle={(incomingCollapsedState) => {\n onCollapsedChange(incomingCollapsedState)\n setIsCollapsed(incomingCollapsedState)\n }}\n {...(collapsibleProps || {})}\n >\n {children}\n </Collapsible>\n </div>\n )\n },\n [\n CustomBlock,\n CustomLabel,\n EditButton,\n RemoveButton,\n blockDisplayName,\n baseClass,\n clientBlock?.admin?.disableBlockName,\n blockType,\n i18n,\n isCollapsed,\n onCollapsedChange,\n isEditable,\n ],\n )\n\n const blockID = formData?.id\n\n const BlockDrawer = useMemo(\n () => () => (\n <EditDepthProvider>\n <Drawer\n className={''}\n slug={drawerSlug}\n title={t(`lexical:blocks:inlineBlocks:${blockID ? 'edit' : 'create'}`, {\n label: blockDisplayName ?? t('lexical:blocks:inlineBlocks:label'),\n })}\n >\n {initialState ? (\n <>\n <RenderFields\n fields={clientBlock?.fields ?? []}\n forceRender\n parentIndexPath=\"\"\n parentPath=\"\" // See Blocks feature path for details as for why this is empty\n parentSchemaPath={schemaFieldsPath}\n permissions={true}\n readOnly={!isEditable}\n />\n <FormSubmit programmaticSubmit={true}>{t('fields:saveChanges')}</FormSubmit>\n </>\n ) : null}\n </Drawer>\n </EditDepthProvider>\n ),\n [\n initialState,\n drawerSlug,\n blockID,\n blockDisplayName,\n t,\n isEditable,\n clientBlock?.fields,\n schemaFieldsPath,\n // DO NOT ADD FORMDATA HERE! Adding formData will kick you out of sub block editors while writing.\n ],\n )\n\n // Memoized Form JSX\n const Block = useMemo(() => {\n if (!initialState) {\n return null\n }\n return (\n <Form\n beforeSubmit={[\n async ({ formState }) => {\n // This is only called when form is submitted from drawer - usually only the case if the block has a custom Block component\n return await onChange({ formState, submit: true })\n },\n ]}\n el=\"div\"\n fields={clientBlock?.fields ?? []}\n initialState={initialState}\n onChange={[onChange]}\n onSubmit={(formState, newData) => {\n // This is only called when form is submitted from drawer - usually only the case if the block has a custom Block component\n newData.blockType = blockType\n editor.update(() => {\n const node = $getNodeByKey(nodeKey)\n if (node && $isBlockNode(node)) {\n node.setFields(newData as BlockFields, true)\n }\n })\n toggleDrawer()\n }}\n submitted={submitted}\n uuid={uuid()}\n >\n <BlockContent\n baseClass={baseClass}\n BlockDrawer={BlockDrawer}\n Collapsible={BlockCollapsible}\n CustomBlock={CustomBlock}\n EditButton={EditButton}\n errorCount={errorCount}\n formSchema={clientBlock?.fields ?? []}\n initialState={initialState}\n nodeKey={nodeKey}\n RemoveButton={RemoveButton}\n />\n </Form>\n )\n }, [\n BlockCollapsible,\n BlockDrawer,\n CustomBlock,\n blockType,\n RemoveButton,\n EditButton,\n baseClass,\n editor,\n errorCount,\n toggleDrawer,\n clientBlock?.fields,\n // DO NOT ADD FORMDATA HERE! Adding formData will kick you out of sub block editors while writing.\n initialState,\n nodeKey,\n onChange,\n submitted,\n ])\n\n if (!clientBlock) {\n return (\n <BlockCollapsible disableBlockName={true} fieldHasErrors={true}>\n <div className={`${baseClass}-not-found`}>\n Error: Block '{blockType}' not found in the config but exists in the lexical data\n </div>\n </BlockCollapsible>\n )\n }\n\n return Block\n}\n", "'use client'\nimport type { CollapsibleProps } from '@payloadcms/ui/elements/Collapsible'\nimport type { ClientField, FormState } from 'payload'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { RenderFields, useFormSubmitted } from '@payloadcms/ui'\nimport React, { createContext, useMemo } from 'react'\n\nexport type BlockCollapsibleProps = {\n /**\n * Replace the top-right portion of the header that renders the Edit and Remove buttons with custom content.\n * If this property is provided, the `removeButton` and `editButton` properties are ignored.\n */\n Actions?: React.ReactNode\n children?: React.ReactNode\n /**\n * Additional className to the collapsible wrapper\n */\n className?: string\n /**\n * Props to pass to the underlying Collapsible component. You could use this to override the `Header` entirely, for example.\n */\n collapsibleProps?: Partial<CollapsibleProps>\n /**\n * Whether to disable rendering the block name field in the header Label\n * @default false\n */\n disableBlockName?: boolean\n /**\n * Whether to show the Edit button\n * If `Actions` is provided, this property is ignored.\n * @default true\n */\n editButton?: boolean\n /**\n * Replace the default Label component with a custom Label\n */\n Label?: React.ReactNode\n /**\n * Replace the default Pill component component that's rendered within the default Label component with a custom Pill.\n * This property has no effect if you provide a custom Label component via the `Label` property.\n */\n Pill?: React.ReactNode\n /**\n * Whether to show the Remove button\n * If `Actions` is provided, this property is ignored.\n * @default true\n */\n removeButton?: boolean\n}\n\nexport type BlockCollapsibleWithErrorProps = {\n errorCount?: number\n fieldHasErrors?: boolean\n} & BlockCollapsibleProps\n\nexport type BlockContentProps = {\n baseClass: string\n BlockDrawer: React.FC\n Collapsible: React.FC<BlockCollapsibleWithErrorProps>\n CustomBlock: React.ReactNode\n EditButton: React.FC\n errorCount: number\n formSchema: ClientField[]\n initialState: false | FormState | undefined\n\n nodeKey: string\n RemoveButton: React.FC\n}\n\ntype BlockComponentContextType = {\n BlockCollapsible: React.FC<BlockCollapsibleProps>\n} & Omit<BlockContentProps, 'Collapsible'>\n\nconst BlockComponentContext = createContext<BlockComponentContextType>({\n baseClass: 'LexicalEditorTheme__block',\n BlockCollapsible: () => null,\n BlockDrawer: () => null,\n CustomBlock: null,\n EditButton: () => null,\n errorCount: 0,\n formSchema: [],\n initialState: false,\n nodeKey: '',\n RemoveButton: () => null,\n})\n\nexport const useBlockComponentContext = () => React.use(BlockComponentContext)\n\n/**\n * The actual content of the Block. This should be INSIDE a Form component,\n * scoped to the block. All format operations in here are thus scoped to the block's form, and\n * not the whole document.\n */\nexport const BlockContent: React.FC<BlockContentProps> = (props) => {\n const { Collapsible, ...contextProps } = props\n\n const { BlockDrawer, CustomBlock, errorCount, formSchema } = contextProps\n\n const hasSubmitted = useFormSubmitted()\n\n const fieldHasErrors = hasSubmitted && errorCount > 0\n const isEditable = useLexicalEditable()\n\n const CollapsibleWithErrorProps = useMemo(\n () => (props: BlockCollapsibleProps) => {\n const { children, ...rest } = props\n return (\n <Collapsible errorCount={errorCount} fieldHasErrors={fieldHasErrors} {...rest}>\n {children}\n </Collapsible>\n )\n },\n [Collapsible, fieldHasErrors, errorCount],\n )\n\n return CustomBlock ? (\n <BlockComponentContext\n value={{\n ...contextProps,\n BlockCollapsible: CollapsibleWithErrorProps,\n }}\n >\n {CustomBlock}\n <BlockDrawer />\n </BlockComponentContext>\n ) : (\n <CollapsibleWithErrorProps>\n <RenderFields\n fields={formSchema}\n forceRender={true}\n parentIndexPath=\"\"\n parentPath={''}\n parentSchemaPath=\"\"\n permissions={true}\n readOnly={!isEditable}\n />\n </CollapsibleWithErrorProps>\n )\n}\n", "'use client'\nimport type { FormState } from 'payload'\n\n/**\n * By default, if an array field is empty, it will be included in the form state with a value of 0.\n * We do not need this behavior here, By setting `disableFormData` to true, we can prevent the field from being included in the form state\n * like that.\n * @param fields form state\n */\nexport function removeEmptyArrayValues({ fields }: { fields: FormState }): FormState {\n for (const key in fields) {\n const field = fields[key]\n if (Array.isArray(field?.rows) && 'value' in field) {\n field.disableFormData = true\n }\n }\n return fields\n}\n", "import type { Klass, LexicalNode, LexicalNodeReplacement } from 'lexical'\n\nimport { createHeadlessEditor } from '@lexical/headless'\n\nimport {\n $convertToMarkdownString,\n type Transformer,\n} from '../../../../packages/@lexical/markdown/index.js'\n\nexport function getLexicalToMarkdown(\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>,\n allTransformers: Transformer[],\n): (args: { editorState: Record<string, any> }) => string {\n const lexicalToMarkdown = ({ editorState }: { editorState: Record<string, any> }): string => {\n const headlessEditor = createHeadlessEditor({\n nodes: allNodes,\n })\n\n try {\n headlessEditor.setEditorState(headlessEditor.parseEditorState(editorState as any)) // This should commit the editor state immediately\n } catch (e) {\n console.error('getLexicalToMarkdown: ERROR parsing editor state', e)\n }\n\n let markdown: string = ''\n headlessEditor.getEditorState().read(() => {\n markdown = $convertToMarkdownString(allTransformers)\n })\n\n return markdown\n }\n return lexicalToMarkdown\n}\n", "import type { Klass, LexicalNode, LexicalNodeReplacement, SerializedEditorState } from 'lexical'\n\nimport { createHeadlessEditor } from '@lexical/headless'\n\nimport {\n $convertFromMarkdownString,\n type Transformer,\n} from '../../../../packages/@lexical/markdown/index.js'\n\nexport function getMarkdownToLexical(\n allNodes: Array<Klass<LexicalNode> | LexicalNodeReplacement>,\n allTransformers: Transformer[],\n): (args: { markdown: string }) => SerializedEditorState {\n const markdownToLexical = ({ markdown }: { markdown: string }): SerializedEditorState => {\n const headlessEditor = createHeadlessEditor({\n nodes: allNodes,\n })\n\n headlessEditor.update(\n () => {\n $convertFromMarkdownString(markdown, allTransformers)\n },\n { discrete: true },\n )\n\n const editorJSON = headlessEditor.getEditorState().toJSON()\n\n return editorJSON\n }\n return markdownToLexical\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { InsertBlockPayload } from './index.js'\n\nexport const INSERT_BLOCK_COMMAND: LexicalCommand<InsertBlockPayload> =\n createCommand('INSERT_BLOCK_COMMAND')\n\nexport const INSERT_INLINE_BLOCK_COMMAND: LexicalCommand<Partial<InsertBlockPayload>> =\n createCommand('INSERT_INLINE_BLOCK_COMMAND')\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot, $wrapNodeInElement, mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getNodeByKey,\n $getPreviousSelection,\n $getSelection,\n $insertNodes,\n $isParagraphNode,\n $isRangeSelection,\n $isRootOrShadowRoot,\n COMMAND_PRIORITY_EDITOR,\n} from 'lexical'\nimport { useEffect, useState } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { BlockFields, BlockFieldsOptionalID } from '../../server/nodes/BlocksNode.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useLexicalDrawer } from '../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $createBlockNode, BlockNode } from '../nodes/BlocksNode.js'\nimport { $createInlineBlockNode, $isInlineBlockNode } from '../nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './commands.js'\n\nexport type InsertBlockPayload = BlockFieldsOptionalID\n\nexport const BlocksPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n\n const [targetNodeKey, setTargetNodeKey] = useState<null | string>(null)\n\n const { setCreatedInlineBlock, uuid } = useEditorConfigContext()\n const editDepth = useEditDepth()\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-inlineBlocks-create-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([BlockNode])) {\n throw new Error('BlocksPlugin: BlocksNode not registered on editor')\n }\n\n return mergeRegister(\n editor.registerCommand<InsertBlockPayload>(\n INSERT_BLOCK_COMMAND,\n (payload: InsertBlockPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const blockNode = $createBlockNode(payload)\n\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert blocks node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(blockNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n INSERT_INLINE_BLOCK_COMMAND,\n (fields) => {\n if (targetNodeKey) {\n const node = $getNodeByKey(targetNodeKey)\n\n if (!node || !$isInlineBlockNode(node)) {\n return false\n }\n\n node.setFields(fields as BlockFields)\n\n setTargetNodeKey(null)\n return true\n }\n\n const inlineBlockNode = $createInlineBlockNode(fields as BlockFields)\n setCreatedInlineBlock?.(inlineBlockNode)\n $insertNodes([inlineBlockNode])\n if ($isRootOrShadowRoot(inlineBlockNode.getParentOrThrow())) {\n $wrapNodeInElement(inlineBlockNode, $createParagraphNode).selectEnd()\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [editor, setCreatedInlineBlock, targetNodeKey, toggleDrawer])\n\n return null\n}\n", "'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot, getDOMSelection } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { IS_APPLE } from '../../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.key.toLowerCase() === 'a' && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path: number[] = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'ArrowDown',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'Backspace',\n 'Delete',\n 'Enter',\n 'Escape',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = getDOMSelection(editor._window)\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = getDOMSelection(editor._window)\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = getDOMSelection(editor._window)\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n", "'use client'\nimport { CAN_USE_DOM } from './canUseDOM.js'\n\ndeclare global {\n interface Document {\n documentMode?: unknown\n }\n\n interface Window {\n MSStream?: unknown\n }\n}\n\nconst documentMode = CAN_USE_DOM && 'documentMode' in document ? document.documentMode : null\n\nexport const IS_APPLE: boolean = CAN_USE_DOM && /Mac|iPod|iPhone|iPad/.test(navigator.platform)\n\nexport const IS_FIREFOX: boolean =\n CAN_USE_DOM && /^(?!.*Seamonkey)(?=.*Firefox).*/i.test(navigator.userAgent)\n\nexport const CAN_USE_BEFORE_INPUT: boolean =\n CAN_USE_DOM && 'InputEvent' in window && !documentMode\n ? 'getTargetRanges' in new window.InputEvent('input')\n : false\n\nexport const IS_SAFARI: boolean = CAN_USE_DOM && /Version\\/[\\d.].*Safari/.test(navigator.userAgent)\n\nexport const IS_IOS: boolean =\n CAN_USE_DOM && /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream\n\nexport const IS_ANDROID: boolean = CAN_USE_DOM && /Android/.test(navigator.userAgent)\n\nexport const IS_WINDOWS: boolean = CAN_USE_DOM && /Win/.test(navigator.platform)\nexport const IS_CHROME: boolean = CAN_USE_DOM && /^(?=.*Chrome).*/i.test(navigator.userAgent)\n// export const canUseTextInputEvent: boolean = CAN_USE_DOM && 'TextEvent' in window && !documentMode;\n\nexport const IS_APPLE_WEBKIT =\n CAN_USE_DOM && /AppleWebKit\\/[\\d.]+/.test(navigator.userAgent) && !IS_CHROME\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { TestRecorderPlugin } from './plugin/index.js'\n\nexport const TestRecorderFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TestRecorderPlugin,\n position: 'bottom',\n },\n ],\n})\n", "'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { TreeView } from '@lexical/react/LexicalTreeView.js'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\n\nexport const TreeViewPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n return (\n <TreeView\n editor={editor}\n timeTravelButtonClassName=\"debug-timetravel-button\"\n timeTravelPanelButtonClassName=\"debug-timetravel-panel-button\"\n timeTravelPanelClassName=\"debug-timetravel-panel\"\n timeTravelPanelSliderClassName=\"debug-timetravel-panel-slider\"\n treeTypeButtonClassName=\"debug-treetype-button\"\n viewClassName=\"tree-view-output\"\n />\n )\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { TreeViewPlugin } from './plugin/index.js'\n\nexport const TreeViewFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TreeViewPlugin,\n position: 'bottom',\n },\n ],\n})\n", "'use client'\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { BoldIcon } from '../../../lexical/ui/icons/Bold/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport {\n BOLD_ITALIC_STAR,\n BOLD_ITALIC_UNDERSCORE,\n BOLD_STAR,\n BOLD_UNDERSCORE,\n} from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: BoldIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('bold')\n }\n return false\n },\n key: 'bold',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\n },\n order: 1,\n },\n ]),\n]\n\nexport const BoldFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const markdownTransformers = [BOLD_STAR, BOLD_UNDERSCORE]\n if (featureProviderMap.get('italic')) {\n markdownTransformers.push(BOLD_ITALIC_UNDERSCORE, BOLD_ITALIC_STAR)\n }\n\n return {\n enableFormats: ['bold'],\n markdownTransformers,\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const BoldIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.6772 15H6.27017V5.718H10.4172C12.6792 5.718 13.8492 6.602 13.8492 8.292C13.8492 9.098 13.1992 9.982 12.4712 10.216C13.3812 10.476 14.1742 11.256 14.1742 12.322C14.1742 14.09 12.9002 15 10.6772 15ZM8.46717 9.501H10.3262C11.3012 9.501 11.7042 9.046 11.7042 8.409C11.7042 7.72 11.2362 7.317 10.3392 7.317H8.46717V9.501ZM8.46717 11.061V13.401H10.4822C11.4702 13.401 11.9642 12.959 11.9642 12.218C11.9642 11.49 11.4702 11.061 10.4822 11.061H8.46717Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarFormatGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'format',\n order: 40,\n }\n}\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const BOLD_ITALIC_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold', 'italic'],\n tag: '***',\n}\n\nexport const BOLD_ITALIC_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold', 'italic'],\n intraword: false,\n tag: '___',\n}\n\nexport const BOLD_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold'],\n tag: '**',\n}\n\nexport const BOLD_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['bold'],\n intraword: false,\n tag: '__',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { CodeIcon } from '../../../lexical/ui/icons/Code/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { INLINE_CODE } from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: CodeIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('code')\n }\n return false\n },\n key: 'inlineCode',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code')\n },\n order: 7,\n },\n ]),\n]\n\nexport const InlineCodeFeatureClient = createClientFeature({\n enableFormats: ['code'],\n markdownTransformers: [INLINE_CODE],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const CodeIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M7.76465 6L3.76465 10L7.76465 14\" stroke=\"currentColor\" />\n <path d=\"M12.2354 6L16.2354 10L12.2354 14\" stroke=\"currentColor\" />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const INLINE_CODE: TextFormatTransformer = {\n type: 'text-format',\n format: ['code'],\n tag: '`',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { ItalicIcon } from '../../../lexical/ui/icons/Italic/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { ITALIC_STAR, ITALIC_UNDERSCORE } from './markdownTransformers.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: ItalicIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('italic')\n }\n return false\n },\n key: 'italic',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\n },\n order: 2,\n },\n ]),\n]\n\nexport const ItalicFeatureClient = createClientFeature({\n enableFormats: ['italic'],\n markdownTransformers: [ITALIC_STAR, ITALIC_UNDERSCORE],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const ItalicIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M11.311 14.2969L11.0327 15H6.18408L6.4624 14.2969C7.54639 14.2969 7.70752 14.209 7.83936 13.8721L10.8423 6.45996C10.8716 6.38672 10.8862 6.32812 10.8862 6.26953C10.8862 6.09375 10.6519 6.03516 9.80225 6.03516L10.0952 5.33203H14.9438L14.6509 6.03516C13.5669 6.03516 13.4204 6.12305 13.2886 6.45996L10.2856 13.8721C10.2563 13.9453 10.2271 14.0039 10.2271 14.0625C10.2271 14.2383 10.4614 14.2969 11.311 14.2969Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const ITALIC_STAR: TextFormatTransformer = {\n type: 'text-format',\n format: ['italic'],\n tag: '*',\n}\n\nexport const ITALIC_UNDERSCORE: TextFormatTransformer = {\n type: 'text-format',\n format: ['italic'],\n intraword: false,\n tag: '_',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport { StrikethroughIcon } from '../../../lexical/ui/icons/Strikethrough/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\nimport { STRIKETHROUGH } from './markdownTransformers.js'\n\nconst toolbarGroups = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: StrikethroughIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('strikethrough')\n }\n return false\n },\n key: 'strikethrough',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\n },\n order: 4,\n },\n ]),\n]\n\nexport const StrikethroughFeatureClient = createClientFeature({\n enableFormats: ['strikethrough'],\n markdownTransformers: [STRIKETHROUGH],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const StrikethroughIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.50756 12.76H7.42756C7.56256 14.215 8.82256 14.71 10.1576 14.71C11.4326 14.71 12.4226 14.14 12.4226 13.06C12.4226 12.28 11.9576 11.845 10.6676 11.605L8.70256 11.245C7.12756 10.96 5.85256 10.21 5.85256 8.335C5.85256 6.43 7.53256 5.11 9.87256 5.11C12.4226 5.11 13.9526 6.22 14.1626 8.23H12.2876C12.1526 7.18 11.2226 6.595 9.88756 6.595C8.59756 6.595 7.78756 7.27 7.78756 8.215C7.78756 9.1 8.34256 9.385 9.49756 9.61L11.5676 10.015C13.3226 10.345 14.3726 11.215 14.3726 12.94C14.3726 14.89 12.5876 16.18 10.2176 16.18C7.66756 16.18 5.70256 15.115 5.50756 12.76Z\"\n fill=\"currentColor\"\n />\n <path d=\"M4.99756 11.44H15.0026V12.19H4.99756V11.44Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { TextFormatTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const STRIKETHROUGH: TextFormatTransformer = {\n type: 'text-format',\n format: ['strikethrough'],\n tag: '~~',\n}\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { SubscriptIcon } from '../../../lexical/ui/icons/Subscript/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: SubscriptIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('subscript')\n }\n return false\n },\n key: 'subscript',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\n },\n order: 5,\n },\n ]),\n]\n\nexport const SubscriptFeatureClient = createClientFeature({\n enableFormats: ['subscript'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const SubscriptIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.167 15L7.45002 11.36L4.73302 15H2.91302L6.55302 10.177L3.23802 5.718H5.20102L7.54102 8.89L9.89402 5.718H11.714L8.43802 10.06L12.13 15H10.167ZM16.7768 13.258C16.7768 14.155 16.1398 14.532 15.2038 15C14.5538 15.325 14.2808 15.546 14.2418 15.78H16.7898V16.82H12.7208V16.339C12.7208 15.286 13.5918 14.675 14.3588 14.233C15.0868 13.83 15.4378 13.635 15.4378 13.232C15.4378 12.894 15.2038 12.686 14.8268 12.686C14.3848 12.686 14.1248 13.024 14.1118 13.427H12.7468C12.8248 12.426 13.5528 11.633 14.8398 11.633C15.9448 11.633 16.7768 12.257 16.7768 13.258Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { SuperscriptIcon } from '../../../lexical/ui/icons/Superscript/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: SuperscriptIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('superscript')\n }\n return false\n },\n key: 'superscript',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\n },\n order: 6,\n },\n ]),\n]\n\nexport const SuperscriptFeatureClient = createClientFeature({\n enableFormats: ['superscript'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const SuperscriptIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.167 15L7.45002 11.36L4.73302 15H2.91302L6.55302 10.177L3.23802 5.718H5.20102L7.54102 8.89L9.89402 5.718H11.714L8.43802 10.06L12.13 15H10.167ZM16.7768 7.252C16.7768 8.149 16.1398 8.526 15.2038 8.994C14.5538 9.319 14.2808 9.54 14.2418 9.774H16.7898V10.814H12.7208V10.333C12.7208 9.28 13.5918 8.669 14.3588 8.227C15.0868 7.824 15.4378 7.629 15.4378 7.226C15.4378 6.888 15.2038 6.68 14.8268 6.68C14.3848 6.68 14.1248 7.018 14.1118 7.421H12.7468C12.8248 6.42 13.5528 5.627 14.8398 5.627C15.9448 5.627 16.7768 6.251 16.7768 7.252Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport { $isTableSelection } from '@lexical/table'\nimport { $isRangeSelection, FORMAT_TEXT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { UnderlineIcon } from '../../../lexical/ui/icons/Underline/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFormatGroupWithItems } from '../shared/toolbarFormatGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFormatGroupWithItems([\n {\n ChildComponent: UnderlineIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n return selection.hasFormat('underline')\n }\n return false\n },\n key: 'underline',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\n },\n order: 3,\n },\n ]),\n]\n\nexport const UnderlineFeatureClient = createClientFeature({\n enableFormats: ['underline'],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UnderlineIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"currentColor\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.9656 11.256C13.9656 13.791 12.5096 15.156 10.0006 15.156C7.50461 15.156 6.03561 13.791 6.03561 11.23V5.718H7.76461V11.243C7.76461 12.868 8.50561 13.778 10.0006 13.778C11.4956 13.778 12.2496 12.868 12.2496 11.243V5.718H13.9656V11.256Z\"\n fill=\"currentColor\"\n />\n <path d=\"M5.09961 16.3H14.9016V16.95H5.09961V16.3Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { StyleObject } from '../../../../features/textState/feature.server.js'\n\nfunction kebabToCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n}\n\nexport const TextStateIcon: React.FC<{\n css?: StyleObject\n}> = ({ css }) => {\n const convertedCss = css\n ? Object.fromEntries(Object.entries(css).map(([key, value]) => [kebabToCamelCase(key), value]))\n : {}\n\n return (\n <span\n style={{\n ...convertedCss,\n alignItems: 'center',\n borderRadius: '4px',\n display: 'flex',\n fontSize: '16px',\n height: '20px',\n justifyContent: 'center',\n width: '20px',\n }}\n >\n A\n </span>\n )\n}\n", "import type { LexicalEditor, StateConfig } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $forEachSelectedTextNode } from '@lexical/selection'\nimport { $getNodeByKey, $getState, $setState, createState, TextNode } from 'lexical'\nimport { useEffect } from 'react'\n\nimport { type StateValues, type TextStateFeatureProps } from './feature.server.js'\n\nexport type StateMap = Map<\n string,\n {\n stateConfig: StateConfig<string, string | undefined>\n stateValues: StateValues\n }\n>\n\nexport function registerTextStates(state: TextStateFeatureProps['state']) {\n const stateMap: StateMap = new Map()\n\n for (const stateKey in state) {\n const stateValues = state[stateKey]!\n const stateConfig = createState(stateKey, {\n parse: (value) =>\n typeof value === 'string' && Object.keys(stateValues).includes(value) ? value : undefined,\n })\n stateMap.set(stateKey, { stateConfig, stateValues })\n }\n return stateMap\n}\n\nexport function setTextState(\n editor: LexicalEditor,\n stateMap: StateMap,\n stateKey: string,\n value: string | undefined,\n) {\n editor.update(() => {\n $forEachSelectedTextNode((textNode) => {\n const stateMapEntry = stateMap.get(stateKey)\n if (!stateMapEntry) {\n throw new Error(`State config for ${stateKey} not found`)\n }\n $setState(textNode, stateMapEntry.stateConfig, value)\n })\n })\n}\n\nexport function StatePlugin({ stateMap }: { stateMap: StateMap }) {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerMutationListener(TextNode, (mutatedNodes) => {\n editor.getEditorState().read(() => {\n for (const [nodeKey, mutation] of mutatedNodes) {\n if (mutation === 'destroyed') {\n continue\n }\n const node = $getNodeByKey(nodeKey)\n const dom = editor.getElementByKey(nodeKey)\n if (!node || !dom) {\n continue\n }\n\n const mergedStyles: Record<string, string> = Object.create(null)\n // Examples:\n // stateKey: 'color'\n // stateValue: 'bg-red'\n stateMap.forEach((stateEntry, stateKey) => {\n const stateValue = $getState(node, stateEntry.stateConfig)\n if (!stateValue) {\n // clear the previous dataset value for this key\n delete dom.dataset[stateKey]\n return\n } // skip - nothing else to do\n\n dom.dataset[stateKey] = stateValue\n\n const css = stateEntry.stateValues[stateValue]?.css\n if (css) {\n // merge existing styles with the new ones\n Object.assign(mergedStyles, css)\n }\n })\n\n // wipe previous inline styles once, then set the merged ones\n dom.style.cssText = ''\n Object.assign(dom.style, mergedStyles)\n }\n })\n })\n }, [editor])\n\n return null\n}\n", "'use client'\n\nimport type { ToolbarDropdownGroup, ToolbarGroup } from '../toolbars/types.js'\nimport type { TextStateFeatureProps } from './feature.server.js'\n\nimport { TextStateIcon } from '../../lexical/ui/icons/TextState/index.js'\nimport { createClientFeature } from '../../utilities/createClientFeature.js'\nimport { registerTextStates, setTextState, type StateMap, StatePlugin } from './textState.js'\n\nconst toolbarGroups = (props: TextStateFeatureProps, stateMap: StateMap): ToolbarGroup[] => {\n const items: ToolbarDropdownGroup['items'] = []\n\n for (const stateKey in props.state) {\n const key = props.state[stateKey]!\n for (const stateValue in key) {\n const meta = key[stateValue]!\n items.push({\n ChildComponent: () => <TextStateIcon css={meta.css} />,\n key: stateValue,\n label: meta.label,\n onSelect: ({ editor }) => {\n setTextState(editor, stateMap, stateKey, stateValue)\n },\n })\n }\n }\n\n const clearStyle: ToolbarDropdownGroup['items'] = [\n {\n ChildComponent: () => <TextStateIcon />,\n key: `clear-style`,\n label: ({ i18n }) => i18n.t('lexical:textState:defaultStyle'),\n onSelect: ({ editor }) => {\n for (const stateKey in props.state) {\n setTextState(editor, stateMap, stateKey, undefined)\n }\n },\n order: 1,\n },\n ]\n\n return [\n {\n type: 'dropdown',\n ChildComponent: () => <TextStateIcon css={{ color: 'var(--theme-elevation-600)' }} />,\n items: [...clearStyle, ...items],\n key: 'textState',\n order: 30,\n },\n ]\n}\n\nexport const TextStateFeatureClient = createClientFeature<TextStateFeatureProps>(({ props }) => {\n const stateMap = registerTextStates(props.state)\n return {\n plugins: [\n {\n Component: () => StatePlugin({ stateMap }),\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups(props, stateMap),\n },\n toolbarInline: {\n groups: toolbarGroups(props, stateMap),\n },\n }\n})\n", "'use client'\n\nimport type { HeadingTagType } from '@lexical/rich-text'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { $createHeadingNode, $isHeadingNode, HeadingNode } from '@lexical/rich-text'\nimport { $setBlocksType } from '@lexical/selection'\nimport { $getSelection, $isRangeSelection } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { PluginComponent } from '../../typesClient.js'\nimport type { HeadingFeatureProps } from '../server/index.js'\n\nimport { H1Icon } from '../../../lexical/ui/icons/H1/index.js'\nimport { H2Icon } from '../../../lexical/ui/icons/H2/index.js'\nimport { H3Icon } from '../../../lexical/ui/icons/H3/index.js'\nimport { H4Icon } from '../../../lexical/ui/icons/H4/index.js'\nimport { H5Icon } from '../../../lexical/ui/icons/H5/index.js'\nimport { H6Icon } from '../../../lexical/ui/icons/H6/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\nimport { MarkdownTransformer } from '../markdownTransformer.js'\n\nconst $setHeading = (headingSize: HeadingTagType) => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createHeadingNode(headingSize))\n}\n\nconst iconImports = {\n h1: H1Icon,\n h2: H2Icon,\n h3: H3Icon,\n h4: H4Icon,\n h5: H5Icon,\n h6: H6Icon,\n}\n\nexport const HeadingFeatureClient = createClientFeature<HeadingFeatureProps>(({ props }) => {\n const { enabledHeadingSizes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] } = props\n\n const toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems(\n enabledHeadingSizes.map((headingSize, i) => {\n return {\n ChildComponent: iconImports[headingSize],\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isHeadingNode(node) && node.getTag() === headingSize) {\n continue\n }\n\n const parent = node.getParent()\n if ($isHeadingNode(parent) && parent.getTag() === headingSize) {\n continue\n }\n\n return false\n }\n return true\n },\n key: headingSize,\n label: ({ i18n }) => {\n return i18n.t('lexical:heading:label', { headingLevel: headingSize.charAt(1) })\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n $setHeading(headingSize)\n })\n },\n order: i + 2,\n }\n }),\n ),\n ]\n\n return {\n markdownTransformers: [MarkdownTransformer(enabledHeadingSizes)],\n nodes: [HeadingNode],\n plugins: [\n {\n Component: HeadingPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: enabledHeadingSizes?.length\n ? [\n slashMenuBasicGroupWithItems(\n enabledHeadingSizes.map((headingSize) => {\n return {\n Icon: iconImports[headingSize],\n key: `heading-${headingSize.charAt(1)}`,\n keywords: ['heading', headingSize],\n label: ({ i18n }) => {\n return i18n.t('lexical:heading:label', {\n headingLevel: headingSize.charAt(1),\n })\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n $setHeading(headingSize)\n })\n },\n }\n }),\n ),\n ]\n : [],\n },\n toolbarFixed: {\n groups: enabledHeadingSizes?.length ? toolbarGroups : [],\n },\n toolbarInline: {\n groups: enabledHeadingSizes?.length ? toolbarGroups : [],\n },\n }\n})\n\nconst HeadingPlugin: PluginComponent<HeadingFeatureProps> = ({ clientProps }) => {\n const { enabledHeadingSizes = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] } = clientProps\n const lowestAllowed = enabledHeadingSizes.at(-1)\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!lowestAllowed || enabledHeadingSizes.length === 6) {\n return\n }\n return editor.registerNodeTransform(HeadingNode, (node) => {\n if (!enabledHeadingSizes.includes(node.getTag())) {\n node.setTag(lowestAllowed)\n }\n })\n }, [editor, enabledHeadingSizes, lowestAllowed])\n\n return null\n}\n", "'use client'\nimport React from 'react'\n\nexport const H1Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.639 13.5V7.074H6.196V9.648H9.076V7.074H10.642V13.5H9.076V10.836H6.196V13.5H4.639ZM11.5656 9.045V8.019C12.6636 8.019 13.1316 7.731 13.2846 7.065H14.4006V13.5H12.8436V9.045H11.5656Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H2Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.139 13.5V7.074H5.696V9.648H8.576V7.074H10.142V13.5H8.576V10.836H5.696V13.5H4.139ZM15.9796 8.973C15.9796 10.116 15.1696 10.656 14.0356 11.232C13.2256 11.646 12.8206 11.943 12.7846 12.294H15.9886V13.5H11.0566V12.951C11.0566 11.601 12.1636 10.845 13.1176 10.287C14.0356 9.756 14.5126 9.486 14.5126 8.946C14.5126 8.46 14.2156 8.145 13.6306 8.145C13.0186 8.145 12.6586 8.613 12.6226 9.198H11.1196C11.2186 7.947 12.1006 6.966 13.6396 6.966C15.0346 6.966 15.9796 7.785 15.9796 8.973Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H3Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.139 13.5V7.074H5.696V9.648H8.576V7.074H10.142V13.5H8.576V10.836H5.696V13.5H4.139ZM16.1146 11.745C16.1146 12.744 15.2236 13.608 13.6126 13.608C12.0736 13.608 11.0926 12.762 10.9846 11.547H12.4696C12.5146 12.114 13.0006 12.456 13.6126 12.456C14.2876 12.456 14.6746 12.132 14.6746 11.619C14.6746 11.061 14.2426 10.836 13.6216 10.836H12.9826V9.738H13.6036C14.1526 9.738 14.5486 9.486 14.5486 8.937C14.5486 8.46 14.2156 8.127 13.6486 8.127C13.0366 8.127 12.6586 8.514 12.6226 9.045H11.1916C11.2726 7.929 12.1276 6.966 13.6666 6.966C15.1876 6.966 15.9706 7.848 15.9706 8.865C15.9706 9.603 15.5026 10.143 14.8186 10.269C15.6196 10.404 16.1146 10.971 16.1146 11.745Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H4Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM15.1736 7.074V10.854H16.3706V12.033H15.1736V13.5H13.6796V12.033H10.5116V10.845L13.4996 7.074H15.1736ZM13.6796 8.46L11.8256 10.854H13.6796V8.46Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H5Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM13.1576 10.269C12.6896 10.269 12.3746 10.494 12.2216 10.737H10.8176L11.1956 7.074H15.2546V8.28H12.3206L12.1856 9.549C12.4016 9.351 12.8516 9.126 13.4636 9.126C14.7866 9.126 15.6596 10.053 15.6596 11.358C15.6596 12.609 14.7326 13.608 13.1756 13.608C11.5826 13.608 10.6556 12.753 10.5566 11.511H12.1136C12.1586 12.06 12.5456 12.465 13.1576 12.465C13.8236 12.465 14.1746 11.97 14.1746 11.376C14.1746 10.764 13.8416 10.269 13.1576 10.269Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const H6Icon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.639 13.5V7.074H5.196V9.648H8.076V7.074H9.642V13.5H8.076V10.836H5.196V13.5H3.639ZM13.3646 8.127C12.5456 8.127 12.0416 8.937 12.0416 9.999C12.3296 9.54 12.8246 9.207 13.5536 9.207C14.8586 9.207 15.8036 10.134 15.8036 11.376C15.8036 12.645 14.8226 13.608 13.3196 13.608C11.7266 13.608 10.6196 12.393 10.6196 10.395C10.6196 8.316 11.7716 6.966 13.4186 6.966C14.7056 6.966 15.5786 7.749 15.7316 8.829H14.3186C14.2016 8.415 13.9226 8.127 13.3646 8.127ZM13.3106 12.51C13.9586 12.51 14.3816 12.042 14.3816 11.385C14.3816 10.737 13.9586 10.278 13.3106 10.278C12.6536 10.278 12.2126 10.737 12.2126 11.385C12.2126 12.042 12.6536 12.51 13.3106 12.51Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "import type { HeadingTagType } from '@lexical/rich-text'\n\nimport { $createHeadingNode, $isHeadingNode, HeadingNode } from '@lexical/rich-text'\n\nimport type { ElementTransformer } from '../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { createBlockNode } from '../../lexical/utils/markdown/createBlockNode.js'\n\nexport const MarkdownTransformer: (enabledHeadingSizes: HeadingTagType[]) => ElementTransformer = (\n enabledHeadingSizes,\n) => {\n // Convert enabledHeadingSizes to a list of numbers (1 for h1, 2 for h2, etc.)\n const enabledSizes = enabledHeadingSizes.map((tag) => Number(tag.slice(1)))\n\n // Create a regex pattern that matches any of the enabled sizes\n const pattern = `^(${enabledSizes.map((size) => `#{${size}}`).join('|')})\\\\s`\n const regExp = new RegExp(pattern)\n\n return {\n type: 'element',\n dependencies: [HeadingNode],\n export: (node, exportChildren) => {\n if (!$isHeadingNode(node)) {\n return null\n }\n const level = Number(node.getTag().slice(1))\n return '#'.repeat(level) + ' ' + exportChildren(node)\n },\n regExp,\n replace: createBlockNode((match) => {\n const tag = ('h' + match[1]?.length) as HeadingTagType\n return $createHeadingNode(tag)\n }),\n }\n}\n", "import type { ElementNode } from 'lexical'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nexport const createBlockNode = (\n createNode: (match: Array<string>) => ElementNode,\n): ElementTransformer['replace'] => {\n return (parentNode, children, match) => {\n const node = createNode(match)\n if (node) {\n node.append(...children)\n parentNode.replace(node)\n node.select(0, 0)\n }\n }\n}\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport { HorizontalRuleIcon } from '../../../lexical/ui/icons/HorizontalRule/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../server/nodes/HorizontalRuleNode.js'\nimport { MarkdownTransformer } from './markdownTransformer.js'\nimport { $isHorizontalRuleNode, HorizontalRuleNode } from './nodes/HorizontalRuleNode.js'\nimport { HorizontalRulePlugin } from './plugin/index.js'\n\nexport const HorizontalRuleFeatureClient = createClientFeature({\n markdownTransformers: [MarkdownTransformer],\n nodes: [HorizontalRuleNode],\n plugins: [\n {\n Component: HorizontalRulePlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: HorizontalRuleIcon,\n key: 'horizontalRule',\n keywords: ['hr', 'horizontal rule', 'line', 'separator'],\n label: ({ i18n }) => {\n return i18n.t('lexical:horizontalRule:label')\n },\n\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: HorizontalRuleIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isHorizontalRuleNode(firstNode)\n },\n key: 'horizontalRule',\n label: ({ i18n }) => {\n return i18n.t('lexical:horizontalRule:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const HorizontalRuleIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect fill=\"currentColor\" height=\"1\" width=\"12\" x=\"4\" y=\"9.5\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const AddIcon: React.FC = () => (\n <svg fill=\"none\" height=\"20\" viewBox=\"0 0 20 20\" width=\"20\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 10h10\" stroke=\"currentColor\" />\n <path d=\"M10 15V5\" stroke=\"currentColor\" />\n </svg>\n)\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { AddIcon } from '../../../lexical/ui/icons/Add/index.js'\n\nexport const toolbarAddDropdownGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'dropdown',\n ChildComponent: AddIcon,\n items,\n key: 'add',\n order: 10,\n }\n}\n", "import type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalCommand,\n LexicalNode,\n SerializedLexicalNode,\n} from 'lexical'\nimport type * as React from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, createCommand, DecoratorNode } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\n/**\n * Serialized representation of a horizontal rule node. Serialized = converted to JSON. This is what is stored in the database / in the lexical editor state.\n */\nexport type SerializedHorizontalRuleNode = StronglyTypedLeafNode<\n SerializedLexicalNode,\n 'horizontalrule'\n>\n\nexport const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_HORIZONTAL_RULE_COMMAND',\n)\n\n/**\n * This node is a DecoratorNode. DecoratorNodes allow you to render React components in the editor.\n *\n * They need both createDom and decorate functions. createDom => outside of the html. decorate => React Component inside of the html.\n *\n * If we used DecoratorBlockNode instead, we would only need a decorate method\n */\nexport class HorizontalRuleServerNode extends DecoratorNode<null | React.ReactElement> {\n static override clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return new this(node.__key)\n }\n\n static override getType(): string {\n return 'horizontalrule'\n }\n\n /**\n * Defines what happens if you copy an hr element from another page and paste it into the lexical editor\n *\n * This also determines the behavior of lexical's internal HTML -> Lexical converter\n */\n static override importDOM(): DOMConversionMap | null {\n return {\n hr: () => ({\n conversion: $convertHorizontalRuleElement,\n priority: 0,\n }),\n }\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static override importJSON(\n serializedNode: SerializedHorizontalRuleNode,\n ): HorizontalRuleServerNode {\n return $createHorizontalRuleServerNode()\n }\n\n /**\n * Determines how the hr element is rendered in the lexical editor. This is only the \"initial\" / \"outer\" HTML element.\n */\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('hr')\n addClassNamesToElement(element, config.theme.hr)\n return element\n }\n\n override decorate(): null | React.ReactElement {\n return null\n }\n\n /**\n * Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page.\n *\n * This also determines the behavior of lexical's internal Lexical -> HTML converter\n */\n override exportDOM(): DOMExportOutput {\n return { element: document.createElement('hr') }\n }\n /**\n * Opposite of importJSON. This determines what data is saved in the database / in the lexical editor state.\n */\n override exportJSON(): SerializedLexicalNode {\n return {\n type: 'horizontalrule',\n version: 1,\n }\n }\n\n override getTextContent(): string {\n return '\\n'\n }\n\n override isInline(): false {\n return false\n }\n\n override updateDOM(): boolean {\n return false\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleServerNode() }\n}\n\nexport function $createHorizontalRuleServerNode(): HorizontalRuleServerNode {\n return $applyNodeReplacement(new HorizontalRuleServerNode())\n}\n\nexport function $isHorizontalRuleServerNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleServerNode {\n return node instanceof HorizontalRuleServerNode\n}\n", "'use client'\nimport type { DOMConversionOutput, LexicalNode, SerializedLexicalNode } from 'lexical'\n\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type { SerializedHorizontalRuleNode } from '../../server/nodes/HorizontalRuleNode.js'\n\nimport { HorizontalRuleServerNode } from '../../server/nodes/HorizontalRuleNode.js'\n\nexport class HorizontalRuleNode extends HorizontalRuleServerNode {\n static override clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static override importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleNode {\n return $createHorizontalRuleNode()\n }\n\n /**\n * Allows you to render a React component within whatever createDOM returns.\n */\n override decorate() {\n return null\n }\n\n override exportJSON(): SerializedLexicalNode {\n return super.exportJSON()\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleNode() }\n}\n\nexport function $createHorizontalRuleNode(): HorizontalRuleNode {\n return $applyNodeReplacement(new HorizontalRuleNode())\n}\n\nexport function $isHorizontalRuleNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleNode {\n return node instanceof HorizontalRuleNode\n}\n", "import type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport {\n $createHorizontalRuleNode,\n $isHorizontalRuleNode,\n HorizontalRuleNode,\n} from './nodes/HorizontalRuleNode.js'\n\nexport const MarkdownTransformer: ElementTransformer = {\n type: 'element',\n dependencies: [HorizontalRuleNode],\n export: (node, exportChildren) => {\n if (!$isHorizontalRuleNode(node)) {\n return null\n }\n return '---'\n },\n // match ---\n regExp: /^---\\s*$/,\n replace: (parentNode) => {\n const node = $createHorizontalRuleNode()\n if (node) {\n parentNode.replace(node)\n }\n },\n}\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\n\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from '../../server/nodes/HorizontalRuleNode.js'\nimport { $createHorizontalRuleNode } from '../nodes/HorizontalRuleNode.js'\nimport './index.scss'\n\n/**\n * Registers the INSERT_HORIZONTAL_RULE_COMMAND lexical command and defines the behavior for when it is called.\n */\nexport const HorizontalRulePlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand(\n INSERT_HORIZONTAL_RULE_COMMAND,\n (type) => {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const focusNode = selection.focus.getNode()\n\n if (focusNode !== null) {\n const horizontalRuleNode = $createHorizontalRuleNode()\n $insertNodeToNearestRoot(horizontalRuleNode)\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n", "'use client'\n\nimport type { ElementNode, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $isElementNode, INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { type IndentFeatureProps } from '../server/index.js'\nimport { IndentPlugin } from './IndentPlugin.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups = ({ disabledNodes }: IndentFeatureProps): ToolbarGroup[] => [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes() ?? []\n\n const isOutdentable = (node: LexicalNode) => {\n return isIndentable(node) && node.getIndent() > 0\n }\n\n return nodes.some((node) => {\n return isOutdentable(node) || Boolean($findMatchingParent(node, isOutdentable))\n })\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes() ?? []\n\n const isIndentableAndNotDisabled = (node: LexicalNode) => {\n return isIndentable(node) && !(disabledNodes ?? []).includes(node.getType())\n }\n\n return nodes.some((node) => {\n return (\n isIndentableAndNotDisabled(node) ||\n Boolean($findMatchingParent(node, isIndentableAndNotDisabled))\n )\n })\n },\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature<IndentFeatureProps>(({ props }) => {\n const disabledNodes = props.disabledNodes ?? []\n return {\n plugins: [\n {\n Component: IndentPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n toolbarFixed: {\n groups: toolbarGroups({ disabledNodes }),\n },\n toolbarInline: {\n groups: toolbarGroups({ disabledNodes }),\n },\n }\n})\n\nconst isIndentable = (node: LexicalNode): node is ElementNode =>\n $isElementNode(node) && node.canIndent()\n", "'use client'\nimport React from 'react'\n\nexport const IndentDecreaseIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M2.5 5H10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 10H10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M2.5 15H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.25 7.25L17.25 3.75V10.75L12.25 7.25Z\" fill=\"currentColor\" />\n </svg>\n)\n", "'use client'\nimport React from 'react'\n\nexport const IndentIncreaseIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M17.5 5H9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17.5 10H9.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17.5 15H2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7.75 7.25L2.75 3.75V10.75L7.75 7.25Z\" fill=\"currentColor\" />\n </svg>\n)\n", "import type { ElementNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n INDENT_CONTENT_COMMAND,\n KEY_TAB_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n TabNode,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../typesClient.js'\nimport type { IndentFeatureProps } from '../server/index.js'\n\nexport const IndentPlugin: PluginComponent<IndentFeatureProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n const { disabledNodes, disableTabNode } = clientProps\n\n useEffect(() => {\n if (!editor || !disabledNodes?.length) {\n return\n }\n return mergeRegister(\n editor.registerCommand(\n INDENT_CONTENT_COMMAND,\n () => {\n return $handleIndentAndOutdent((block) => {\n if (!disabledNodes.includes(block.getType())) {\n const indent = block.getIndent()\n block.setIndent(indent + 1)\n }\n })\n },\n COMMAND_PRIORITY_LOW,\n ),\n // If we disable indenting for certain nodes, we need to ensure that these are not indented,\n // if they get transformed from an indented state (e.g. an indented list node gets transformed into a\n // paragraph node for which indenting is disabled).\n editor.registerUpdateListener(({ dirtyElements, editorState }) => {\n editor.update(() => {\n for (const [nodeKey] of dirtyElements) {\n const node = editorState._nodeMap.get(nodeKey)\n if ($isElementNode(node) && disabledNodes.includes(node.getType())) {\n const currentIndent = node.getIndent()\n if (currentIndent > 0) {\n node.setIndent(0)\n }\n }\n }\n })\n }),\n )\n }, [editor, disabledNodes])\n\n useEffect(() => {\n if (!editor || !disableTabNode) {\n return\n }\n return mergeRegister(\n // This is so that when you press Tab in the middle of a paragraph,\n // it indents the paragraph, instead of inserting a TabNode.\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (event) => {\n event.preventDefault()\n return editor.dispatchCommand(\n event.shiftKey ? OUTDENT_CONTENT_COMMAND : INDENT_CONTENT_COMMAND,\n undefined,\n )\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Tab isn't the only way to insert a TabNode. We have to make sure\n // it doesn't happen, for example, when pasting from the clipboard.\n editor.registerNodeTransform(TabNode, (node) => {\n node.remove()\n }),\n )\n }, [editor, disableTabNode])\n\n return <TabIndentationPlugin />\n}\n\nfunction $handleIndentAndOutdent(indentOrOutdent: (block: ElementNode) => void): boolean {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return false\n }\n const alreadyHandled = new Set()\n const nodes = selection.getNodes()\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n const key = node.getKey()\n if (alreadyHandled.has(key)) {\n continue\n }\n const parentBlock = $findMatchingParent(\n node,\n (parentNode): parentNode is ElementNode =>\n $isElementNode(parentNode) && !parentNode.isInline(),\n )\n if (parentBlock === null) {\n continue\n }\n const parentKey = parentBlock.getKey()\n if (parentBlock.canIndent() && !alreadyHandled.has(parentKey)) {\n alreadyHandled.add(parentKey)\n indentOrOutdent(parentBlock)\n }\n }\n return alreadyHandled.size > 0\n}\n", "'use client'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarIndentGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'indent',\n order: 35,\n }\n}\n", "'use client'\n\nimport type { Klass, LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { ClientFeature } from '../../typesClient.js'\nimport type { LinkFields } from '../nodes/types.js'\nimport type { ExclusiveLinkCollectionsProps } from '../server/index.js'\n\nimport { LinkIcon } from '../../../lexical/ui/icons/Link/index.js'\nimport { getSelectedNode } from '../../../lexical/utils/getSelectedNode.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFeatureButtonsGroupWithItems } from '../../shared/toolbar/featureButtonsGroup.js'\nimport { LinkMarkdownTransformer } from '../markdownTransformer.js'\nimport { AutoLinkNode } from '../nodes/AutoLinkNode.js'\nimport { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '../nodes/LinkNode.js'\nimport { AutoLinkPlugin } from './plugins/autoLink/index.js'\nimport { ClickableLinkPlugin } from './plugins/clickableLink/index.js'\nimport { FloatingLinkEditorPlugin } from './plugins/floatingLinkEditor/index.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './plugins/floatingLinkEditor/LinkEditor/commands.js'\nimport { LinkPlugin } from './plugins/link/index.js'\n\nexport type ClientProps = {\n defaultLinkType?: string\n defaultLinkURL?: string\n disableAutoLinks?: 'creationOnly' | true\n} & ExclusiveLinkCollectionsProps\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFeatureButtonsGroupWithItems([\n {\n ChildComponent: LinkIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection)) {\n const selectedNode = getSelectedNode(selection)\n const linkParent = $findMatchingParent(selectedNode, $isLinkNode)\n return linkParent != null\n }\n return false\n },\n isEnabled: ({ selection }) => {\n return !!($isRangeSelection(selection) && $getSelection()?.getTextContent()?.length)\n },\n key: 'link',\n label: ({ i18n }) => {\n return i18n.t('lexical:link:label')\n },\n onSelect: ({ editor, isActive }) => {\n if (!isActive) {\n let selectedText: string | undefined\n let selectedNodes: LexicalNode[] = []\n editor.getEditorState().read(() => {\n selectedText = $getSelection()?.getTextContent()\n // We need to selected nodes here before the drawer opens, as clicking around in the drawer may change the original selection\n selectedNodes = $getSelection()?.getNodes() ?? []\n })\n\n if (!selectedText?.length) {\n return\n }\n\n const linkFields: Partial<LinkFields> = {\n doc: null,\n }\n\n editor.dispatchCommand(TOGGLE_LINK_WITH_MODAL_COMMAND, {\n fields: linkFields,\n selectedNodes,\n text: selectedText,\n })\n } else {\n // remove link\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }\n },\n order: 1,\n },\n ]),\n]\n\nexport const LinkFeatureClient = createClientFeature<ClientProps>(({ props }) => ({\n markdownTransformers: [LinkMarkdownTransformer],\n nodes: [LinkNode, props?.disableAutoLinks === true ? null : AutoLinkNode].filter(\n Boolean,\n ) as Array<Klass<LexicalNode>>,\n plugins: [\n {\n Component: LinkPlugin,\n position: 'normal',\n },\n props?.disableAutoLinks === true || props?.disableAutoLinks === 'creationOnly'\n ? null\n : {\n Component: AutoLinkPlugin,\n position: 'normal',\n },\n {\n Component: ClickableLinkPlugin,\n position: 'normal',\n },\n {\n Component: FloatingLinkEditorPlugin,\n position: 'floatingAnchorElem',\n },\n ].filter(Boolean) as ClientFeature<ClientProps>['plugins'],\n sanitizedClientFeatureProps: props,\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n}))\n", "'use client'\nimport React from 'react'\n\nexport const LinkIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.5 11.5L11.5 8.5M8.5 7L9.625 5.875C10.868 4.633 12.882 4.633 14.125 5.875C15.368 7.118 15.368 9.133 14.125 10.375L13 11.5M7 8.5L5.746 9.754C4.56 10.94 4.519 12.85 5.652 14.087C6.814 15.354 8.78 15.449 10.058 14.298L11.5 13\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "'use client'\nimport type { ElementNode, RangeSelection, TextNode } from 'lexical'\n\nimport { $isAtNodeEnd } from '@lexical/selection'\n\nexport function getSelectedNode(selection: RangeSelection): ElementNode | TextNode {\n const { anchor } = selection\n const { focus } = selection\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n if (anchorNode === focusNode) {\n return anchorNode\n }\n const isBackward = selection.isBackward()\n if (isBackward) {\n return $isAtNodeEnd(focus) ? anchorNode : focusNode\n }\n return $isAtNodeEnd(anchor) ? anchorNode : focusNode\n}\n", "import type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nexport const toolbarFeatureButtonsGroupWithItems = (items: ToolbarGroupItem[]): ToolbarGroup => {\n return {\n type: 'buttons',\n items,\n key: 'features',\n order: 50,\n }\n}\n", "/**\n * Code taken from https://github.com/facebook/lexical/blob/main/packages/lexical-markdown/src/MarkdownTransformers.ts#L357\n */\n\n// Order of text transformers matters:\n//\n// - code should go first as it prevents any transformations inside\n\nimport { $createTextNode, $isTextNode } from 'lexical'\n\nimport type { TextMatchTransformer } from '../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { $createLinkNode, $isLinkNode, LinkNode } from './nodes/LinkNode.js'\n\n// - then longer tags match (e.g. ** or __ should go before * or _)\nexport const LinkMarkdownTransformer: TextMatchTransformer = {\n type: 'text-match',\n dependencies: [LinkNode],\n export: (_node, exportChildren) => {\n if (!$isLinkNode(_node)) {\n return null\n }\n const node: LinkNode = _node\n const { url } = node.getFields()\n\n const textContent = exportChildren(node)\n\n const linkContent = `[${textContent}](${url})`\n\n return linkContent\n },\n importRegExp: /\\[([^[]+)\\]\\(([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?\\)/,\n regExp: /\\[([^[]+)\\]\\(([^()\\s]+)(?:\\s\"((?:[^\"]*\\\\\")*[^\"]*)\"\\s*)?\\)$/,\n replace: (textNode, match) => {\n const [, linkText, linkUrl] = match\n const linkNode = $createLinkNode({\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: linkUrl,\n },\n })\n const linkTextNode = $createTextNode(linkText)\n linkTextNode.setFormat(textNode.getFormat())\n linkNode.append(linkTextNode)\n textNode.replace(linkNode)\n\n return linkTextNode\n },\n trigger: ')',\n}\n", "import type {\n BaseSelection,\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n ElementNode as ElementNodeType,\n LexicalCommand,\n LexicalNode,\n LexicalUpdateJSON,\n NodeKey,\n RangeSelection,\n} from 'lexical'\n\nimport { addClassNamesToElement, isHTMLAnchorElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport {\n $applyNodeReplacement,\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n createCommand,\n ElementNode,\n} from 'lexical'\n\nimport type { LinkPayload } from '../client/plugins/floatingLinkEditor/types.js'\nimport type { LinkFields, SerializedLinkNode } from './types.js'\n\nconst SUPPORTED_URL_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'sms:', 'tel:'])\n\n/** @noInheritDoc */\nexport class LinkNode extends ElementNode {\n __fields: LinkFields\n __id: string\n\n constructor({\n id,\n fields = {\n linkType: 'custom',\n newTab: false,\n },\n key,\n }: {\n fields?: LinkFields\n id: string\n key?: NodeKey\n }) {\n super(key)\n this.__fields = fields\n this.__id = id\n }\n\n static override clone(node: LinkNode): LinkNode {\n return new this({\n id: node.__id,\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'link'\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n a: (node: Node) => ({\n conversion: $convertAnchorElement,\n priority: 1,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedLinkNode): LinkNode {\n const node = $createLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove this in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n if (serializedNode.version === 2 && !serializedNode.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n return node\n }\n\n override canBeEmpty(): false {\n return false\n }\n\n override canInsertTextAfter(): false {\n return false\n }\n\n override canInsertTextBefore(): false {\n return false\n }\n\n override createDOM(config: EditorConfig): HTMLAnchorElement {\n const element = document.createElement('a')\n if (this.__fields?.linkType === 'custom') {\n element.href = this.sanitizeUrl(this.__fields.url ?? '')\n }\n if (this.__fields?.newTab ?? false) {\n element.target = '_blank'\n }\n\n if (this.__fields?.newTab === true && this.__fields?.linkType === 'custom') {\n element.rel = manageRel(element.rel, 'add', 'noopener')\n }\n\n addClassNamesToElement(element, config.theme.link)\n return element\n }\n\n override exportJSON(): SerializedLinkNode {\n const fields = this.getFields()\n\n if (fields?.linkType === 'internal') {\n delete fields.url\n } else if (fields?.linkType === 'custom') {\n delete fields.doc\n }\n\n const returnObject: SerializedLinkNode = {\n ...super.exportJSON(),\n type: 'link',\n fields,\n version: 3,\n }\n const id = this.getID()\n if (id) {\n returnObject.id = id\n }\n return returnObject\n }\n\n override extractWithChild(\n child: LexicalNode,\n selection: BaseSelection,\n destination: 'clone' | 'html',\n ): boolean {\n if (!$isRangeSelection(selection)) {\n return false\n }\n\n const anchorNode = selection.anchor.getNode()\n const focusNode = selection.focus.getNode()\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n selection.getTextContent().length > 0\n )\n }\n\n getFields(): LinkFields {\n return this.getLatest().__fields\n }\n\n getID(): string {\n return this.getLatest().__id\n }\n\n override insertNewAfter(\n selection: RangeSelection,\n restoreSelection = true,\n ): ElementNodeType | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override isInline(): true {\n return true\n }\n\n sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n\n if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {\n return 'about:blank'\n }\n } catch (e) {\n return 'https://'\n }\n return url\n }\n\n setFields(fields: LinkFields): this {\n const writable = this.getWritable()\n writable.__fields = fields\n return writable\n }\n\n setID(id: string): this {\n const writable = this.getWritable()\n writable.__id = id\n return writable\n }\n\n override updateDOM(prevNode: this, anchor: HTMLAnchorElement, config: EditorConfig): boolean {\n const url = this.__fields?.url\n const newTab = this.__fields?.newTab\n if (url != null && url !== prevNode.__fields?.url && this.__fields?.linkType === 'custom') {\n anchor.href = url\n }\n if (this.__fields?.linkType === 'internal' && prevNode.__fields?.linkType === 'custom') {\n anchor.removeAttribute('href')\n }\n\n // TODO: not 100% sure why we're settign rel to '' - revisit\n // Start rel config here, then check newTab below\n if (anchor.rel == null) {\n anchor.rel = ''\n }\n\n if (newTab !== prevNode.__fields?.newTab) {\n if (newTab ?? false) {\n anchor.target = '_blank'\n if (this.__fields?.linkType === 'custom') {\n anchor.rel = manageRel(anchor.rel, 'add', 'noopener')\n }\n } else {\n anchor.removeAttribute('target')\n anchor.rel = manageRel(anchor.rel, 'remove', 'noopener')\n }\n }\n\n return false\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedLinkNode>): this {\n return super\n .updateFromJSON(serializedNode)\n .setFields(serializedNode.fields)\n .setID(serializedNode.id as string)\n }\n}\n\nfunction $convertAnchorElement(domNode: Node): DOMConversionOutput {\n let node: LinkNode | null = null\n if (isHTMLAnchorElement(domNode)) {\n const content = domNode.textContent\n if (content !== null && content !== '') {\n node = $createLinkNode({\n id: new ObjectID.default().toHexString(),\n fields: {\n doc: null,\n linkType: 'custom',\n newTab: domNode.getAttribute('target') === '_blank',\n url: domNode.getAttribute('href') ?? '',\n },\n })\n }\n }\n return { node }\n}\n\nexport function $createLinkNode({ id, fields }: { fields?: LinkFields; id?: string }): LinkNode {\n return $applyNodeReplacement(\n new LinkNode({\n id: id ?? new ObjectID.default().toHexString(),\n fields,\n }),\n )\n}\n\nexport function $isLinkNode(node: LexicalNode | null | undefined): node is LinkNode {\n return node instanceof LinkNode\n}\n\nexport const TOGGLE_LINK_COMMAND: LexicalCommand<LinkPayload | null> =\n createCommand('TOGGLE_LINK_COMMAND')\n\nexport function $toggleLink(payload: ({ fields: LinkFields } & LinkPayload) | null): void {\n const selection = $getSelection()\n\n if (!$isRangeSelection(selection) && (payload === null || !payload.selectedNodes?.length)) {\n return\n }\n const nodes = $isRangeSelection(selection)\n ? selection.extract()\n : payload === null\n ? []\n : payload.selectedNodes\n\n if (payload === null) {\n // Remove LinkNodes\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if ($isLinkNode(parent)) {\n const children = parent.getChildren()\n\n children.forEach((child) => {\n parent.insertBefore(child)\n })\n\n parent.remove()\n }\n })\n\n return\n }\n // Add or merge LinkNodes\n if (nodes?.length === 1) {\n const firstNode = nodes[0]!\n // if the first node is a LinkNode or if its\n // parent is a LinkNode, we update the URL, target and rel.\n const linkNode: LinkNode | null = $isLinkNode(firstNode)\n ? firstNode\n : $getLinkAncestor(firstNode)\n if (linkNode !== null) {\n linkNode.setFields(payload.fields)\n\n if (payload.text != null && payload.text !== linkNode.getTextContent()) {\n // remove all children and add child with new textcontent:\n linkNode.append($createTextNode(payload.text))\n linkNode.getChildren().forEach((child) => {\n if (child !== linkNode.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n }\n\n let prevParent: ElementNodeType | LinkNode | null = null\n let linkNode: LinkNode | null = null\n\n nodes?.forEach((node) => {\n const parent = node.getParent()\n\n if (parent === linkNode || parent === null || ($isElementNode(node) && !node.isInline())) {\n return\n }\n\n if ($isLinkNode(parent)) {\n linkNode = parent\n parent.setFields(payload.fields)\n if (payload.text != null && payload.text !== parent.getTextContent()) {\n // remove all children and add child with new textcontent:\n parent.append($createTextNode(payload.text))\n parent.getChildren().forEach((child) => {\n if (child !== parent.getLastChild()) {\n child.remove()\n }\n })\n }\n return\n }\n\n if (!parent.is(prevParent)) {\n prevParent = parent\n linkNode = $createLinkNode({ fields: payload.fields })\n\n if ($isLinkNode(parent)) {\n if (node.getPreviousSibling() === null) {\n parent.insertBefore(linkNode)\n } else {\n parent.insertAfter(linkNode)\n }\n } else {\n node.insertBefore(linkNode)\n }\n }\n\n if ($isLinkNode(node)) {\n if (node.is(linkNode)) {\n return\n }\n if (linkNode !== null) {\n const children = node.getChildren()\n linkNode.append(...children)\n }\n\n node.remove()\n return\n }\n\n if (linkNode !== null) {\n linkNode.append(node)\n }\n })\n}\n\nfunction $getLinkAncestor(node: LexicalNode): LinkNode | null {\n return $getAncestor(node, (ancestor) => $isLinkNode(ancestor)) as LinkNode\n}\n\nfunction $getAncestor(\n node: LexicalNode,\n predicate: (ancestor: LexicalNode) => boolean,\n): LexicalNode | null {\n let parent: LexicalNode | null = node\n while (parent !== null) {\n parent = parent.getParent()\n if (parent === null || predicate(parent)) {\n break\n }\n }\n return parent\n}\n\nfunction manageRel(input: string, action: 'add' | 'remove', value: string): string {\n let result: string\n let mutableInput = `${input}`\n if (action === 'add') {\n // if we somehow got out of sync - clean up\n if (mutableInput.includes(value)) {\n const re = new RegExp(value, 'g')\n mutableInput = mutableInput.replace(re, '').trim()\n }\n mutableInput = mutableInput.trim()\n result = mutableInput.length === 0 ? `${value}` : `${mutableInput} ${value}`\n } else {\n const re = new RegExp(value, 'g')\n result = mutableInput.replace(re, '').trim()\n }\n return result\n}\n", "import type { ElementNode, LexicalNode, LexicalUpdateJSON, RangeSelection } from 'lexical'\n\nimport { $applyNodeReplacement, $isElementNode } from 'lexical'\n\nimport type { LinkFields, SerializedAutoLinkNode } from './types.js'\n\nimport { LinkNode } from './LinkNode.js'\n\n// Custom node type to override `canInsertTextAfter` that will\n// allow typing within the link\n\nexport class AutoLinkNode extends LinkNode {\n static override clone(node: AutoLinkNode): AutoLinkNode {\n return new this({ id: '', fields: node.__fields, key: node.__key })\n }\n\n static override getType(): string {\n return 'autolink'\n }\n\n static override importDOM(): null {\n // TODO: Should link node should handle the import over autolink?\n return null\n }\n\n static override importJSON(serializedNode: SerializedAutoLinkNode): AutoLinkNode {\n const node = $createAutoLinkNode({}).updateFromJSON(serializedNode)\n\n /**\n * @todo remove in 4.0\n */\n if (\n serializedNode.version === 1 &&\n typeof serializedNode.fields?.doc?.value === 'object' &&\n serializedNode.fields?.doc?.value?.id\n ) {\n serializedNode.fields.doc.value = serializedNode.fields.doc.value.id\n serializedNode.version = 2\n }\n\n return node\n }\n\n // @ts-expect-error\n exportJSON(): SerializedAutoLinkNode {\n const serialized = super.exportJSON()\n return {\n type: 'autolink',\n children: serialized.children,\n direction: serialized.direction,\n fields: serialized.fields,\n format: serialized.format,\n indent: serialized.indent,\n version: 2,\n }\n }\n\n override insertNewAfter(selection: RangeSelection, restoreSelection = true): ElementNode | null {\n const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection)\n if ($isElementNode(element)) {\n const linkNode = $createAutoLinkNode({ fields: this.__fields })\n element.append(linkNode)\n return linkNode\n }\n return null\n }\n\n override updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedAutoLinkNode>): this {\n return super.updateFromJSON(serializedNode).setFields(serializedNode.fields)\n }\n}\n\nexport function $createAutoLinkNode({ fields }: { fields?: LinkFields }): AutoLinkNode {\n return $applyNodeReplacement(new AutoLinkNode({ id: '', fields }))\n}\nexport function $isAutoLinkNode(node: LexicalNode | null | undefined): node is AutoLinkNode {\n return node instanceof AutoLinkNode\n}\n", "'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", "'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", "'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", "'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 { formatAdminURL } from 'payload/shared'\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(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\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", "'use client'\nconst VERTICAL_GAP = 10\nconst HORIZONTAL_OFFSET = 5\n\nexport function setFloatingElemPositionForLinkEditor(\n targetRect: DOMRect | null,\n floatingElem: HTMLElement,\n anchorElem: HTMLElement,\n verticalGap: number = VERTICAL_GAP,\n horizontalOffset: number = HORIZONTAL_OFFSET,\n): void {\n const scrollerElem = anchorElem.parentElement\n\n if (targetRect === null || scrollerElem == null) {\n floatingElem.style.opacity = '0'\n floatingElem.style.transform = 'translate(-10000px, -10000px)'\n return\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect()\n const anchorElementRect = anchorElem.getBoundingClientRect()\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\n\n let top = targetRect.top - verticalGap\n let left = targetRect.left - horizontalOffset\n\n if (top < editorScrollerRect.top) {\n top += floatingElemRect.height + targetRect.height + verticalGap * 2\n }\n\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n }\n\n top -= anchorElementRect.top\n left -= anchorElementRect.left\n\n floatingElem.style.opacity = '1'\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { LinkPayload } from '../types.js'\n\nexport const TOGGLE_LINK_WITH_MODAL_COMMAND: LexicalCommand<LinkPayload | null> = createCommand(\n 'TOGGLE_LINK_WITH_MODAL_COMMAND',\n)\n", "'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n PASTE_COMMAND,\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'\nimport type { LinkPayload } from '../floatingLinkEditor/types.js'\n\nimport { validateUrl } from '../../../../../lexical/utils/url.js'\nimport { $toggleLink, LinkNode, TOGGLE_LINK_COMMAND } from '../../../nodes/LinkNode.js'\n\nexport const LinkPlugin: PluginComponent<ClientProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n if (!editor.hasNodes([LinkNode])) {\n throw new Error('LinkPlugin: LinkNode not registered on editor')\n }\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: LinkPayload) => {\n if (payload === null) {\n $toggleLink(null)\n return true\n }\n if (!payload.fields?.linkType) {\n payload.fields.linkType = clientProps.defaultLinkType as any\n }\n if (!payload.fields?.url) {\n payload.fields.url = clientProps.defaultLinkURL as any\n }\n $toggleLink(payload as { fields: LinkFields } & LinkPayload)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n const selection = $getSelection()\n if (\n !$isRangeSelection(selection) ||\n selection.isCollapsed() ||\n !(event instanceof ClipboardEvent) ||\n event.clipboardData == null\n ) {\n return false\n }\n const clipboardText = event.clipboardData.getData('text')\n if (!validateUrl(clipboardText)) {\n return false\n }\n // If we select nodes that are elements then avoid applying the link.\n if (!selection.getNodes().some((node) => $isElementNode(node))) {\n const linkFields: LinkFields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: clipboardText,\n }\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: linkFields,\n text: null,\n })\n event.preventDefault()\n return true\n }\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [clientProps.defaultLinkType, clientProps.defaultLinkURL, editor])\n\n return null\n}\n", "export function sanitizeUrl(url: string): string {\n /** A pattern that matches safe URLs. */\n const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^&:/?#]*(?:[/?#]|$))/gi\n\n /** A pattern that matches safe data URLs. */\n const DATA_URL_PATTERN =\n /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z\\d+/]+=*$/i\n\n url = String(url).trim()\n\n if (url.match(SAFE_URL_PATTERN) != null || url.match(DATA_URL_PATTERN) != null) {\n return url\n }\n\n return 'https://'\n}\n\n/**\n * This regex checks for absolute URLs in a string. Tested for the following use cases:\n * - http://example.com\n * - https://example.com\n * - ftp://files.example.com\n * - http://example.com/resource\n * - https://example.com/resource?key=value\n * - http://example.com/resource#anchor\n * - http://www.example.com\n * - https://sub.example.com/path/file\n * - mailto:\n */\nexport const absoluteRegExp =\n /^(?:[a-zA-Z][a-zA-Z\\d+.-]*:(?:\\/\\/)?(?:[-;:&=+$,\\w]+@)?[A-Za-z\\d]+(?:\\.[A-Za-z\\d]+)+|www\\.[A-Za-z\\d]+(?:\\.[A-Za-z\\d]+)+|(?:tel|mailto):[\\w+.-]+)(?:\\/[+~%/\\w-]*)?(?:\\?[-;&=%\\w]*)?(?:#\\w+)?$/\n\n/**\n * This regex checks for relative URLs starting with / or anchor links starting with # in a string. Tested for the following use cases:\n * - /privacy-policy\n * - /privacy-policy#primary-terms\n * - #primary-terms\n * - /page?id=123\n * - /page?id=123#section\n * */\nexport const relativeOrAnchorRegExp = /^(?:\\/[\\w\\-./]*(?:\\?[-;&=%\\w]*)?(?:#[\\w-]+)?|#[\\w\\-]+)$/\n\n/**\n * Prevents unreasonable URLs from being inserted into the editor.\n * @param url\n */\nexport function validateUrlMinimal(url: string): boolean {\n if (!url) {\n return false\n }\n\n return !url.includes(' ')\n}\n\n// Do not keep validateUrl function too loose. This is run when pasting in text, to determine if links are in that text and if it should create AutoLinkNodes.\n// This is why we do not allow stuff like anchors here, as we don't want copied anchors to be turned into AutoLinkNodes.\nexport function validateUrl(url: string): boolean {\n // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://.\n // Maybe show a dialog where they user can type the URL before inserting it.\n if (!url) {\n return false\n }\n\n // Reject URLs with spaces\n if (url.includes(' ')) {\n return false\n }\n\n // Reject malformed protocol URLs (e.g., http:/example.com instead of http://example.com)\n if (/^[a-z][a-z\\d+.-]*:\\/[^/]/i.test(url)) {\n return false\n }\n\n if (url === 'https://') {\n return true\n }\n\n // This makes sure URLs starting with www. instead of https are valid too\n if (absoluteRegExp.test(url)) {\n return true\n }\n\n // Check relative or anchor links\n if (relativeOrAnchorRegExp.test(url)) {\n return true\n }\n\n // While this doesn't allow URLs starting with www (which is why we use the regex above), it does properly handle tel: URLs\n try {\n const urlObj = new URL(url)\n // For http/https/ftp protocols, require a proper domain with at least one dot (for TLD)\n if (['ftp:', 'http:', 'https:'].includes(urlObj.protocol)) {\n if (!urlObj.hostname.includes('.')) {\n return false\n }\n }\n return true\n } catch {\n /* empty */\n }\n\n return false\n}\n", "'use client'\nimport { $isListNode, INSERT_CHECK_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\nimport type { ClientFeature } from '../../../typesClient.js'\n\nimport { ChecklistIcon } from '../../../../lexical/ui/icons/Checklist/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { shouldRegisterListBaseNodes } from '../../shared/shouldRegisterListBaseNodes.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { CHECK_LIST } from '../markdownTransformers.js'\nimport { LexicalCheckListPlugin } from './plugin/index.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: ChecklistIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'check') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'check') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'check') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'checklist',\n label: ({ i18n }) => {\n return i18n.t('lexical:checklist:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n },\n order: 12,\n },\n ]),\n]\n\nexport const ChecklistFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const plugins: ClientFeature<undefined>['plugins'] = [\n {\n Component: LexicalCheckListPlugin,\n position: 'normal',\n },\n ]\n\n const shouldRegister = shouldRegisterListBaseNodes('checklist', featureProviderMap)\n if (shouldRegister) {\n plugins.push({\n Component: LexicalListPlugin,\n position: 'normal',\n })\n }\n\n return {\n markdownTransformers: [CHECK_LIST],\n nodes: shouldRegister ? [ListNode, ListItemNode] : [],\n plugins,\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: ChecklistIcon,\n key: 'checklist',\n keywords: ['check list', 'check', 'checklist', 'cl'],\n label: ({ i18n }) => {\n return i18n.t('lexical:checklist:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const ChecklistIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect height=\"13\" rx=\"1.5\" stroke=\"currentColor\" width=\"13\" x=\"3.5\" y=\"3.5\" />\n <path d=\"M7 10L9 12.5L13 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "'use client'\nimport type {\n SerializedListItemNode as _SerializedListItemNode,\n SerializedListNode as _SerializedListNode,\n} from '@lexical/list'\nimport type { SerializedLexicalNode } from 'lexical'\n\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin.js'\nimport React from 'react'\n\nimport type { StronglyTypedElementNode } from '../../../nodeTypes.js'\nimport type { PluginComponent } from '../../typesClient.js'\n\nexport type SerializedListItemNode<T extends SerializedLexicalNode = SerializedLexicalNode> = {\n checked?: boolean\n} & StronglyTypedElementNode<_SerializedListItemNode, 'listitem', T>\n\nexport type SerializedListNode<T extends SerializedLexicalNode = SerializedLexicalNode> = {\n checked?: boolean\n} & StronglyTypedElementNode<_SerializedListNode, 'list', T>\n\nexport const LexicalListPlugin: PluginComponent<undefined> = () => {\n return <ListPlugin />\n}\n", "// Priority order: unordered > ordered > checklist.\n// That's why we don't include unordered among the parameter options. It registers by default.\nexport function shouldRegisterListBaseNodes(\n type: 'checklist' | 'ordered',\n featureProviderMap: Map<string, unknown>,\n) {\n if (type === 'ordered') {\n // OrderedList only registers if UnorderedList is NOT present\n return !featureProviderMap.has('unorderedList')\n }\n\n if (type === 'checklist') {\n // Checklist only registers if neither UnorderedList nor OrderedList are present\n return !featureProviderMap.has('unorderedList') && !featureProviderMap.has('orderedList')\n }\n\n return false\n}\n", "import type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\n\nexport function slashMenuListGroupWithItems(items: SlashMenuItem[]): SlashMenuGroup {\n return {\n items,\n key: 'lists',\n label: ({ i18n }) => {\n return i18n.t('lexical:general:slashMenuListGroupLabel')\n },\n }\n}\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const CHECK_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)(?:-\\s)?\\s?(\\[(\\s|x)?\\])\\s/i,\n replace: listReplace('check'),\n}\n", "// Copied from https://github.com/facebook/lexical/blob/176b8cf16ecb332ee5efe2c75219e223b7b019f2/packages/lexical-markdown/src/MarkdownTransformers.ts#L97C1-L172C1\n\nimport type { ListNode, ListType } from '@lexical/list'\nimport type { ElementNode } from 'lexical'\n\nimport { $createListItemNode, $createListNode, $isListItemNode, $isListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\n// Amount of spaces that define indentation level\nconst LIST_INDENT_SIZE = 4\n\nexport const listReplace = (listType: ListType): ElementTransformer['replace'] => {\n return (parentNode, children, match) => {\n const previousNode = parentNode.getPreviousSibling()\n const nextNode = parentNode.getNextSibling()\n const listItem = $createListItemNode(listType === 'check' ? match[3] === 'x' : undefined)\n if ($isListNode(nextNode) && nextNode.getListType() === listType) {\n const firstChild = nextNode.getFirstChild()\n if (firstChild !== null) {\n firstChild.insertBefore(listItem)\n } else {\n // should never happen, but let's handle gracefully, just in case.\n nextNode.append(listItem)\n }\n parentNode.remove()\n } else if ($isListNode(previousNode) && previousNode.getListType() === listType) {\n previousNode.append(listItem)\n parentNode.remove()\n } else {\n const list = $createListNode(listType, listType === 'number' ? Number(match[2]) : undefined)\n list.append(listItem)\n parentNode.replace(list)\n }\n listItem.append(...children)\n listItem.select(0, 0)\n const indent = Math.floor(match[1]!.length / LIST_INDENT_SIZE)\n if (indent) {\n listItem.setIndent(indent)\n }\n }\n}\n\nexport const listExport = (\n listNode: ListNode,\n exportChildren: (node: ElementNode) => string,\n depth: number,\n): string => {\n const output: string[] = []\n const children = listNode.getChildren()\n let index = 0\n for (const listItemNode of children) {\n if ($isListItemNode(listItemNode)) {\n if (listItemNode.getChildrenSize() === 1) {\n const firstChild = listItemNode.getFirstChild()\n if ($isListNode(firstChild)) {\n output.push(listExport(firstChild, exportChildren, depth + 1))\n continue\n }\n }\n const indent = ' '.repeat(depth * LIST_INDENT_SIZE)\n const listType = listNode.getListType()\n const prefix =\n listType === 'number'\n ? `${listNode.getStart() + index}. `\n : listType === 'check'\n ? `- [${listItemNode.getChecked() ? 'x' : ' '}] `\n : '- '\n output.push(indent + prefix + exportChildren(listItemNode))\n index++\n }\n }\n\n return output.join('\\n')\n}\n", "'use client'\nimport { CheckListPlugin } from '@lexical/react/LexicalCheckListPlugin.js'\nimport React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nexport const LexicalCheckListPlugin: PluginComponent<undefined> = () => {\n return <CheckListPlugin />\n}\n", "'use client'\nimport { $isListNode, INSERT_ORDERED_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\n\nimport { OrderedListIcon } from '../../../../lexical/ui/icons/OrderedList/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { shouldRegisterListBaseNodes } from '../../shared/shouldRegisterListBaseNodes.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { ORDERED_LIST } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: OrderedListIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'number') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'number') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'number') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'orderedList',\n label: ({ i18n }) => {\n return i18n.t('lexical:orderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n },\n order: 10,\n },\n ]),\n]\n\nexport const OrderedListFeatureClient = createClientFeature(({ featureProviderMap }) => {\n const shouldRegister = shouldRegisterListBaseNodes('ordered', featureProviderMap)\n return {\n markdownTransformers: [ORDERED_LIST],\n nodes: shouldRegister ? [ListNode, ListItemNode] : [],\n plugins: shouldRegister\n ? [\n {\n Component: LexicalListPlugin,\n position: 'normal',\n },\n ]\n : [],\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: OrderedListIcon,\n key: 'orderedList',\n keywords: ['ordered list', 'ol'],\n label: ({ i18n }) => {\n return i18n.t('lexical:orderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n }\n})\n", "'use client'\nimport React from 'react'\n\nexport const OrderedListIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.89284 12.479C5.89284 13.368 5.26284 13.788 4.38084 14.236C3.75084 14.558 3.43584 14.789 3.40784 15.062H5.89984V16H2.06384V15.573C2.06384 14.523 2.92484 13.935 3.66684 13.501C4.38084 13.088 4.75184 12.878 4.75184 12.458C4.75184 12.08 4.52084 11.835 4.06584 11.835C3.58984 11.835 3.30984 12.199 3.28184 12.654H2.11284C2.18984 11.681 2.87584 10.918 4.07284 10.918C5.15784 10.918 5.89284 11.555 5.89284 12.479Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M2.68608 4.535V3.737C3.54008 3.737 3.90408 3.513 4.02308 2.995H4.89108V8H3.68008L3.68008 4.535H2.68608Z\"\n fill=\"currentColor\"\n />\n <path d=\"M8 15L17 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 10L17 10\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 5L17 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const ORDERED_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)(\\d+)\\.\\s/,\n replace: listReplace('number'),\n}\n", "'use client'\n\nimport { $isListNode, INSERT_UNORDERED_LIST_COMMAND, ListItemNode, ListNode } from '@lexical/list'\nimport { $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../../toolbars/types.js'\n\nimport { UnorderedListIcon } from '../../../../lexical/ui/icons/UnorderedList/index.js'\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../../shared/toolbar/textDropdownGroup.js'\nimport { LexicalListPlugin } from '../../plugin/index.js'\nimport { slashMenuListGroupWithItems } from '../../shared/slashMenuListGroup.js'\nimport { UNORDERED_LIST } from '../markdownTransformer.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: UnorderedListIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if ($isListNode(node) && node.getListType() === 'bullet') {\n continue\n }\n\n const parent = node.getParent()\n\n if ($isListNode(parent) && parent.getListType() === 'bullet') {\n continue\n }\n\n const parentParent = parent?.getParent()\n // Example scenario: Node = textNode, parent = listItemNode, parentParent = listNode\n if ($isListNode(parentParent) && parentParent.getListType() === 'bullet') {\n continue\n }\n\n return false\n }\n return true\n },\n key: 'unorderedList',\n label: ({ i18n }) => {\n return i18n.t('lexical:unorderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n },\n order: 11,\n },\n ]),\n]\n\nexport const UnorderedListFeatureClient = createClientFeature({\n markdownTransformers: [UNORDERED_LIST],\n nodes: [ListNode, ListItemNode],\n plugins: [\n {\n Component: LexicalListPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuListGroupWithItems([\n {\n Icon: UnorderedListIcon,\n key: 'unorderedList',\n keywords: ['unordered list', 'ul'],\n label: ({ i18n }) => {\n return i18n.t('lexical:unorderedList:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UnorderedListIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"4\" cy=\"5\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <circle cx=\"4\" cy=\"10\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <circle cx=\"4\" cy=\"15\" fill=\"currentColor\" r=\"1.15\" stroke=\"currentColor\" strokeWidth=\"0.3\" />\n <path d=\"M17 5H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17 10H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M17 15H7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n)\n", "import { $isListNode, ListItemNode, ListNode } from '@lexical/list'\n\nimport type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js'\n\nimport { listExport, listReplace } from '../shared/markdown.js'\n\nexport const UNORDERED_LIST: ElementTransformer = {\n type: 'element',\n dependencies: [ListNode, ListItemNode],\n export: (node, exportChildren) => {\n return $isListNode(node) ? listExport(node, exportChildren, 0) : null\n },\n regExp: /^(\\s*)[-*+]\\s/,\n replace: listReplace('bullet'),\n}\n", "import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { UnknownConvertedNode } from './nodes/unknownConvertedNode/index.js'\n\nexport const LexicalPluginToLexicalFeatureClient = createClientFeature(() => {\n return {\n nodes: [UnknownConvertedNode],\n }\n})\n", "import type { EditorConfig, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, DecoratorNode } from 'lexical'\nimport * as React from 'react'\n\nexport type UnknownConvertedNodeData = {\n nodeData: unknown\n nodeType: string\n}\n\nexport type SerializedUnknownConvertedNode = Spread<\n {\n data: UnknownConvertedNodeData\n },\n SerializedLexicalNode\n>\n\nconst Component = React.lazy(() =>\n import('./Component.js').then((module) => ({\n default: module.UnknownConvertedNodeComponent,\n })),\n)\n\n/** @noInheritDoc */\nexport class UnknownConvertedNode extends DecoratorNode<JSX.Element> {\n __data: UnknownConvertedNodeData\n\n constructor({ data, key }: { data: UnknownConvertedNodeData; key?: NodeKey }) {\n super(key)\n this.__data = data\n }\n\n static override clone(node: UnknownConvertedNode): UnknownConvertedNode {\n return new this({\n data: node.__data,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'unknownConverted'\n }\n\n static override importJSON(serializedNode: SerializedUnknownConvertedNode): UnknownConvertedNode {\n const node = $createUnknownConvertedNode({ data: serializedNode.data })\n return node\n }\n\n canInsertTextAfter(): true {\n return true\n }\n\n canInsertTextBefore(): true {\n return true\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('span')\n addClassNamesToElement(element, 'unknownConverted')\n return element\n }\n\n override decorate(): JSX.Element {\n return <Component data={this.__data} />\n }\n\n override exportJSON(): SerializedUnknownConvertedNode {\n return {\n type: this.getType(),\n data: this.__data,\n version: 1,\n }\n }\n\n // Mutation\n\n override isInline(): boolean {\n return true\n }\n\n override updateDOM(prevNode: this, dom: HTMLElement): boolean {\n return false\n }\n}\n\nexport function $createUnknownConvertedNode({\n data,\n}: {\n data: UnknownConvertedNodeData\n}): UnknownConvertedNode {\n return $applyNodeReplacement(\n new UnknownConvertedNode({\n data,\n }),\n )\n}\n\nexport function $isUnknownConvertedNode(\n node: LexicalNode | null | undefined,\n): node is UnknownConvertedNode {\n return node instanceof UnknownConvertedNode\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { UnknownConvertedNode } from './nodes/unknownConvertedNode/index.js'\n\nexport const SlateToLexicalFeatureClient = createClientFeature(() => {\n return {\n nodes: [UnknownConvertedNode],\n }\n})\n", "'use client'\n\nimport { $setBlocksType } from '@lexical/selection'\nimport { $createParagraphNode, $getSelection, $isParagraphNode, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { TextIcon } from '../../../lexical/ui/icons/Text/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarTextDropdownGroupWithItems } from '../../shared/toolbar/textDropdownGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarTextDropdownGroupWithItems([\n {\n ChildComponent: TextIcon,\n isActive: ({ selection }) => {\n if (!$isRangeSelection(selection)) {\n return false\n }\n for (const node of selection.getNodes()) {\n if (!$isParagraphNode(node) && !$isParagraphNode(node.getParent())) {\n return false\n }\n }\n return true\n },\n key: 'paragraph',\n label: ({ i18n }) => {\n return i18n.t('lexical:paragraph:label2')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createParagraphNode())\n })\n },\n order: 1,\n },\n ]),\n]\n\nexport const ParagraphFeatureClient = createClientFeature({\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: TextIcon,\n key: 'paragraph',\n keywords: ['normal', 'paragraph', 'p', 'text'],\n label: ({ i18n }) => {\n return i18n.t('lexical:paragraph:label')\n },\n onSelect: ({ editor }) => {\n editor.update(() => {\n const selection = $getSelection()\n $setBlocksType(selection, () => $createParagraphNode())\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n", "'use client'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useEffect, useState } from 'react'\n\n// eslint-disable-next-line payload/no-imports-from-exports-dir\nimport { defaultJSXConverters, RichText } from '../../../../../exports/react/index.js'\nimport './style.scss'\n\nexport function RichTextPlugin() {\n const [editor] = useLexicalComposerContext()\n const [editorState, setEditorState] = useState(() => editor.getEditorState().toJSON())\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n setEditorState(editorState.toJSON())\n })\n }, [editor])\n\n return (\n <div className=\"debug-jsx-converter\">\n <RichText converters={defaultJSXConverters} data={editorState} />\n </div>\n )\n}\n", "import React from 'react'\n\nimport type {\n DefaultNodeTypes,\n SerializedBlockNode,\n SerializedInlineBlockNode,\n} from '../../../../nodeTypes.js'\nimport type { JSXConverters } from '../converter/types.js'\n\nimport { defaultJSXConverters } from '../converter/defaultConverters.js'\nimport { convertLexicalToJSX, type ConvertLexicalToJSXArgs } from '../converter/index.js'\n\nexport type JSXConvertersFunction<\n T extends { [key: string]: any; type?: string } =\n | DefaultNodeTypes\n | SerializedBlockNode<{ blockName?: null | string }>\n | SerializedInlineBlockNode<{ blockName?: null | string }>,\n> = (args: { defaultConverters: JSXConverters<DefaultNodeTypes> }) => JSXConverters<T>\n\ntype RichTextProps = {\n /**\n * Override class names for the container.\n */\n className?: string\n /**\n * Custom converters to transform your nodes to JSX. Can be an object or a function that receives the default converters.\n */\n converters?: JSXConverters | JSXConvertersFunction\n\n /**\n * If true, removes the container div wrapper.\n */\n disableContainer?: boolean\n} & Pick<ConvertLexicalToJSXArgs, 'data' | 'disableIndent' | 'disableTextAlign' | 'nodeMap'>\n\nexport const RichText: React.FC<RichTextProps> = ({\n className,\n converters,\n data: editorState,\n disableContainer,\n disableIndent,\n disableTextAlign,\n nodeMap,\n}) => {\n if (!editorState) {\n return null\n }\n\n let finalConverters: JSXConverters = {}\n if (converters) {\n if (typeof converters === 'function') {\n finalConverters = converters({ defaultConverters: defaultJSXConverters })\n } else {\n finalConverters = converters\n }\n } else {\n finalConverters = defaultJSXConverters\n }\n\n const content =\n editorState &&\n !Array.isArray(editorState) &&\n typeof editorState === 'object' &&\n 'root' in editorState &&\n convertLexicalToJSX({\n converters: finalConverters,\n data: editorState,\n disableIndent,\n disableTextAlign,\n nodeMap,\n })\n\n if (disableContainer) {\n return <>{content}</>\n }\n\n return <div className={className ?? 'payload-richtext'}>{content}</div>\n}\n", "import type { SerializedQuoteNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const BlockquoteJSXConverter: JSXConverters<SerializedQuoteNode> = {\n quote: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n return <blockquote>{children}</blockquote>\n },\n}\n", "import type { SerializedHeadingNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const HeadingJSXConverter: JSXConverters<SerializedHeadingNode> = {\n heading: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag>{children}</NodeTag>\n },\n}\n", "import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\nexport const HorizontalRuleJSXConverter: JSXConverters<SerializedHorizontalRuleNode> = {\n horizontalrule: <hr />,\n}\n", "import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const LinebreakJSXConverter: JSXConverters<SerializedLineBreakNode> = {\n linebreak: <br />,\n}\n", "import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const LinkJSXConverter: (args: {\n internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string\n}) => JSXConverters<SerializedAutoLinkNode | SerializedLinkNode> = ({ internalDocToHref }) => ({\n autolink: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined\n const target: string | undefined = node.fields.newTab ? '_blank' : undefined\n\n return (\n <a href={node.fields.url} {...{ rel, target }}>\n {children}\n </a>\n )\n },\n link: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined\n const target: string | undefined = node.fields.newTab ? '_blank' : undefined\n\n let href: string = node.fields.url ?? ''\n if (node.fields.linkType === 'internal') {\n if (internalDocToHref) {\n href = internalDocToHref({ linkNode: node })\n } else {\n console.error(\n 'Lexical => JSX converter: Link converter: found internal link, but internalDocToHref is not provided',\n )\n href = '#' // fallback\n }\n }\n\n return (\n <a href={href} {...{ rel, target }}>\n {children}\n </a>\n )\n },\n})\n", "import { v4 as uuidv4 } from 'uuid'\n\nimport type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const ListJSXConverter: JSXConverters<SerializedListItemNode | SerializedListNode> = {\n list: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const NodeTag = node.tag\n\n return <NodeTag className={`list-${node?.listType}`}>{children}</NodeTag>\n },\n listitem: ({ node, nodesToJSX, parent }) => {\n const hasSubLists = node.children.some((child) => child.type === 'list')\n\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if ('listType' in parent && parent?.listType === 'check') {\n const uuid = uuidv4()\n\n return (\n <li\n aria-checked={node.checked ? 'true' : 'false'}\n className={`list-item-checkbox${node.checked ? ' list-item-checkbox-checked' : ' list-item-checkbox-unchecked'}${hasSubLists ? ' nestedListItem' : ''}`}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role\n role=\"checkbox\"\n style={{ listStyleType: 'none' }}\n tabIndex={-1}\n value={node?.value}\n >\n {hasSubLists ? (\n children\n ) : (\n <>\n <input checked={node.checked} id={uuid} readOnly={true} type=\"checkbox\" />\n <label htmlFor={uuid}>{children}</label>\n <br />\n </>\n )}\n </li>\n )\n } else {\n return (\n <li\n className={`${hasSubLists ? 'nestedListItem' : ''}`}\n style={hasSubLists ? { listStyleType: 'none' } : undefined}\n value={node?.value}\n >\n {children}\n </li>\n )\n }\n },\n}\n", "import type { SerializedParagraphNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const ParagraphJSXConverter: JSXConverters<SerializedParagraphNode> = {\n paragraph: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n if (!children?.length) {\n return (\n <p>\n <br />\n </p>\n )\n }\n\n return <p>{children}</p>\n },\n}\n", "import type { SerializedTabNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const TabJSXConverter: JSXConverters<SerializedTabNode> = {\n tab: '\\t',\n}\n", "import type {\n SerializedTableCellNode,\n SerializedTableNode,\n SerializedTableRowNode,\n} from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const TableJSXConverter: JSXConverters<\n SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode\n> = {\n table: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n return (\n <div className=\"lexical-table-container\">\n <table className=\"lexical-table\" style={{ borderCollapse: 'collapse' }}>\n <tbody>{children}</tbody>\n </table>\n </div>\n )\n },\n tablecell: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n\n const TagName = node.headerState > 0 ? 'th' : 'td' // Use capital letter to denote a component\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const style = {\n backgroundColor: node.backgroundColor || undefined, // Use undefined to avoid setting the style property if not needed\n border: '1px solid #ccc',\n padding: '8px',\n }\n\n // Note: JSX does not support setting attributes directly as strings, so you must convert the colSpan and rowSpan to numbers\n const colSpan = node.colSpan && node.colSpan > 1 ? node.colSpan : undefined\n const rowSpan = node.rowSpan && node.rowSpan > 1 ? node.rowSpan : undefined\n\n return (\n <TagName\n className={`lexical-table-cell ${headerStateClass}`}\n colSpan={colSpan} // colSpan and rowSpan will only be added if they are not null\n rowSpan={rowSpan}\n style={style}\n >\n {children}\n </TagName>\n )\n },\n tablerow: ({ node, nodesToJSX }) => {\n const children = nodesToJSX({\n nodes: node.children,\n })\n return <tr className=\"lexical-table-row\">{children}</tr>\n },\n}\n", "import React from 'react'\n\nimport type { SerializedTextNode } from '../../../../../nodeTypes.js'\nimport type { JSXConverters } from '../types.js'\n\nimport { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js'\n\nexport const TextJSXConverter: JSXConverters<SerializedTextNode> = {\n text: ({ node }) => {\n let text: React.ReactNode = node.text\n\n if (node.format & NodeFormat.IS_BOLD) {\n text = <strong>{text}</strong>\n }\n if (node.format & NodeFormat.IS_ITALIC) {\n text = <em>{text}</em>\n }\n if (node.format & NodeFormat.IS_STRIKETHROUGH) {\n text = <span style={{ textDecoration: 'line-through' }}>{text}</span>\n }\n if (node.format & NodeFormat.IS_UNDERLINE) {\n text = <span style={{ textDecoration: 'underline' }}>{text}</span>\n }\n if (node.format & NodeFormat.IS_CODE) {\n text = <code>{text}</code>\n }\n if (node.format & NodeFormat.IS_SUBSCRIPT) {\n text = <sub>{text}</sub>\n }\n if (node.format & NodeFormat.IS_SUPERSCRIPT) {\n text = <sup>{text}</sup>\n }\n\n return text\n },\n}\n", "/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable regexp/no-obscure-range */\n/* eslint-disable @typescript-eslint/no-redundant-type-constituents */\n/* eslint-disable regexp/no-misleading-unicode-character */\n//This copy-and-pasted from lexical here: https://github.com/facebook/lexical/blob/c2ceee223f46543d12c574e62155e619f9a18a5d/packages/lexical/src/LexicalConstants.ts\n\nimport type { ElementFormatType, TextFormatType, TextModeType } from 'lexical'\nexport type TextDetailType = 'directionless' | 'unmergable'\n\n// DOM\nexport const NodeFormat = {\n DOM_ELEMENT_TYPE: 1,\n DOM_TEXT_TYPE: 3,\n // Reconciling\n NO_DIRTY_NODES: 0,\n HAS_DIRTY_NODES: 1,\n FULL_RECONCILE: 2,\n // Text node modes\n IS_NORMAL: 0,\n IS_TOKEN: 1,\n IS_SEGMENTED: 2,\n IS_INERT: 3,\n // Text node formatting\n IS_BOLD: 1,\n IS_ITALIC: 1 << 1,\n IS_STRIKETHROUGH: 1 << 2,\n IS_UNDERLINE: 1 << 3,\n IS_CODE: 1 << 4,\n IS_SUBSCRIPT: 1 << 5,\n IS_SUPERSCRIPT: 1 << 6,\n IS_HIGHLIGHT: 1 << 7,\n // Text node details\n IS_DIRECTIONLESS: 1,\n IS_UNMERGEABLE: 1 << 1,\n // Element node formatting\n IS_ALIGN_LEFT: 1,\n IS_ALIGN_CENTER: 2,\n IS_ALIGN_RIGHT: 3,\n IS_ALIGN_JUSTIFY: 4,\n IS_ALIGN_START: 5,\n IS_ALIGN_END: 6,\n} as const\n\nexport const IS_ALL_FORMATTING =\n NodeFormat.IS_BOLD |\n NodeFormat.IS_ITALIC |\n NodeFormat.IS_STRIKETHROUGH |\n NodeFormat.IS_UNDERLINE |\n NodeFormat.IS_CODE |\n NodeFormat.IS_SUBSCRIPT |\n NodeFormat.IS_SUPERSCRIPT |\n NodeFormat.IS_HIGHLIGHT\n\n// Reconciliation\nexport const NON_BREAKING_SPACE = '\\u00A0'\n\nexport const DOUBLE_LINE_BREAK = '\\n\\n'\n\n// For FF, we need to use a non-breaking space, or it gets composition\n// in a stuck state.\n\nconst RTL = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC'\nconst LTR =\n 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6' +\n '\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\\u200E\\u2C00-\\uFB1C' +\n '\\uFE00-\\uFE6F\\uFEFD-\\uFFFF'\n\n// eslint-disable-next-line no-misleading-character-class\nexport const RTL_REGEX = new RegExp('^[^' + LTR + ']*[' + RTL + ']')\n// eslint-disable-next-line no-misleading-character-class\nexport const LTR_REGEX = new RegExp('^[^' + RTL + ']*[' + LTR + ']')\n\nexport const TEXT_TYPE_TO_FORMAT: Record<string | TextFormatType, number> = {\n bold: NodeFormat.IS_BOLD,\n code: NodeFormat.IS_CODE,\n highlight: NodeFormat.IS_HIGHLIGHT,\n italic: NodeFormat.IS_ITALIC,\n strikethrough: NodeFormat.IS_STRIKETHROUGH,\n subscript: NodeFormat.IS_SUBSCRIPT,\n superscript: NodeFormat.IS_SUPERSCRIPT,\n underline: NodeFormat.IS_UNDERLINE,\n}\n\nexport const DETAIL_TYPE_TO_DETAIL: Record<string | TextDetailType, number> = {\n directionless: NodeFormat.IS_DIRECTIONLESS,\n unmergeable: NodeFormat.IS_UNMERGEABLE,\n}\n\nexport const ELEMENT_TYPE_TO_FORMAT: Record<Exclude<ElementFormatType, ''>, number> = {\n center: NodeFormat.IS_ALIGN_CENTER,\n end: NodeFormat.IS_ALIGN_END,\n justify: NodeFormat.IS_ALIGN_JUSTIFY,\n left: NodeFormat.IS_ALIGN_LEFT,\n right: NodeFormat.IS_ALIGN_RIGHT,\n start: NodeFormat.IS_ALIGN_START,\n}\n\nexport const ELEMENT_FORMAT_TO_TYPE: Record<number, ElementFormatType> = {\n [NodeFormat.IS_ALIGN_CENTER]: 'center',\n [NodeFormat.IS_ALIGN_END]: 'end',\n [NodeFormat.IS_ALIGN_JUSTIFY]: 'justify',\n [NodeFormat.IS_ALIGN_LEFT]: 'left',\n [NodeFormat.IS_ALIGN_RIGHT]: 'right',\n [NodeFormat.IS_ALIGN_START]: 'start',\n}\n\nexport const TEXT_MODE_TO_TYPE: Record<TextModeType, 0 | 1 | 2> = {\n normal: NodeFormat.IS_NORMAL,\n segmented: NodeFormat.IS_SEGMENTED,\n token: NodeFormat.IS_TOKEN,\n}\n\nexport const TEXT_TYPE_TO_MODE: Record<number, TextModeType> = {\n [NodeFormat.IS_NORMAL]: 'normal',\n [NodeFormat.IS_SEGMENTED]: 'segmented',\n [NodeFormat.IS_TOKEN]: 'token',\n}\n", "import type { FileData, FileSizeImproved, TypeWithID } from 'payload'\n\nimport type { SerializedUploadNode } from '../../../../../nodeTypes.js'\nimport type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js'\nimport type { JSXConverters } from '../types.js'\n\nexport const UploadJSXConverter: JSXConverters<SerializedUploadNode> = {\n upload: ({ node }) => {\n // TO-DO (v4): SerializedUploadNode should use UploadData_P4\n const uploadNode = node as UploadDataImproved\n if (typeof uploadNode.value !== 'object') {\n return null\n }\n\n const uploadDoc = uploadNode.value as FileData & TypeWithID\n\n const alt = (uploadNode.fields?.alt as string) || (uploadDoc as { alt?: string })?.alt || ''\n\n const url = uploadDoc.url\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDoc.mimeType.startsWith('image')) {\n return (\n <a href={url} rel=\"noopener noreferrer\">\n {uploadDoc.filename}\n </a>\n )\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) {\n return <img alt={alt} height={uploadDoc.height} src={url} width={uploadDoc.width} />\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n const pictureJSX: React.ReactNode[] = []\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDoc.sizes) {\n const imageSize = uploadDoc.sizes[size] as FileSizeImproved\n\n // Skip if any property of the size object is null\n if (\n !imageSize ||\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = imageSize?.url\n\n pictureJSX.push(\n <source\n key={size}\n media={`(max-width: ${imageSize.width}px)`}\n srcSet={imageSizeURL}\n type={imageSize.mimeType}\n />,\n )\n }\n\n // Add the default img tag\n pictureJSX.push(\n <img alt={alt} height={uploadDoc?.height} key={'image'} src={url} width={uploadDoc?.width} />,\n )\n return <picture>{pictureJSX}</picture>\n },\n}\n", "import type { DefaultNodeTypes } from '../../../../nodeTypes.js'\nimport type { JSXConverters } from './types.js'\n\nimport { BlockquoteJSXConverter } from './converters/blockquote.js'\nimport { HeadingJSXConverter } from './converters/heading.js'\nimport { HorizontalRuleJSXConverter } from './converters/horizontalRule.js'\nimport { LinebreakJSXConverter } from './converters/linebreak.js'\nimport { LinkJSXConverter } from './converters/link.js'\nimport { ListJSXConverter } from './converters/list.js'\nimport { ParagraphJSXConverter } from './converters/paragraph.js'\nimport { TabJSXConverter } from './converters/tab.js'\nimport { TableJSXConverter } from './converters/table.js'\nimport { TextJSXConverter } from './converters/text.js'\nimport { UploadJSXConverter } from './converters/upload.js'\n\nexport const defaultJSXConverters: JSXConverters<DefaultNodeTypes> = {\n ...ParagraphJSXConverter,\n ...TextJSXConverter,\n ...LinebreakJSXConverter,\n ...BlockquoteJSXConverter,\n ...TableJSXConverter,\n ...HeadingJSXConverter,\n ...HorizontalRuleJSXConverter,\n ...ListJSXConverter,\n ...LinkJSXConverter({}),\n ...UploadJSXConverter,\n ...TabJSXConverter,\n}\n", "/* eslint-disable no-console */\nimport type { SerializedEditorState, SerializedLexicalNode } from 'lexical'\n\nimport React from 'react'\n\nimport type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js'\nimport type { LexicalEditorNodeMap, NodeMapValue } from '../../../../types.js'\nimport type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js'\n\nimport { hasText } from '../../../../validate/hasText.js'\n\n/**\n * Creates a JSX converter from a NodeMapValue\n */\nfunction createConverterFromNodeMapValue(viewDef: NodeMapValue): JSXConverter {\n return (args) => {\n const converterArgs = {\n ...args,\n isEditor: false as const,\n isJSXConverter: true as const,\n }\n\n // If Component is provided, use it\n if (viewDef.Component) {\n return viewDef.Component(converterArgs)\n }\n\n // If html is provided (as a function or string), use it\n // Note: Using span instead of div to avoid forcing block-level semantics\n if (viewDef.html) {\n const htmlContent =\n typeof viewDef.html === 'function' ? viewDef.html(converterArgs) : viewDef.html\n\n return <span dangerouslySetInnerHTML={{ __html: htmlContent }} />\n }\n\n return null\n }\n}\n\n/**\n * Converts a LexicalEditorNodeMap into JSXConverters\n */\nfunction nodeMapToConverters(nodeMap: LexicalEditorNodeMap): JSXConverters {\n const converters: JSXConverters = {}\n\n for (const [nodeType, value] of Object.entries(nodeMap)) {\n if (!value || typeof value !== 'object') {\n continue\n }\n\n // Handle special keys: blocks, inlineBlocks\n if (nodeType === 'blocks') {\n converters.blocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapValue\n if (viewDef.Component || viewDef.html) {\n converters.blocks[blockType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n continue\n }\n\n if (nodeType === 'inlineBlocks') {\n converters.inlineBlocks = {}\n for (const [blockType, _viewDef] of Object.entries(value)) {\n const viewDef = _viewDef as NodeMapValue\n if (viewDef.Component || viewDef.html) {\n converters.inlineBlocks[blockType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n continue\n }\n\n // Handle regular node types\n const viewDef = value as NodeMapValue\n\n if (viewDef.Component || viewDef.html) {\n converters[nodeType] = createConverterFromNodeMapValue(viewDef)\n }\n }\n\n return converters\n}\n\nexport type ConvertLexicalToJSXArgs = {\n converters: JSXConverters\n /**\n * Serialized editor state to render.\n */\n data: SerializedEditorState\n /**\n * If true, disables indentation globally. If an array, disables for specific node `type` values.\n */\n disableIndent?: boolean | string[]\n /**\n * If true, disables text alignment globally. If an array, disables for specific node `type` values.\n */\n disableTextAlign?: boolean | string[]\n /**\n * You can use the lexical editor node map or view map as converters. NodeMap converters will override converters passed\n * in the `converters` prop. If a LexicalEditorViewMap is provided, the `default` view will be used.\n */\n nodeMap?: LexicalEditorNodeMap\n}\n\nexport function convertLexicalToJSX({\n converters,\n data,\n disableIndent,\n disableTextAlign,\n nodeMap,\n}: ConvertLexicalToJSXArgs): React.ReactNode {\n if (hasText(data)) {\n // Merge nodeMap converters with existing converters\n // NodeMap converters override existing converters\n const mergedConverters = nodeMap\n ? {\n ...converters,\n ...nodeMapToConverters(nodeMap),\n }\n : converters\n\n return convertLexicalNodesToJSX({\n converters: mergedConverters,\n disableIndent,\n disableTextAlign,\n nodes: data.root.children,\n parent: data.root,\n })\n }\n return <></>\n}\n\nexport function convertLexicalNodesToJSX({\n converters,\n disableIndent,\n disableTextAlign,\n nodes,\n parent,\n}: {\n converters: JSXConverters\n disableIndent?: boolean | string[]\n disableTextAlign?: boolean | string[]\n nodes: SerializedLexicalNode[]\n parent: SerializedLexicalNodeWithParent\n}): React.ReactNode[] {\n const unknownConverter: JSXConverter<any> = converters.unknown as JSXConverter<any>\n\n const jsxArray: React.ReactNode[] = nodes.map((node, i) => {\n let converterForNode: JSXConverter<any> | undefined\n if (node.type === 'block') {\n converterForNode = converters?.blocks?.[(node as SerializedBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`,\n )\n }\n } else if (node.type === 'inlineBlock') {\n converterForNode =\n converters?.inlineBlocks?.[(node as SerializedInlineBlockNode)?.fields?.blockType]\n if (!converterForNode && !unknownConverter) {\n console.error(\n `Lexical => JSX converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`,\n )\n }\n } else {\n converterForNode = converters[node.type] as JSXConverter<any>\n }\n\n try {\n if (!converterForNode && unknownConverter) {\n converterForNode = unknownConverter\n }\n\n let reactNode: React.ReactNode\n if (converterForNode) {\n const converted =\n typeof converterForNode === 'function'\n ? converterForNode({\n childIndex: i,\n converters,\n node,\n nodesToJSX: (args) => {\n return convertLexicalNodesToJSX({\n converters: args.converters ?? converters,\n disableIndent: args.disableIndent ?? disableIndent,\n disableTextAlign: args.disableTextAlign ?? disableTextAlign,\n nodes: args.nodes,\n parent: args.parent ?? {\n ...node,\n parent,\n },\n })\n },\n parent,\n })\n : converterForNode\n reactNode = converted\n } else {\n reactNode = <span key={i}>unknown node</span>\n }\n\n const style: React.CSSProperties = {}\n\n // Check if disableTextAlign is not true and does not include node type\n if (\n !disableTextAlign &&\n (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type))\n ) {\n if ('format' in node && node.format) {\n switch (node.format) {\n case 'center':\n style.textAlign = 'center'\n break\n case 'end':\n style.textAlign = 'right'\n break\n case 'justify':\n style.textAlign = 'justify'\n break\n case 'left':\n //style.textAlign = 'left'\n // Do nothing, as left is the default\n break\n case 'right':\n style.textAlign = 'right'\n break\n case 'start':\n style.textAlign = 'left'\n break\n }\n }\n }\n\n if (\n !disableIndent &&\n (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))\n ) {\n if ('indent' in node && node.indent && node.type !== 'listitem') {\n // the unit should be px. Do not change it to rem, em, or something else.\n // The quantity should be 40px. Do not change it either.\n // See rationale in\n // https://github.com/payloadcms/payload/issues/13130#issuecomment-3058348085\n style.paddingInlineStart = `${Number(node.indent) * 40}px`\n }\n }\n\n if (React.isValidElement(reactNode)) {\n // Inject style into reactNode\n if (style.textAlign || style.paddingInlineStart) {\n const newStyle = {\n ...style,\n // @ts-expect-error type better later\n ...(reactNode?.props?.style ?? {}),\n // reactNode style comes after, thus a textAlign specified in the converter has priority over the one we inject here\n }\n\n return React.cloneElement(reactNode, {\n key: i,\n // @ts-expect-error type better later\n style: newStyle,\n })\n }\n return React.cloneElement(reactNode, {\n key: i,\n })\n }\n\n return reactNode\n } catch (error) {\n console.error('Error converting lexical node to JSX:', error, 'node:', node)\n return null\n }\n })\n\n return jsxArray.filter(Boolean)\n}\n", "import type {\n SerializedEditorState,\n SerializedLexicalNode,\n SerializedParagraphNode,\n SerializedTextNode,\n} from 'lexical'\n\n/**\n * This function checks if the editor state is empty (has any text). If the editor state has no nodes,\n * or only an empty paragraph node (no TextNode with length > 0), it returns false.\n * Otherwise, it returns true.\n */\nexport function hasText(\n value: null | SerializedEditorState<SerializedLexicalNode> | undefined,\n): value is SerializedEditorState<SerializedLexicalNode> {\n const hasChildren = !!value?.root?.children?.length\n if (!hasChildren) {\n return false\n }\n\n let hasOnlyEmptyParagraph = false\n if (value?.root?.children?.length === 1) {\n if (value?.root?.children[0]?.type === 'paragraph') {\n const paragraphNode = value?.root?.children[0] as SerializedParagraphNode\n\n if (!paragraphNode?.children || paragraphNode?.children?.length === 0) {\n hasOnlyEmptyParagraph = true\n } else if (paragraphNode?.children?.length === 1) {\n const paragraphNodeChild = paragraphNode?.children[0]\n if (paragraphNodeChild?.type === 'text') {\n if (!(paragraphNodeChild as SerializedTextNode | undefined)?.['text']?.length) {\n hasOnlyEmptyParagraph = true\n }\n }\n }\n }\n }\n\n if (hasOnlyEmptyParagraph) {\n return false\n }\n\n return true\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { RichTextPlugin } from './plugin/index.js'\n\nexport const DebugJsxConverterFeatureClient = createClientFeature({\n plugins: [\n {\n Component: RichTextPlugin,\n position: 'bottom',\n },\n ],\n})\n", "import type { StateValues } from './feature.server.js'\n\nconst tailwindColors = {\n amber: {\n '50': 'oklch(0.987 0.022 95.277)',\n '100': 'oklch(0.962 0.059 95.617)',\n '200': 'oklch(0.924 0.12 95.746)',\n '300': 'oklch(0.879 0.169 91.605)',\n '400': 'oklch(0.828 0.189 84.429)',\n '500': 'oklch(0.769 0.188 70.08)',\n '600': 'oklch(0.666 0.179 58.318)',\n '700': 'oklch(0.555 0.163 48.998)',\n '800': 'oklch(0.473 0.137 46.201)',\n '900': 'oklch(0.414 0.112 45.904)',\n '950': 'oklch(0.279 0.077 45.635)',\n },\n black: '#000',\n blue: {\n '50': 'oklch(0.97 0.014 254.604)',\n '100': 'oklch(0.932 0.032 255.585)',\n '200': 'oklch(0.882 0.059 254.128)',\n '300': 'oklch(0.809 0.105 251.813)',\n '400': 'oklch(0.707 0.165 254.624)',\n '500': 'oklch(0.623 0.214 259.815)',\n '600': 'oklch(0.546 0.245 262.881)',\n '700': 'oklch(0.488 0.243 264.376)',\n '800': 'oklch(0.424 0.199 265.638)',\n '900': 'oklch(0.379 0.146 265.522)',\n '950': 'oklch(0.282 0.091 267.935)',\n },\n current: 'currentColor',\n cyan: {\n '50': 'oklch(0.984 0.019 200.873)',\n '100': 'oklch(0.956 0.045 203.388)',\n '200': 'oklch(0.917 0.08 205.041)',\n '300': 'oklch(0.865 0.127 207.078)',\n '400': 'oklch(0.789 0.154 211.53)',\n '500': 'oklch(0.715 0.143 215.221)',\n '600': 'oklch(0.609 0.126 221.723)',\n '700': 'oklch(0.52 0.105 223.128)',\n '800': 'oklch(0.45 0.085 224.283)',\n '900': 'oklch(0.398 0.07 227.392)',\n '950': 'oklch(0.302 0.056 229.695)',\n },\n emerald: {\n '50': 'oklch(0.979 0.021 166.113)',\n '100': 'oklch(0.95 0.052 163.051)',\n '200': 'oklch(0.905 0.093 164.15)',\n '300': 'oklch(0.845 0.143 164.978)',\n '400': 'oklch(0.765 0.177 163.223)',\n '500': 'oklch(0.696 0.17 162.48)',\n '600': 'oklch(0.596 0.145 163.225)',\n '700': 'oklch(0.508 0.118 165.612)',\n '800': 'oklch(0.432 0.095 166.913)',\n '900': 'oklch(0.378 0.077 168.94)',\n '950': 'oklch(0.262 0.051 172.552)',\n },\n fuchsia: {\n '50': 'oklch(0.977 0.017 320.058)',\n '100': 'oklch(0.952 0.037 318.852)',\n '200': 'oklch(0.903 0.076 319.62)',\n '300': 'oklch(0.833 0.145 321.434)',\n '400': 'oklch(0.74 0.238 322.16)',\n '500': 'oklch(0.667 0.295 322.15)',\n '600': 'oklch(0.591 0.293 322.896)',\n '700': 'oklch(0.518 0.253 323.949)',\n '800': 'oklch(0.452 0.211 324.591)',\n '900': 'oklch(0.401 0.17 325.612)',\n '950': 'oklch(0.293 0.136 325.661)',\n },\n gray: {\n '50': 'oklch(0.985 0.002 247.839)',\n '100': 'oklch(0.967 0.003 264.542)',\n '200': 'oklch(0.928 0.006 264.531)',\n '300': 'oklch(0.872 0.01 258.338)',\n '400': 'oklch(0.707 0.022 261.325)',\n '500': 'oklch(0.551 0.027 264.364)',\n '600': 'oklch(0.446 0.03 256.802)',\n '700': 'oklch(0.373 0.034 259.733)',\n '800': 'oklch(0.278 0.033 256.848)',\n '900': 'oklch(0.21 0.034 264.665)',\n '950': 'oklch(0.13 0.028 261.692)',\n },\n green: {\n '50': 'oklch(0.982 0.018 155.826)',\n '100': 'oklch(0.962 0.044 156.743)',\n '200': 'oklch(0.925 0.084 155.995)',\n '300': 'oklch(0.871 0.15 154.449)',\n '400': 'oklch(0.792 0.209 151.711)',\n '500': 'oklch(0.723 0.219 149.579)',\n '600': 'oklch(0.627 0.194 149.214)',\n '700': 'oklch(0.527 0.154 150.069)',\n '800': 'oklch(0.448 0.119 151.328)',\n '900': 'oklch(0.393 0.095 152.535)',\n '950': 'oklch(0.266 0.065 152.934)',\n },\n indigo: {\n '50': 'oklch(0.962 0.018 272.314)',\n '100': 'oklch(0.93 0.034 272.788)',\n '200': 'oklch(0.87 0.065 274.039)',\n '300': 'oklch(0.785 0.115 274.713)',\n '400': 'oklch(0.673 0.182 276.935)',\n '500': 'oklch(0.585 0.233 277.117)',\n '600': 'oklch(0.511 0.262 276.966)',\n '700': 'oklch(0.457 0.24 277.023)',\n '800': 'oklch(0.398 0.195 277.366)',\n '900': 'oklch(0.359 0.144 278.697)',\n '950': 'oklch(0.257 0.09 281.288)',\n },\n inherit: 'inherit',\n lime: {\n '50': 'oklch(0.986 0.031 120.757)',\n '100': 'oklch(0.967 0.067 122.328)',\n '200': 'oklch(0.938 0.127 124.321)',\n '300': 'oklch(0.897 0.196 126.665)',\n '400': 'oklch(0.841 0.238 128.85)',\n '500': 'oklch(0.768 0.233 130.85)',\n '600': 'oklch(0.648 0.2 131.684)',\n '700': 'oklch(0.532 0.157 131.589)',\n '800': 'oklch(0.453 0.124 130.933)',\n '900': 'oklch(0.405 0.101 131.063)',\n '950': 'oklch(0.274 0.072 132.109)',\n },\n neutral: {\n '50': 'oklch(0.985 0 0)',\n '100': 'oklch(0.97 0 0)',\n '200': 'oklch(0.922 0 0)',\n '300': 'oklch(0.87 0 0)',\n '400': 'oklch(0.708 0 0)',\n '500': 'oklch(0.556 0 0)',\n '600': 'oklch(0.439 0 0)',\n '700': 'oklch(0.371 0 0)',\n '800': 'oklch(0.269 0 0)',\n '900': 'oklch(0.205 0 0)',\n '950': 'oklch(0.145 0 0)',\n },\n orange: {\n '50': 'oklch(0.98 0.016 73.684)',\n '100': 'oklch(0.954 0.038 75.164)',\n '200': 'oklch(0.901 0.076 70.697)',\n '300': 'oklch(0.837 0.128 66.29)',\n '400': 'oklch(0.75 0.183 55.934)',\n '500': 'oklch(0.705 0.213 47.604)',\n '600': 'oklch(0.646 0.222 41.116)',\n '700': 'oklch(0.553 0.195 38.402)',\n '800': 'oklch(0.47 0.157 37.304)',\n '900': 'oklch(0.408 0.123 38.172)',\n '950': 'oklch(0.266 0.079 36.259)',\n },\n pink: {\n '50': 'oklch(0.971 0.014 343.198)',\n '100': 'oklch(0.948 0.028 342.258)',\n '200': 'oklch(0.899 0.061 343.231)',\n '300': 'oklch(0.823 0.12 346.018)',\n '400': 'oklch(0.718 0.202 349.761)',\n '500': 'oklch(0.656 0.241 354.308)',\n '600': 'oklch(0.592 0.249 0.584)',\n '700': 'oklch(0.525 0.223 3.958)',\n '800': 'oklch(0.459 0.187 3.815)',\n '900': 'oklch(0.408 0.153 2.432)',\n '950': 'oklch(0.284 0.109 3.907)',\n },\n purple: {\n '50': 'oklch(0.977 0.014 308.299)',\n '100': 'oklch(0.946 0.033 307.174)',\n '200': 'oklch(0.902 0.063 306.703)',\n '300': 'oklch(0.827 0.119 306.383)',\n '400': 'oklch(0.714 0.203 305.504)',\n '500': 'oklch(0.627 0.265 303.9)',\n '600': 'oklch(0.558 0.288 302.321)',\n '700': 'oklch(0.496 0.265 301.924)',\n '800': 'oklch(0.438 0.218 303.724)',\n '900': 'oklch(0.381 0.176 304.987)',\n '950': 'oklch(0.291 0.149 302.717)',\n },\n red: {\n '50': 'oklch(0.971 0.013 17.38)',\n '100': 'oklch(0.936 0.032 17.717)',\n '200': 'oklch(0.885 0.062 18.334)',\n '300': 'oklch(0.808 0.114 19.571)',\n '400': 'oklch(0.704 0.191 22.216)',\n '500': 'oklch(0.637 0.237 25.331)',\n '600': 'oklch(0.577 0.245 27.325)',\n '700': 'oklch(0.505 0.213 27.518)',\n '800': 'oklch(0.444 0.177 26.899)',\n '900': 'oklch(0.396 0.141 25.723)',\n '950': 'oklch(0.258 0.092 26.042)',\n },\n rose: {\n '50': 'oklch(0.969 0.015 12.422)',\n '100': 'oklch(0.941 0.03 12.58)',\n '200': 'oklch(0.892 0.058 10.001)',\n '300': 'oklch(0.81 0.117 11.638)',\n '400': 'oklch(0.712 0.194 13.428)',\n '500': 'oklch(0.645 0.246 16.439)',\n '600': 'oklch(0.586 0.253 17.585)',\n '700': 'oklch(0.514 0.222 16.935)',\n '800': 'oklch(0.455 0.188 13.697)',\n '900': 'oklch(0.41 0.159 10.272)',\n '950': 'oklch(0.271 0.105 12.094)',\n },\n sky: {\n '50': 'oklch(0.977 0.013 236.62)',\n '100': 'oklch(0.951 0.026 236.824)',\n '200': 'oklch(0.901 0.058 230.902)',\n '300': 'oklch(0.828 0.111 230.318)',\n '400': 'oklch(0.746 0.16 232.661)',\n '500': 'oklch(0.685 0.169 237.323)',\n '600': 'oklch(0.588 0.158 241.966)',\n '700': 'oklch(0.5 0.134 242.749)',\n '800': 'oklch(0.443 0.11 240.79)',\n '900': 'oklch(0.391 0.09 240.876)',\n '950': 'oklch(0.293 0.066 243.157)',\n },\n slate: {\n '50': 'oklch(0.984 0.003 247.858)',\n '100': 'oklch(0.968 0.007 247.896)',\n '200': 'oklch(0.929 0.013 255.508)',\n '300': 'oklch(0.869 0.022 252.894)',\n '400': 'oklch(0.704 0.04 256.788)',\n '500': 'oklch(0.554 0.046 257.417)',\n '600': 'oklch(0.446 0.043 257.281)',\n '700': 'oklch(0.372 0.044 257.287)',\n '800': 'oklch(0.279 0.041 260.031)',\n '900': 'oklch(0.208 0.042 265.755)',\n '950': 'oklch(0.129 0.042 264.695)',\n },\n stone: {\n '50': 'oklch(0.985 0.001 106.423)',\n '100': 'oklch(0.97 0.001 106.424)',\n '200': 'oklch(0.923 0.003 48.717)',\n '300': 'oklch(0.869 0.005 56.366)',\n '400': 'oklch(0.709 0.01 56.259)',\n '500': 'oklch(0.553 0.013 58.071)',\n '600': 'oklch(0.444 0.011 73.639)',\n '700': 'oklch(0.374 0.01 67.558)',\n '800': 'oklch(0.268 0.007 34.298)',\n '900': 'oklch(0.216 0.006 56.043)',\n '950': 'oklch(0.147 0.004 49.25)',\n },\n teal: {\n '50': 'oklch(0.984 0.014 180.72)',\n '100': 'oklch(0.953 0.051 180.801)',\n '200': 'oklch(0.91 0.096 180.426)',\n '300': 'oklch(0.855 0.138 181.071)',\n '400': 'oklch(0.777 0.152 181.912)',\n '500': 'oklch(0.704 0.14 182.503)',\n '600': 'oklch(0.6 0.118 184.704)',\n '700': 'oklch(0.511 0.096 186.391)',\n '800': 'oklch(0.437 0.078 188.216)',\n '900': 'oklch(0.386 0.063 188.416)',\n '950': 'oklch(0.277 0.046 192.524)',\n },\n transparent: 'transparent',\n violet: {\n '50': 'oklch(0.969 0.016 293.756)',\n '100': 'oklch(0.943 0.029 294.588)',\n '200': 'oklch(0.894 0.057 293.283)',\n '300': 'oklch(0.811 0.111 293.571)',\n '400': 'oklch(0.702 0.183 293.541)',\n '500': 'oklch(0.606 0.25 292.717)',\n '600': 'oklch(0.541 0.281 293.009)',\n '700': 'oklch(0.491 0.27 292.581)',\n '800': 'oklch(0.432 0.232 292.759)',\n '900': 'oklch(0.38 0.189 293.745)',\n '950': 'oklch(0.283 0.141 291.089)',\n },\n white: '#fff',\n yellow: {\n '50': 'oklch(0.987 0.026 102.212)',\n '100': 'oklch(0.973 0.071 103.193)',\n '200': 'oklch(0.945 0.129 101.54)',\n '300': 'oklch(0.905 0.182 98.111)',\n '400': 'oklch(0.852 0.199 91.936)',\n '500': 'oklch(0.795 0.184 86.047)',\n '600': 'oklch(0.681 0.162 75.834)',\n '700': 'oklch(0.554 0.135 66.442)',\n '800': 'oklch(0.476 0.114 61.907)',\n '900': 'oklch(0.421 0.095 57.708)',\n '950': 'oklch(0.286 0.066 53.813)',\n },\n zinc: {\n '50': 'oklch(0.985 0 0)',\n '100': 'oklch(0.967 0.001 286.375)',\n '200': 'oklch(0.92 0.004 286.32)',\n '300': 'oklch(0.871 0.006 286.286)',\n '400': 'oklch(0.705 0.015 286.067)',\n '500': 'oklch(0.552 0.016 285.938)',\n '600': 'oklch(0.442 0.017 285.786)',\n '700': 'oklch(0.37 0.013 285.805)',\n '800': 'oklch(0.274 0.006 286.033)',\n '900': 'oklch(0.21 0.006 285.885)',\n '950': 'oklch(0.141 0.005 285.823)',\n },\n}\n\n// prettier-ignore\n/* eslint-disable perfectionist/sort-objects */\nexport const defaultColors = {\n text: {\n 'text-red': { css: { 'color': `light-dark(${tailwindColors.red[600]}, ${tailwindColors.red[400]})`, }, label: 'Red' },\n 'text-orange': { css: { 'color': `light-dark(${tailwindColors.orange[600]}, ${tailwindColors.orange[400]})`, }, label: 'Orange' },\n 'text-yellow': { css: { 'color': `light-dark(${tailwindColors.yellow[700]}, ${tailwindColors.yellow[300]})`, }, label: 'Yellow' },\n 'text-green': { css: { 'color': `light-dark(${tailwindColors.green[700]}, ${tailwindColors.green[400]})`, }, label: 'Green' },\n 'text-blue': { css: { 'color': `light-dark(${tailwindColors.blue[600]}, ${tailwindColors.blue[400]})`, }, label: 'Blue' },\n 'text-purple': { css: { 'color': `light-dark(${tailwindColors.purple[600]}, ${tailwindColors.purple[400]})`, }, label: 'Purple' },\n 'text-pink': { css: { 'color': `light-dark(${tailwindColors.pink[600]}, ${tailwindColors.pink[400]})`, }, label: 'Pink' },\n } satisfies StateValues,\n background: {\n 'bg-red': { css: { 'background-color': `light-dark(${tailwindColors.red[400]}, ${tailwindColors.red[600]})`, }, label: 'Red' },\n 'bg-orange': { css: { 'background-color': `light-dark(${tailwindColors.orange[400]}, ${tailwindColors.orange[600]})`, }, label: 'Orange' },\n 'bg-yellow': { css: { 'background-color': `light-dark(${tailwindColors.yellow[300]}, ${tailwindColors.yellow[700]})`, }, label: 'Yellow' },\n 'bg-green': { css: { 'background-color': `light-dark(${tailwindColors.green[400]}, ${tailwindColors.green[700]})`, }, label: 'Green' },\n 'bg-blue': { css: { 'background-color': `light-dark(${tailwindColors.blue[400]}, ${tailwindColors.blue[600]})`, }, label: 'Blue' },\n 'bg-purple': { css: { 'background-color': `light-dark(${tailwindColors.purple[400]}, ${tailwindColors.purple[600]})`, }, label: 'Purple' },\n 'bg-pink': { css: { 'background-color': `light-dark(${tailwindColors.pink[400]}, ${tailwindColors.pink[600]})`, }, label: 'Pink' },\n } satisfies StateValues\n }\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport type { RelationshipFeatureProps } from '../server/index.js'\n\nimport { RelationshipIcon } from '../../../lexical/ui/icons/Relationship/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND } from './drawer/commands.js'\nimport { $isRelationshipNode, RelationshipNode } from './nodes/RelationshipNode.js'\nimport { RelationshipPlugin } from './plugins/index.js'\n\nexport const RelationshipFeatureClient = createClientFeature<RelationshipFeatureProps>({\n nodes: [RelationshipNode],\n plugins: [\n {\n Component: RelationshipPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: RelationshipIcon,\n key: 'relationship',\n keywords: ['relationship', 'relation', 'rel'],\n label: ({ i18n }) => {\n return i18n.t('lexical:relationship:label')\n },\n onSelect: ({ editor }) => {\n // dispatch INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND\n editor.dispatchCommand(INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: RelationshipIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isRelationshipNode(firstNode)\n },\n key: 'relationship',\n label: ({ i18n }) => {\n return i18n.t('lexical:relationship:label')\n },\n onSelect: ({ editor }) => {\n // dispatch INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND\n editor.dispatchCommand(INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const RelationshipIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_4397_10817)\">\n <path\n d=\"M7.75 12.25L15.25 4.75M15.25 4.75H11.5M15.25 4.75V8.5M13 11.5V13.75C13 14.5784 12.3284 15.25 11.5 15.25H6.25C5.42157 15.25 4.75 14.5784 4.75 13.75V8.5C4.75 7.67157 5.42157 7 6.25 7H8.5\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_4397_10817\">\n <rect fill=\"currentColor\" height=\"12\" transform=\"translate(4 4)\" width=\"12\" />\n </clipPath>\n </defs>\n </svg>\n)\n", "'use client'\nimport type { JSX } from 'react'\n\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type EditorConfig,\n type LexicalEditor,\n type LexicalNode,\n} from 'lexical'\nimport * as React from 'react'\n\nimport type {\n RelationshipData,\n SerializedRelationshipNode,\n} from '../../server/nodes/RelationshipNode.js'\n\nimport { RelationshipServerNode } from '../../server/nodes/RelationshipNode.js'\n\nconst RelationshipComponent = React.lazy(() =>\n import('../components/RelationshipComponent.js').then((module) => ({\n default: module.RelationshipComponent,\n })),\n)\n\nfunction $relationshipElementToNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipNode extends RelationshipServerNode {\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return (\n <RelationshipComponent\n className={config.theme.relationship ?? 'LexicalEditorTheme__relationship'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return super.exportJSON()\n }\n}\n\nexport function $createRelationshipNode(data: RelationshipData): RelationshipNode {\n return $applyNodeReplacement(\n new RelationshipNode({\n data,\n }),\n )\n}\n\nexport function $isRelationshipNode(\n node: LexicalNode | null | RelationshipNode | undefined,\n): node is RelationshipNode {\n return node instanceof RelationshipNode\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type { CollectionSlug, DataFromCollectionSlug } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport {\n $applyNodeReplacement,\n type DOMConversionMap,\n type DOMConversionOutput,\n type DOMExportOutput,\n type EditorConfig,\n type ElementFormatType,\n type LexicalEditor,\n type LexicalNode,\n type NodeKey,\n} from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nexport type RelationshipData = {\n [TCollectionSlug in CollectionSlug]: {\n relationTo: TCollectionSlug\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\nexport type SerializedRelationshipNode = RelationshipData &\n StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'relationship'>\n\nfunction $relationshipElementToServerNode(domNode: HTMLDivElement): DOMConversionOutput | null {\n const id = domNode.getAttribute('data-lexical-relationship-id')\n const relationTo = domNode.getAttribute('data-lexical-relationship-relationTo')\n\n if (id != null && relationTo != null) {\n const node = $createServerRelationshipNode({\n relationTo,\n value: id,\n })\n return { node }\n }\n return null\n}\n\nexport class RelationshipServerNode extends DecoratorBlockNode {\n __data: RelationshipData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: RelationshipData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: RelationshipServerNode): RelationshipServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'relationship'\n }\n\n static override importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {\n div: (domNode: HTMLDivElement) => {\n if (\n !domNode.hasAttribute('data-lexical-relationship-relationTo') ||\n !domNode.hasAttribute('data-lexical-relationship-id')\n ) {\n return null\n }\n return {\n conversion: $relationshipElementToServerNode,\n priority: 2,\n }\n },\n }\n }\n\n static override importJSON(serializedNode: SerializedRelationshipNode): RelationshipServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n\n const importedData: RelationshipData = {\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n const node = $createServerRelationshipNode(importedData)\n node.setFormat(serializedNode.format)\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.relationship)\n return element\n }\n\n override decorate(_editor: LexicalEditor, _config: EditorConfig): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('div')\n element.setAttribute(\n 'data-lexical-relationship-id',\n String(typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value),\n )\n element.setAttribute('data-lexical-relationship-relationTo', this.__data?.relationTo)\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n override exportJSON(): SerializedRelationshipNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'relationship',\n version: 2,\n }\n }\n\n getData(): RelationshipData {\n return this.getLatest().__data\n }\n\n override getTextContent(): string {\n return `${this.__data?.relationTo} relation to ${typeof this.__data?.value === 'object' ? this.__data?.value?.id : this.__data?.value}`\n }\n\n setData(data: RelationshipData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n}\n\nexport function $createServerRelationshipNode(data: RelationshipData): RelationshipServerNode {\n return $applyNodeReplacement(\n new RelationshipServerNode({\n data,\n }),\n )\n}\n\nexport function $isServerRelationshipNode(\n node: LexicalNode | null | RelationshipServerNode | undefined,\n): node is RelationshipServerNode {\n return node instanceof RelationshipServerNode\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $insertNodeToNearestRoot } from '@lexical/utils'\nimport {\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n COMMAND_PRIORITY_EDITOR,\n createCommand,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { RelationshipFeatureProps } from '../../server/index.js'\nimport type { RelationshipData } from '../../server/nodes/RelationshipNode.js'\n\nimport { RelationshipDrawer } from '../drawer/index.js'\nimport { $createRelationshipNode, RelationshipNode } from '../nodes/RelationshipNode.js'\nimport { useEnabledRelationships } from '../utils/useEnabledRelationships.js'\n\nexport const INSERT_RELATIONSHIP_COMMAND: LexicalCommand<RelationshipData> = createCommand(\n 'INSERT_RELATIONSHIP_COMMAND',\n)\n\nexport const RelationshipPlugin: PluginComponent<RelationshipFeatureProps> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n collectionSlugsBlacklist: clientProps?.disabledCollections,\n collectionSlugsWhitelist: clientProps?.enabledCollections,\n })\n\n useEffect(() => {\n if (!editor.hasNodes([RelationshipNode])) {\n throw new Error('RelationshipPlugin: RelationshipNode not registered on editor')\n }\n\n return editor.registerCommand<RelationshipData>(\n INSERT_RELATIONSHIP_COMMAND,\n (payload) => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const relationshipNode = $createRelationshipNode(payload)\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert relationship node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(relationshipNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return <RelationshipDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\nimport type { CollectionSlug } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { type ListDrawerProps, toast } from '@payloadcms/ui'\nimport { $getNodeByKey, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useLexicalListDrawer } from '../../../../utilities/fieldsDrawer/useLexicalListDrawer.js'\nimport { $createRelationshipNode } from '../nodes/RelationshipNode.js'\nimport { INSERT_RELATIONSHIP_COMMAND } from '../plugins/index.js'\nimport { INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND } from './commands.js'\n\nconst insertRelationship = ({\n editor,\n relationTo,\n replaceNodeKey,\n value,\n}: {\n editor: LexicalEditor\n relationTo: string\n replaceNodeKey: null | string\n value: number | string\n}) => {\n if (!replaceNodeKey) {\n editor.dispatchCommand(INSERT_RELATIONSHIP_COMMAND, {\n relationTo,\n value,\n })\n } else {\n editor.update(() => {\n const node = $getNodeByKey(replaceNodeKey)\n if (node) {\n node.replace($createRelationshipNode({ relationTo, value }))\n }\n })\n }\n}\n\ntype Props = {\n enabledCollectionSlugs: CollectionSlug[]\n}\n\nconst RelationshipDrawerComponent: React.FC<Props> = ({ enabledCollectionSlugs }) => {\n const [editor] = useLexicalComposerContext()\n\n const [replaceNodeKey, setReplaceNodeKey] = useState<null | string>(null)\n\n const { closeListDrawer, ListDrawer, openListDrawer } = useLexicalListDrawer({\n collectionSlugs: enabledCollectionSlugs,\n selectedCollection: enabledCollectionSlugs?.[0],\n })\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND,\n (payload) => {\n setReplaceNodeKey(payload?.replace ? payload?.replace.nodeKey : null)\n openListDrawer()\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor, openListDrawer])\n\n const onSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n ({ collectionSlug, doc }) => {\n insertRelationship({\n editor,\n relationTo: collectionSlug,\n replaceNodeKey,\n value: doc.id,\n })\n closeListDrawer()\n },\n [editor, closeListDrawer, replaceNodeKey],\n )\n\n return <ListDrawer onSelect={onSelect} />\n}\n\nconst RelationshipDrawerComponentFallback: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND,\n () => {\n toast.error('No relationship collections enabled')\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n\nexport const RelationshipDrawer = ({ enabledCollectionSlugs }: Props): React.ReactNode => {\n if (!enabledCollectionSlugs?.length) {\n return <RelationshipDrawerComponentFallback />\n }\n\n return <RelationshipDrawerComponent enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { UseListDrawer } from '@payloadcms/ui'\nimport type { BaseSelection } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useListDrawer, useModal } from '@payloadcms/ui'\nimport {\n $getNodeByKey,\n $getPreviousSelection,\n $getRoot,\n $getSelection,\n $isRangeSelection,\n $setSelection,\n} from 'lexical'\nimport { useCallback, useEffect, useState } from 'react'\n\n/**\n *\n * Wrapper around useListDrawer that restores and saves selection state (cursor position) when opening and closing the drawer.\n * By default, the lexical cursor position may be lost when opening a drawer and clicking somewhere on that drawer.\n */\nexport const useLexicalListDrawer = (\n args: Parameters<UseListDrawer>[0],\n): {\n closeListDrawer: () => void\n isListDrawerOpen: boolean\n ListDrawer: ReturnType<UseListDrawer>[0]\n listDrawerSlug: string\n ListDrawerToggler: ReturnType<UseListDrawer>[1]\n openListDrawer: (selection?: BaseSelection) => void\n} => {\n const [editor] = useLexicalComposerContext()\n const [selectionState, setSelectionState] = useState<BaseSelection | null>(null)\n const [wasOpen, setWasOpen] = useState<boolean>(false)\n\n const [\n BaseListDrawer,\n BaseListDrawerToggler,\n {\n closeDrawer: baseCloseDrawer,\n drawerSlug: listDrawerSlug,\n isDrawerOpen,\n openDrawer: baseOpenDrawer,\n },\n ] = useListDrawer(args)\n const { modalState } = useModal()\n\n const $storeSelection = useCallback(() => {\n // editor.read() causes an error here when creating a new upload node from the slash menu. It seems like we can omit it here though, as all\n // invocations of that functions are wrapped in editor.read() or editor.update() somewhere in the call stack.\n const selection = $getSelection() ?? $getPreviousSelection()\n setSelectionState(selection)\n }, [])\n\n const restoreSelection = useCallback(() => {\n if (selectionState) {\n editor.update(\n () => {\n if ($isRangeSelection(selectionState)) {\n const { anchor, focus } = selectionState\n if ($getNodeByKey(anchor.key) && $getNodeByKey(focus.key)) {\n $setSelection(selectionState.clone())\n }\n } else {\n // not ideal, but better than losing the selection. Try to set the selection\n // in a valid place if you remove selected nodes!\n $getRoot().selectEnd()\n }\n },\n { discrete: true, skipTransforms: true },\n )\n }\n }, [editor, selectionState])\n\n const closeListDrawer = () => {\n //restoreSelection() // Should already be stored by the useEffect below\n baseCloseDrawer()\n }\n\n // We need to handle drawer closing via a useEffect, as toggleDrawer / closeDrawer will not be triggered if the drawer\n // is closed by clicking outside of the drawer. This useEffect will handle everything.\n useEffect(() => {\n if (!wasOpen) {\n return\n }\n\n const thisModalState = modalState[listDrawerSlug]\n // Exists in modalState (thus has opened at least once before) and is closed\n if (thisModalState && !thisModalState?.isOpen) {\n setWasOpen(false)\n setTimeout(() => {\n restoreSelection()\n }, 1)\n }\n }, [modalState, listDrawerSlug, restoreSelection, wasOpen])\n\n return {\n closeListDrawer,\n isListDrawerOpen: isDrawerOpen,\n ListDrawer: BaseListDrawer,\n listDrawerSlug,\n ListDrawerToggler: (props) => (\n <BaseListDrawerToggler\n {...props}\n onClick={() => {\n $storeSelection()\n }}\n />\n ),\n openListDrawer: () => {\n $storeSelection()\n baseOpenDrawer()\n setWasOpen(true)\n },\n }\n}\n", "'use client'\nimport type { ClientCollectionConfig, CollectionSlug } from 'payload'\n\nimport { useConfig, useEntityVisibility } from '@payloadcms/ui'\nimport * as React from 'react'\n\ntype UseEnabledRelationshipsOptions = {\n collectionSlugsBlacklist?: string[]\n collectionSlugsWhitelist?: string[]\n uploads?: boolean\n}\n\ntype UseEnabledRelationshipsResult = {\n enabledCollections: ClientCollectionConfig[]\n enabledCollectionSlugs: CollectionSlug[]\n}\n\nexport const useEnabledRelationships = (\n options?: UseEnabledRelationshipsOptions,\n): UseEnabledRelationshipsResult => {\n const { collectionSlugsBlacklist, collectionSlugsWhitelist, uploads = false } = options || {}\n const {\n config: { collections },\n } = useConfig()\n const { visibleEntities } = useEntityVisibility()\n\n const result = React.useMemo(() => {\n const enabledCollectionSlugs: string[] = []\n const enabledCollections: ClientCollectionConfig[] = []\n const whitelistSet = collectionSlugsWhitelist ? new Set(collectionSlugsWhitelist) : null\n const blacklistSet = collectionSlugsBlacklist ? new Set(collectionSlugsBlacklist) : null\n\n for (const collection of collections) {\n const {\n slug,\n admin: { enableRichTextRelationship },\n upload,\n } = collection\n\n // Check visibility\n if (!visibleEntities?.collections.includes(slug)) {\n continue\n }\n\n // Check rich text relationship and upload settings\n if (uploads) {\n if (!enableRichTextRelationship || !upload) {\n continue\n }\n } else {\n if (upload || !enableRichTextRelationship) {\n continue\n }\n }\n\n // Check whitelist (if provided, only include slugs in the whitelist)\n if (whitelistSet && !whitelistSet.has(slug)) {\n continue\n }\n\n // Check blacklist (if provided, exclude slugs in the blacklist)\n if (blacklistSet && blacklistSet.has(slug)) {\n continue\n }\n\n enabledCollectionSlugs.push(slug)\n enabledCollections.push(collection)\n }\n\n return { enabledCollections, enabledCollectionSlugs }\n }, [collections, visibleEntities, uploads, collectionSlugsWhitelist, collectionSlugsBlacklist])\n\n return result\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { useScrollInfo, useThrottledEffect, useTranslation } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport type { EditorConfigContextType } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport type { SanitizedClientEditorConfig } from '../../../../../lexical/config/types.js'\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\nimport type { FixedToolbarFeatureProps } from '../../server/index.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport './index.scss'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n editorConfig,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const [dropdownLabel, setDropdownLabel] = React.useState<string | undefined>(undefined)\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>(undefined)\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = React.useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n setDropdownLabel(undefined)\n } else {\n setDropdownIcon(undefined)\n setDropdownLabel(undefined)\n }\n return\n }\n const item = activeItems[0]!\n\n let label = item.key\n if (item.label) {\n label =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (label.length > 25) {\n label = label.substring(0, 25) + '...'\n }\n if (activeItems.length === 1) {\n setDropdownLabel(label)\n setDropdownIcon(() => item.ChildComponent)\n } else {\n setDropdownLabel(\n i18n.t('lexical:general:toolbarItemsActive', { count: activeItems.length }),\n )\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }\n },\n [group, i18n, featureClientSchemaMap, schemaPath],\n )\n\n return (\n <div\n className={`fixed-toolbar__group fixed-toolbar__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarFixed?.groups.length - 1 && <div className=\"divider\" />}\n </div>\n )\n}\n\nfunction FixedToolbar({\n anchorElem,\n clientProps,\n editor,\n editorConfig,\n parentWithFixedToolbar,\n}: {\n anchorElem: HTMLElement\n clientProps?: FixedToolbarFeatureProps\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n parentWithFixedToolbar: EditorConfigContextType | false\n}): React.ReactNode {\n const currentToolbarRef = React.useRef<HTMLDivElement>(null)\n const isEditable = useLexicalEditable()\n\n const { y } = useScrollInfo()\n\n // Memoize the parent toolbar element\n const parentToolbarElem = useMemo(() => {\n if (!parentWithFixedToolbar || clientProps?.disableIfParentHasFixedToolbar) {\n return null\n }\n\n const parentEditorElem = parentWithFixedToolbar.editorContainerRef.current\n let sibling = parentEditorElem.previousElementSibling\n while (sibling) {\n if (sibling.classList.contains('fixed-toolbar')) {\n return sibling\n }\n sibling = sibling.previousElementSibling\n }\n return null\n }, [clientProps?.disableIfParentHasFixedToolbar, parentWithFixedToolbar])\n\n useThrottledEffect(\n () => {\n if (!parentToolbarElem) {\n // this also checks for clientProps?.disableIfParentHasFixedToolbar indirectly, see the parentToolbarElem useMemo\n return\n }\n const currentToolbarElem = currentToolbarRef.current\n if (!currentToolbarElem) {\n return\n }\n\n const currentRect = currentToolbarElem.getBoundingClientRect()\n const parentRect = parentToolbarElem.getBoundingClientRect()\n\n // we only need to check for vertical overlap\n const overlapping = !(\n currentRect.bottom < parentRect.top || currentRect.top > parentRect.bottom\n )\n\n if (overlapping) {\n currentToolbarElem.classList.remove('fixed-toolbar')\n currentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--overlapping')\n parentToolbarElem.classList.remove('fixed-toolbar')\n parentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--hide')\n } else {\n if (!currentToolbarElem.classList.contains('fixed-toolbar--overlapping')) {\n return\n }\n currentToolbarElem.classList.remove('fixed-toolbar--overlapping')\n currentToolbarElem.classList.add('fixed-toolbar')\n parentToolbarElem.classList.remove('fixed-toolbar--hide')\n parentToolbarElem.classList.add('fixed-toolbar')\n }\n },\n 50,\n [currentToolbarRef, parentToolbarElem, y],\n )\n\n return (\n <div\n className=\"fixed-toolbar\"\n onFocus={(event) => {\n // Prevent other focus events being triggered. Otherwise, if this was to be clicked while in a child editor,\n // the parent editor will be focused, and the child editor will lose focus.\n event.stopPropagation()\n }}\n ref={currentToolbarRef}\n >\n {isEditable && (\n <React.Fragment>\n {editorConfig?.features &&\n editorConfig.features?.toolbarFixed?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n editorConfig={editorConfig}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nconst getParentEditorWithFixedToolbar = (\n editorConfigContext: EditorConfigContextType,\n): EditorConfigContextType | false => {\n if (editorConfigContext.parentEditor?.editorConfig) {\n if (editorConfigContext.parentEditor?.editorConfig.resolvedFeatureMap.has('toolbarFixed')) {\n return editorConfigContext.parentEditor\n } else {\n if (editorConfigContext.parentEditor) {\n return getParentEditorWithFixedToolbar(editorConfigContext.parentEditor)\n }\n }\n }\n return false\n}\n\nexport const FixedToolbarPlugin: PluginComponent<FixedToolbarFeatureProps> = ({ clientProps }) => {\n const [currentEditor] = useLexicalComposerContext()\n const editorConfigContext = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n if (!isEditable) {\n return null\n }\n\n const { editorConfig: currentEditorConfig } = editorConfigContext\n\n const editor = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editor || currentEditor\n : currentEditor\n\n const editorConfig = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editorConfig || currentEditorConfig\n : currentEditorConfig\n\n const parentWithFixedToolbar = getParentEditorWithFixedToolbar(editorConfigContext)\n\n if (clientProps?.disableIfParentHasFixedToolbar) {\n if (parentWithFixedToolbar) {\n return null\n }\n }\n\n if (!editorConfig?.features?.toolbarFixed?.groups?.length) {\n return null\n }\n\n return (\n <FixedToolbar\n anchorElem={document.body}\n editor={editor}\n editorConfig={editorConfig}\n parentWithFixedToolbar={parentWithFixedToolbar}\n />\n )\n}\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { mergeRegister } from '@lexical/utils'\nimport { $addUpdateTag, $getSelection } from 'lexical'\nimport React, { useCallback, useDeferredValue, useEffect, useMemo, useState } from 'react'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { useRunDeprioritized } from '../../../../utilities/useRunDeprioritized.js'\n\nconst baseClass = 'toolbar-popup__button'\n\nexport const ToolbarButton = ({\n children,\n editor,\n item,\n}: {\n children: React.JSX.Element\n editor: LexicalEditor\n item: ToolbarGroupItem\n}) => {\n const [_state, setState] = useState({ active: false, enabled: true })\n const deferredState = useDeferredValue(_state)\n\n const editorConfigContext = useEditorConfigContext()\n\n const className = useMemo(() => {\n return [\n baseClass,\n !deferredState.enabled ? 'disabled' : '',\n deferredState.active ? 'active' : '',\n item.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [deferredState, item.key])\n const updateStates = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!selection) {\n return\n }\n const newActive = item.isActive\n ? item.isActive({ editor, editorConfigContext, selection })\n : false\n\n const newEnabled = item.isEnabled\n ? item.isEnabled({ editor, editorConfigContext, selection })\n : true\n\n setState((prev) => {\n if (prev.active === newActive && prev.enabled === newEnabled) {\n return prev\n }\n return { active: newActive, enabled: newEnabled }\n })\n })\n }, [editor, editorConfigContext, item])\n\n const runDeprioritized = useRunDeprioritized()\n\n useEffect(() => {\n // Run on mount\n void runDeprioritized(updateStates)\n\n const listener = () => runDeprioritized(updateStates)\n\n const cleanup = mergeRegister(editor.registerUpdateListener(listener))\n document.addEventListener('mouseup', listener)\n\n return () => {\n cleanup()\n document.removeEventListener('mouseup', listener)\n }\n }, [editor, runDeprioritized, updateStates])\n\n const handleClick = useCallback(() => {\n if (!_state.enabled) {\n return\n }\n\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: _state.active,\n })\n })\n }, [editor, item, _state])\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }, [])\n\n return (\n <button\n className={className}\n data-button-key={item.key}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n", "'use client'\nimport React, { useCallback, useDeferredValue, useEffect, useMemo } from 'react'\n\nconst baseClass = 'toolbar-popup__dropdown'\n\nimport type { LexicalEditor } from 'lexical'\n\nimport { mergeRegister } from '@lexical/utils'\nimport { useTranslation } from '@payloadcms/ui'\nimport { $getSelection } from 'lexical'\n\nimport type { ToolbarDropdownGroup, ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useRunDeprioritized } from '../../../../utilities/useRunDeprioritized.js'\nimport './index.scss'\nimport { DropDown, DropDownItem } from './DropDown.js'\n\nconst ToolbarItem = ({\n active,\n anchorElem,\n editor,\n enabled,\n item,\n}: {\n active?: boolean\n anchorElem: HTMLElement\n editor: LexicalEditor\n enabled?: boolean\n item: ToolbarGroupItem\n}) => {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component\n active={active}\n anchorElem={anchorElem}\n editor={editor}\n enabled={enabled}\n item={item}\n key={item.key}\n />\n )\n )\n }\n\n let title = item.key\n let croppedTitle = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n croppedTitle = title.substring(0, 25) + '...'\n } else {\n croppedTitle = title\n }\n\n return (\n <DropDownItem\n active={active}\n editor={editor}\n enabled={enabled}\n Icon={item?.ChildComponent ? <item.ChildComponent /> : undefined}\n item={item}\n itemKey={item.key}\n key={item.key}\n tooltip={title}\n >\n <span className=\"text\">{croppedTitle}</span>\n </DropDownItem>\n )\n}\n\nconst MemoToolbarItem = React.memo(ToolbarItem)\n\nexport const ToolbarDropdown = ({\n anchorElem,\n classNames,\n editor,\n group,\n Icon,\n itemsContainerClassNames,\n label,\n maxActiveItems,\n onActiveChange,\n}: {\n anchorElem: HTMLElement\n classNames?: string[]\n editor: LexicalEditor\n group: ToolbarDropdownGroup\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n /**\n * Maximum number of active items allowed. This is a performance optimization to prevent\n * unnecessary item active checks when the maximum number of active items is reached.\n */\n maxActiveItems?: number\n onActiveChange?: ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => void\n}) => {\n const [toolbarState, setToolbarState] = React.useState<{\n activeItemKeys: string[]\n enabledGroup: boolean\n enabledItemKeys: string[]\n }>({\n activeItemKeys: [],\n enabledGroup: true,\n enabledItemKeys: [],\n })\n const deferredToolbarState = useDeferredValue(toolbarState)\n\n const editorConfigContext = useEditorConfigContext()\n const { items, key: groupKey } = group\n\n const runDeprioritized = useRunDeprioritized()\n\n const updateStates = useCallback(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!selection) {\n return\n }\n\n const _activeItemKeys: string[] = []\n const _activeItems: ToolbarGroupItem[] = []\n const _enabledItemKeys: string[] = []\n\n for (const item of items) {\n if (item.isActive && (!maxActiveItems || _activeItemKeys.length < maxActiveItems)) {\n const isActive = item.isActive({ editor, editorConfigContext, selection })\n if (isActive) {\n _activeItemKeys.push(item.key)\n _activeItems.push(item)\n }\n }\n if (item.isEnabled) {\n const isEnabled = item.isEnabled({ editor, editorConfigContext, selection })\n if (isEnabled) {\n _enabledItemKeys.push(item.key)\n }\n } else {\n _enabledItemKeys.push(item.key)\n }\n }\n\n setToolbarState({\n activeItemKeys: _activeItemKeys,\n enabledGroup: group.isEnabled\n ? group.isEnabled({ editor, editorConfigContext, selection })\n : true,\n enabledItemKeys: _enabledItemKeys,\n })\n\n if (onActiveChange) {\n onActiveChange({ activeItems: _activeItems })\n }\n })\n }, [editor, editorConfigContext, group, items, maxActiveItems, onActiveChange])\n\n useEffect(() => {\n // Run on mount in order to update states when dropdown is opened\n void runDeprioritized(updateStates)\n\n return mergeRegister(\n editor.registerUpdateListener(async () => {\n await runDeprioritized(updateStates)\n }),\n )\n }, [editor, runDeprioritized, updateStates])\n\n const renderedItems = useMemo(() => {\n return items?.length\n ? items.map((item) => (\n <MemoToolbarItem\n active={deferredToolbarState.activeItemKeys.includes(item.key)}\n anchorElem={anchorElem}\n editor={editor}\n enabled={deferredToolbarState.enabledItemKeys.includes(item.key)}\n item={item}\n key={item.key}\n />\n ))\n : null\n }, [items, deferredToolbarState, anchorElem, editor])\n\n return (\n <DropDown\n buttonAriaLabel={`${groupKey} dropdown`}\n buttonClassName={[baseClass, `${baseClass}-${groupKey}`, ...(classNames || [])]\n .filter(Boolean)\n .join(' ')}\n disabled={!deferredToolbarState.enabledGroup}\n dropdownKey={groupKey}\n Icon={Icon}\n itemsContainerClassNames={[`${baseClass}-items`, ...(itemsContainerClassNames || [])]}\n key={groupKey}\n label={label}\n >\n {renderedItems}\n </DropDown>\n )\n}\n", "'use client'\nimport { Button } from '@payloadcms/ui'\nimport { $addUpdateTag, isDOMNode, type LexicalEditor } from 'lexical'\nimport React, { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nconst baseClass = 'toolbar-popup__dropdown-item'\n\ninterface DropDownContextType {\n registerItem: (ref: React.RefObject<HTMLButtonElement | null>) => void\n}\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null)\n\nexport function DropDownItem({\n active,\n children,\n editor,\n enabled,\n Icon,\n item,\n itemKey,\n tooltip,\n}: {\n active?: boolean\n children: React.ReactNode\n editor: LexicalEditor\n enabled?: boolean\n Icon: React.ReactNode\n item: ToolbarGroupItem\n itemKey: string\n tooltip?: string\n}): React.ReactNode {\n const className = useMemo(() => {\n return [\n baseClass,\n enabled === false ? 'disabled' : '',\n active ? 'active' : '',\n item?.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [enabled, active, item.key])\n\n const ref = useRef<HTMLButtonElement>(null)\n\n const dropDownContext = React.use(DropDownContext)\n\n if (dropDownContext === null) {\n throw new Error('DropDownItem must be used within a DropDown')\n }\n\n const { registerItem } = dropDownContext\n\n useEffect(() => {\n if (ref?.current != null) {\n registerItem(ref)\n }\n }, [ref, registerItem])\n\n return (\n <Button\n aria-label={tooltip}\n buttonStyle=\"none\"\n className={className}\n disabled={enabled === false}\n extraButtonProps={{\n 'data-item-key': itemKey,\n }}\n icon={Icon}\n iconPosition=\"left\"\n iconStyle=\"none\"\n onClick={() => {\n if (enabled !== false) {\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active!,\n })\n })\n }\n }}\n onMouseDown={(e) => {\n // This is required for Firefox compatibility. Without it, the dropdown will disappear without the onClick being called.\n // This only happens in Firefox. Must be something about how Firefox handles focus events differently.\n e.preventDefault()\n }}\n ref={ref}\n tooltip={tooltip}\n type=\"button\"\n >\n {children}\n </Button>\n )\n}\n\nfunction DropDownItems({\n children,\n dropDownRef,\n itemsContainerClassNames,\n onClose,\n}: {\n children: React.ReactNode\n dropDownRef: React.Ref<HTMLDivElement>\n itemsContainerClassNames?: string[]\n onClose: () => void\n}): React.ReactElement {\n const [items, setItems] = useState<Array<React.RefObject<HTMLButtonElement | null>>>()\n const [highlightedItem, setHighlightedItem] =\n useState<React.RefObject<HTMLButtonElement | null>>()\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement | null>) => {\n setItems((prev) => (prev != null ? [...prev, itemRef] : [itemRef]))\n },\n [setItems],\n )\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (items == null) {\n return\n }\n\n const { key } = event\n\n if (['ArrowDown', 'ArrowUp', 'Escape', 'Tab'].includes(key)) {\n event.preventDefault()\n }\n\n if (key === 'Escape' || key === 'Tab') {\n onClose()\n } else if (key === 'ArrowUp') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n const index = items.indexOf(prev) - 1\n return items[index === -1 ? items.length - 1 : index]\n })\n } else if (key === 'ArrowDown') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n return items[items.indexOf(prev) + 1]\n })\n }\n }\n\n const contextValue = useMemo(\n () => ({\n registerItem,\n }),\n [registerItem],\n )\n\n useEffect(() => {\n if (items != null && highlightedItem == null) {\n setHighlightedItem(items[0])\n }\n\n if (highlightedItem != null && highlightedItem?.current != null) {\n highlightedItem.current.focus()\n }\n }, [items, highlightedItem])\n\n return (\n <DropDownContext value={contextValue}>\n <div\n className={(itemsContainerClassNames ?? ['toolbar-popup__dropdown-items']).join(' ')}\n onKeyDown={handleKeyDown}\n ref={dropDownRef}\n >\n {children}\n </div>\n </DropDownContext>\n )\n}\n\nexport function DropDown({\n buttonAriaLabel,\n buttonClassName,\n children,\n disabled = false,\n dropdownKey,\n Icon,\n itemsContainerClassNames,\n label,\n stopCloseOnClickSelf,\n}: {\n buttonAriaLabel?: string\n buttonClassName: string\n children: ReactNode\n disabled?: boolean\n dropdownKey: string\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n stopCloseOnClickSelf?: boolean\n}): React.ReactNode {\n const dropDownRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const [showDropDown, setShowDropDown] = useState(false)\n\n const handleClose = (): void => {\n setShowDropDown(false)\n if (buttonRef?.current != null) {\n buttonRef.current.focus()\n }\n }\n\n useEffect(() => {\n const button = buttonRef.current\n const dropDown = dropDownRef.current\n\n if (showDropDown && button !== null && dropDown !== null) {\n const { left, top } = button.getBoundingClientRect()\n const scrollTopOffset = window.scrollY || document.documentElement.scrollTop\n dropDown.style.top = `${top + scrollTopOffset + button.offsetHeight + 5}px`\n dropDown.style.left = `${Math.min(left - 5, window.innerWidth - dropDown.offsetWidth - 20)}px`\n }\n }, [dropDownRef, buttonRef, showDropDown])\n\n useEffect(() => {\n const button = buttonRef.current\n\n if (button !== null && showDropDown) {\n const handle = (event: MouseEvent): void => {\n const target = event.target\n if (!isDOMNode(target)) {\n return\n }\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target)) {\n return\n }\n }\n if (!button.contains(target)) {\n setShowDropDown(false)\n }\n }\n document.addEventListener('click', handle)\n\n return () => {\n document.removeEventListener('click', handle)\n }\n }\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf])\n\n const portal = createPortal(\n <DropDownItems\n dropDownRef={dropDownRef}\n itemsContainerClassNames={itemsContainerClassNames}\n onClose={handleClose}\n >\n {children}\n </DropDownItems>,\n document.body,\n )\n\n return (\n <React.Fragment>\n <button\n aria-label={buttonAriaLabel}\n className={buttonClassName + (showDropDown ? ' active' : '')}\n data-dropdown-key={dropdownKey}\n disabled={disabled}\n onClick={(event) => {\n event.preventDefault()\n setShowDropDown(!showDropDown)\n }}\n onMouseDown={(e) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }}\n ref={buttonRef}\n type=\"button\"\n >\n {Icon && <Icon />}\n {label && <span className=\"toolbar-popup__dropdown-label\">{label}</span>}\n <i className=\"toolbar-popup__dropdown-caret\" />\n </button>\n\n {showDropDown && <React.Fragment>{portal}</React.Fragment>}\n </React.Fragment>\n )\n}\n", "'use client'\n\nimport type { FixedToolbarFeatureProps } from '../server/index.js'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { FixedToolbarPlugin } from './Toolbar/index.js'\n\nexport const FixedToolbarFeatureClient = createClientFeature<FixedToolbarFeatureProps>({\n plugins: [\n {\n Component: FixedToolbarPlugin,\n position: 'aboveContainer',\n },\n ],\n})\n", "'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getDOMRangeRect } from '../../../../../lexical/utils/getDOMRangeRect.js'\nimport { setFloatingElemPosition } from '../../../../../lexical/utils/setFloatingElemPosition.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport './index.scss'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { editorConfig } = useEditorConfigContext()\n\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>()\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent)\n } else {\n setDropdownIcon(undefined)\n }\n return\n }\n const item = activeItems[0]\n setDropdownIcon(() => item?.ChildComponent)\n },\n [group],\n )\n\n return (\n <div\n className={`inline-toolbar-popup__group inline-toolbar-popup__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarInline?.groups.length - 1 && (\n <div className=\"divider\" />\n )}\n </div>\n )\n}\n\nfunction InlineToolbar({\n anchorElem,\n editor,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n}): React.ReactNode {\n const floatingToolbarRef = useRef<HTMLDivElement | null>(null)\n const caretRef = useRef<HTMLDivElement | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const closeFloatingToolbar = useCallback(() => {\n if (floatingToolbarRef?.current) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n\n if (!isOpacityZero) {\n floatingToolbarRef.current.style.opacity = '0'\n }\n if (!isPointerEventsNone) {\n floatingToolbarRef.current.style.pointerEvents = 'none'\n }\n }\n }, [floatingToolbarRef])\n\n const mouseMoveListener = useCallback(\n (e: MouseEvent) => {\n if (floatingToolbarRef?.current && (e.buttons === 1 || e.buttons === 3)) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n if (!isOpacityZero || !isPointerEventsNone) {\n // Check if the mouse is not over the popup\n const x = e.clientX\n const y = e.clientY\n const elementUnderMouse = document.elementFromPoint(x, y)\n if (!floatingToolbarRef.current.contains(elementUnderMouse)) {\n // Mouse is not over the target element => not a normal click, but probably a drag\n closeFloatingToolbar()\n }\n }\n }\n },\n [closeFloatingToolbar],\n )\n\n const mouseUpListener = useCallback(() => {\n if (floatingToolbarRef?.current) {\n if (floatingToolbarRef.current.style.opacity !== '1') {\n floatingToolbarRef.current.style.opacity = '1'\n }\n if (floatingToolbarRef.current.style.pointerEvents !== 'auto') {\n floatingToolbarRef.current.style.pointerEvents = 'auto'\n }\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('mousemove', mouseMoveListener)\n document.addEventListener('mouseup', mouseUpListener)\n\n return () => {\n document.removeEventListener('mousemove', mouseMoveListener)\n document.removeEventListener('mouseup', mouseUpListener)\n }\n }, [floatingToolbarRef, mouseMoveListener, mouseUpListener])\n\n const $updateTextFormatFloatingToolbar = useCallback(() => {\n const selection = $getSelection()\n\n const nativeSelection = getDOMSelection(editor._window)\n\n if (floatingToolbarRef.current === null) {\n return\n }\n\n const possibleLinkEditor = anchorElem.querySelector(':scope > .link-editor')\n const isLinkEditorVisible =\n possibleLinkEditor !== null &&\n 'style' in possibleLinkEditor &&\n possibleLinkEditor?.style?.['opacity' as keyof typeof possibleLinkEditor.style] === '1'\n\n const rootElement = editor.getRootElement()\n if (\n selection !== null &&\n nativeSelection !== null &&\n !nativeSelection.isCollapsed &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement)\n\n // Position floating toolbar\n const offsetIfFlipped = setFloatingElemPosition({\n alwaysDisplayOnTop: isLinkEditorVisible,\n anchorElem,\n floatingElem: floatingToolbarRef.current,\n horizontalPosition: 'center',\n targetRect: rangeRect,\n })\n\n // Position caret\n if (caretRef.current) {\n setFloatingElemPosition({\n anchorElem: floatingToolbarRef.current,\n anchorFlippedOffset: offsetIfFlipped,\n floatingElem: caretRef.current,\n horizontalOffset: 5,\n horizontalPosition: 'center',\n specialHandlingForCaret: true,\n targetRect: rangeRect,\n verticalGap: 8,\n })\n }\n } else {\n closeFloatingToolbar()\n }\n }, [editor, closeFloatingToolbar, anchorElem])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }\n\n window.addEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateTextFormatFloatingToolbar()\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateTextFormatFloatingToolbar])\n\n return (\n <div className=\"inline-toolbar-popup\" ref={floatingToolbarRef}>\n <div className=\"caret\" ref={caretRef} />\n {editorConfig?.features &&\n editorConfig.features?.toolbarInline?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </div>\n )\n}\n\nfunction useInlineToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n): null | React.ReactElement {\n const [isText, setIsText] = useState(false)\n const isEditable = useLexicalEditable()\n\n const updatePopup = useCallback(() => {\n editor.getEditorState().read(() => {\n // Should not to pop up the floating toolbar when using IME input\n if (editor.isComposing()) {\n return\n }\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n (!$isRangeSelection(selection) ||\n rootElement === null ||\n !rootElement.contains(nativeSelection.anchorNode))\n ) {\n setIsText(false)\n return\n }\n\n if (!$isRangeSelection(selection)) {\n return\n }\n\n if (selection.getTextContent() !== '') {\n const nodes = selection.getNodes()\n let foundNodeWithText = false\n for (const node of nodes) {\n if ($isTextNode(node)) {\n setIsText(true)\n foundNodeWithText = true\n break\n }\n }\n if (!foundNodeWithText) {\n setIsText(false)\n }\n } else {\n setIsText(false)\n }\n\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '')\n if (!selection.isCollapsed() && rawTextContent === '') {\n setIsText(false)\n return\n }\n })\n }, [editor])\n\n useEffect(() => {\n document.addEventListener('selectionchange', updatePopup)\n document.addEventListener('mouseup', updatePopup)\n return () => {\n document.removeEventListener('selectionchange', updatePopup)\n document.removeEventListener('mouseup', updatePopup)\n }\n }, [updatePopup])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(() => {\n updatePopup()\n }),\n editor.registerRootListener(() => {\n if (editor.getRootElement() === null) {\n setIsText(false)\n }\n }),\n )\n }, [editor, updatePopup])\n\n if (!isText || !isEditable) {\n return null\n }\n\n return createPortal(<InlineToolbar anchorElem={anchorElem} editor={editor} />, anchorElem)\n}\n\nexport const InlineToolbarPlugin: PluginComponentWithAnchor<undefined> = ({ anchorElem }) => {\n const [editor] = useLexicalComposerContext()\n\n return useInlineToolbar(editor, anchorElem)\n}\n", "'use client'\nexport function getDOMRangeRect(nativeSelection: Selection, rootElement: HTMLElement): DOMRect {\n const domRange = nativeSelection.getRangeAt(0)\n\n let rect\n\n if (nativeSelection.anchorNode === rootElement) {\n let inner = rootElement\n while (inner.firstElementChild != null) {\n inner = inner.firstElementChild as HTMLElement\n }\n rect = inner.getBoundingClientRect()\n } else {\n rect = domRange.getBoundingClientRect()\n }\n\n return rect\n}\n", "'use client'\nconst VERTICAL_GAP = 10\nconst HORIZONTAL_OFFSET = 32\n\n// TODO: needs refactoring\n// This is supposed to position the floatingElem based on the parent (anchorElem) and the target (targetRect) which is usually the selected text.\n// So basically, it positions the floatingElem either below or above the target (targetRect) and aligns it to the left or center of the target (targetRect).\n// This is used for positioning the floating toolbar (anchor: richtext editor) and its caret (anchor: floating toolbar)\nexport function setFloatingElemPosition(args: {\n alwaysDisplayOnTop?: boolean\n anchorElem: HTMLElement\n anchorFlippedOffset?: number // Offset which was added to the anchor (for caret, floating toolbar) if it was flipped\n floatingElem: HTMLElement\n horizontalOffset?: number\n horizontalPosition?: 'center' | 'left'\n specialHandlingForCaret?: boolean\n targetRect: ClientRect | null\n verticalGap?: number\n}): number | undefined {\n const {\n alwaysDisplayOnTop = false,\n anchorElem,\n anchorFlippedOffset = 0, // Offset which was added to the anchor (for caret, floating toolbar) if it was flipped\n floatingElem,\n horizontalOffset = HORIZONTAL_OFFSET,\n horizontalPosition = 'left',\n specialHandlingForCaret = false,\n targetRect,\n verticalGap = VERTICAL_GAP,\n } = args\n // Returns the top offset if the target was flipped\n const scrollerElem = anchorElem.parentElement\n\n if (targetRect === null || scrollerElem == null) {\n floatingElem.style.opacity = '0'\n floatingElem.style.transform = 'translate(-10000px, -10000px)'\n return\n }\n\n const floatingElemRect = floatingElem.getBoundingClientRect()\n const anchorElementRect = anchorElem.getBoundingClientRect()\n const editorScrollerRect = scrollerElem.getBoundingClientRect()\n\n let top = targetRect.top - floatingElemRect.height - verticalGap\n let left = targetRect.left - horizontalOffset\n\n if (horizontalPosition === 'center') {\n // Calculate left to position floatingElem to the horizontal middle of targetRect\n left = targetRect.left + targetRect.width / 2 - floatingElemRect.width / 2\n }\n\n let addedToTop = 0\n if (!alwaysDisplayOnTop && top < editorScrollerRect.top && !specialHandlingForCaret) {\n addedToTop = floatingElemRect.height + targetRect.height + verticalGap * 2\n\n top += addedToTop\n }\n\n if (horizontalPosition === 'center') {\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n } else if (left < editorScrollerRect.left) {\n left = editorScrollerRect.left + horizontalOffset\n }\n } else {\n if (left + floatingElemRect.width > editorScrollerRect.right) {\n left = editorScrollerRect.right - floatingElemRect.width - horizontalOffset\n }\n }\n\n left -= anchorElementRect.left\n\n floatingElem.style.opacity = '1'\n\n if (specialHandlingForCaret && anchorFlippedOffset !== 0) {\n // Floating select toolbar was flipped (positioned below text rather than above). Thus, the caret now needs to be positioned\n // on the other side and rotated.\n top -= anchorElementRect.bottom - anchorFlippedOffset + floatingElemRect.height - 3\n // top += anchorFlippedOffset - anchorElementRect.height - floatingElemRect.height + 2\n floatingElem.style.transform = `translate(${left}px, ${top}px) rotate(180deg)`\n } else {\n top -= anchorElementRect.top\n\n floatingElem.style.transform = `translate(${left}px, ${top}px)`\n }\n\n return addedToTop\n}\n", "'use client'\n\nimport { createClientFeature } from '../../../../utilities/createClientFeature.js'\nimport { InlineToolbarPlugin } from './Toolbar/index.js'\n\nexport const InlineToolbarFeatureClient = createClientFeature({\n plugins: [\n {\n Component: InlineToolbarPlugin,\n position: 'floatingAnchorElem',\n },\n ],\n})\n", "'use client'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\n\nimport { TableIcon } from '../../../lexical/ui/icons/Table/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { TableMarkdownTransformer } from '../markdownTransformer.js'\nimport { TableActionMenuPlugin } from './plugins/TableActionMenuPlugin/index.js'\nimport { TableCellResizerPlugin } from './plugins/TableCellResizerPlugin/index.js'\nimport { TableHoverActionsPlugin } from './plugins/TableHoverActionsPlugin/index.js'\nimport {\n OPEN_TABLE_DRAWER_COMMAND,\n TableContext,\n TablePlugin,\n} from './plugins/TablePlugin/index.js'\n\nexport const TableFeatureClient = createClientFeature({\n markdownTransformers: [TableMarkdownTransformer],\n nodes: [TableNode, TableCellNode, TableRowNode],\n plugins: [\n {\n Component: TablePlugin,\n position: 'normal',\n },\n {\n Component: TableCellResizerPlugin,\n position: 'normal',\n },\n {\n Component: TableActionMenuPlugin,\n position: 'floatingAnchorElem',\n },\n {\n Component: TableHoverActionsPlugin,\n position: 'floatingAnchorElem',\n },\n ],\n providers: [TableContext],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: TableIcon,\n key: 'table',\n keywords: ['table'],\n label: 'Table',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OPEN_TABLE_DRAWER_COMMAND, {})\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: TableIcon,\n key: 'table',\n label: 'Table',\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OPEN_TABLE_DRAWER_COMMAND, {})\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const TableIcon: React.FC = () => {\n return (\n <svg\n className=\"icon\"\n fill=\"none\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n clipRule=\"evenodd\"\n d=\"M5.33333 4.5C4.8731 4.5 4.5 4.8731 4.5 5.33333V7.5H9.5V4.5H5.33333ZM5.33333 3.5C4.32081 3.5 3.5 4.32081 3.5 5.33333V14.6667C3.5 15.6792 4.32081 16.5 5.33333 16.5H14.6667C15.6792 16.5 16.5 15.6792 16.5 14.6667V5.33333C16.5 4.32081 15.6792 3.5 14.6667 3.5H5.33333ZM10.5 4.5V7.5H15.5V5.33333C15.5 4.8731 15.1269 4.5 14.6667 4.5H10.5ZM15.5 8.5H10.5V11.5H15.5V8.5ZM15.5 12.5H10.5V15.5H14.6667C15.1269 15.5 15.5 15.1269 15.5 14.6667V12.5ZM9.5 15.5V12.5H4.5V14.6667C4.5 15.1269 4.8731 15.5 5.33333 15.5H9.5ZM4.5 11.5H9.5V8.5H4.5V11.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n />\n </svg>\n )\n}\n", "import type { LexicalNode } from 'lexical'\n\nimport {\n $createTableCellNode,\n $createTableNode,\n $createTableRowNode,\n $isTableCellNode,\n $isTableNode,\n $isTableRowNode,\n TableCellHeaderStates,\n TableCellNode,\n TableNode,\n TableRowNode,\n} from '@lexical/table'\nimport { $isParagraphNode, $isTextNode } from 'lexical'\n\nimport {\n $convertFromMarkdownString,\n $convertToMarkdownString,\n type ElementTransformer,\n type Transformer,\n} from '../../packages/@lexical/markdown/index.js'\n\n// Very primitive table setup\nconst TABLE_ROW_REG_EXP = /^\\|(.+)\\|\\s?$/\n// eslint-disable-next-line regexp/no-unused-capturing-group\nconst TABLE_ROW_DIVIDER_REG_EXP = /^(\\| ?:?-*:? ?)+\\|\\s?$/\n\nexport const TableMarkdownTransformer: (props: {\n allTransformers: Transformer[]\n}) => ElementTransformer = ({ allTransformers }) => ({\n type: 'element',\n dependencies: [TableNode, TableRowNode, TableCellNode],\n export: (node: LexicalNode) => {\n if (!$isTableNode(node)) {\n return null\n }\n\n const output: string[] = []\n\n for (const row of node.getChildren()) {\n const rowOutput: string[] = []\n if (!$isTableRowNode(row)) {\n continue\n }\n\n let isHeaderRow = false\n for (const cell of row.getChildren()) {\n // It's TableCellNode, so it's just to make flow happy\n if ($isTableCellNode(cell)) {\n rowOutput.push(\n $convertToMarkdownString(allTransformers, cell).replace(/\\n/g, '\\\\n').trim(),\n )\n\n if (cell.__headerState === TableCellHeaderStates.ROW) {\n isHeaderRow = true\n }\n }\n }\n\n output.push(`| ${rowOutput.join(' | ')} |`)\n if (isHeaderRow) {\n output.push(`| ${rowOutput.map((_) => '---').join(' | ')} |`)\n }\n }\n\n return output.join('\\n')\n },\n regExp: TABLE_ROW_REG_EXP,\n replace: (parentNode, _1, match) => {\n const match0 = match[0]\n if (!match0) {\n return\n }\n // Header row\n if (TABLE_ROW_DIVIDER_REG_EXP.test(match0)) {\n const table = parentNode.getPreviousSibling()\n if (!table || !$isTableNode(table)) {\n return\n }\n\n const rows = table.getChildren()\n const lastRow = rows[rows.length - 1]\n if (!lastRow || !$isTableRowNode(lastRow)) {\n return\n }\n\n // Add header state to row cells\n lastRow.getChildren().forEach((cell) => {\n if (!$isTableCellNode(cell)) {\n return\n }\n cell.setHeaderStyles(TableCellHeaderStates.ROW, TableCellHeaderStates.ROW)\n })\n\n // Remove line\n parentNode.remove()\n return\n }\n\n const matchCells = mapToTableCells(match0, allTransformers)\n\n if (matchCells == null) {\n return\n }\n\n const rows = [matchCells]\n let sibling = parentNode.getPreviousSibling()\n let maxCells = matchCells.length\n\n while (sibling) {\n if (!$isParagraphNode(sibling)) {\n break\n }\n\n if (sibling.getChildrenSize() !== 1) {\n break\n }\n\n const firstChild = sibling.getFirstChild()\n\n if (!$isTextNode(firstChild)) {\n break\n }\n\n const cells = mapToTableCells(firstChild.getTextContent(), allTransformers)\n\n if (cells == null) {\n break\n }\n\n maxCells = Math.max(maxCells, cells.length)\n rows.unshift(cells)\n const previousSibling = sibling.getPreviousSibling()\n sibling.remove()\n sibling = previousSibling\n }\n\n const table = $createTableNode()\n\n for (const cells of rows) {\n const tableRow = $createTableRowNode()\n table.append(tableRow)\n\n for (let i = 0; i < maxCells; i++) {\n tableRow.append(i < cells.length ? cells[i]! : $createTableCell('', allTransformers))\n }\n }\n\n const previousSibling = parentNode.getPreviousSibling()\n if ($isTableNode(previousSibling) && getTableColumnsSize(previousSibling) === maxCells) {\n previousSibling.append(...table.getChildren())\n parentNode.remove()\n } else {\n parentNode.replace(table)\n }\n\n table.selectEnd()\n },\n})\n\nfunction getTableColumnsSize(table: TableNode) {\n const row = table.getFirstChild()\n return $isTableRowNode(row) ? row.getChildrenSize() : 0\n}\n\nconst $createTableCell = (textContent: string, allTransformers: Transformer[]): TableCellNode => {\n textContent = textContent.replace(/\\\\n/g, '\\n')\n const cell = $createTableCellNode(TableCellHeaderStates.NO_STATUS)\n $convertFromMarkdownString(textContent, allTransformers, cell)\n return cell\n}\n\nconst mapToTableCells = (\n textContent: string,\n allTransformers: Transformer[],\n): Array<TableCellNode> | null => {\n const match = textContent.match(TABLE_ROW_REG_EXP)\n if (!match || !match[1]) {\n return null\n }\n return match[1].split('|').map((text) => $createTableCell(text, allTransformers))\n}\n", "'use client'\n\nimport type { TableObserver, TableSelection } from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $deleteTableColumnAtSelection,\n $deleteTableRowAtSelection,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableSelection,\n $mergeCells,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isTextNode,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = position < 0 ? margin : position\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n $setSelection(null)\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if (!$isTableSelection(selection)) {\n return\n }\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n const targetCell = $mergeCells(tableCells)\n\n if (targetCell) {\n $selectLastDescendant(targetCell)\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRowAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumnAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRowAtSelection()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumnAtSelection()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\n }\n }\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Merge cells</span>\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Unmerge cells</span>\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const MeatballsIcon: React.FC = () => (\n <svg fill=\"none\" height=\"18\" viewBox=\"0 0 20 20\" width=\"18\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M5 11C5.55228 11 6 10.5523 6 10C6 9.44772 5.55228 9 5 9C4.44772 9 4 9.44772 4 10C4 10.5523 4.44772 11 5 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M10 11C10.5523 11 11 10.5523 11 10C11 9.44772 10.5523 9 10 9C9.44772 9 9 9.44772 9 10C9 10.5523 9.44772 11 10 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M15 11C15.5523 11 16 10.5523 16 10C16 9.44772 15.5523 9 15 9C14.4477 9 14 9.44772 14 10C14 10.5523 14.4477 11 15 11Z\"\n fill=\"currentColor\"\n />\n </svg>\n)\n", "'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren<TableCellNode>()\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n ): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n }\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${window.scrollX + left}px`,\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\n top: `${window.scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${window.scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${window.scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${window.scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n return useMemo(\n () => (isEditable ? createPortal(<TableCellResizer editor={editor} />, document.body) : null),\n [editor, isEditable],\n )\n}\n", "'use client'\n\nimport type { TableCellNode, TableRowNode } from '@lexical/table'\nimport type { EditorConfig, NodeKey } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement } from 'lexical'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useDebounce } from '../../utils/useDebounce.js'\n\nconst BUTTON_WIDTH_PX = 20\n\nfunction TableHoverActionsContainer({\n anchorElem,\n}: {\n anchorElem: HTMLElement\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const editorConfig = useEditorConfigContext()\n const [isShownRow, setShownRow] = useState<boolean>(false)\n const [isShownColumn, setShownColumn] = useState<boolean>(false)\n const [shouldListenMouseMove, setShouldListenMouseMove] = useState<boolean>(false)\n const [position, setPosition] = useState({})\n const tableSetRef = useRef<Set<NodeKey>>(new Set())\n const tableCellDOMNodeRef = useRef<HTMLElement | null>(null)\n\n const debouncedOnMouseMove = useDebounce(\n (event: MouseEvent) => {\n const { isOutside, tableDOMNode } = getMouseInfo(event, editorConfig.editorConfig?.lexical)\n\n if (isOutside) {\n setShownRow(false)\n setShownColumn(false)\n return\n }\n\n if (!tableDOMNode) {\n return\n }\n\n tableCellDOMNodeRef.current = tableDOMNode\n\n let hoveredRowNode: null | TableCellNode = null\n let hoveredColumnNode: null | TableCellNode = null\n let tableDOMElement: HTMLElement | null = null\n\n editor.getEditorState().read(\n () => {\n const maybeTableCell = $getNearestNodeFromDOMNode(tableDOMNode)\n\n if ($isTableCellNode(maybeTableCell)) {\n const table = $findMatchingParent(maybeTableCell, (node) => $isTableNode(node))\n if (!$isTableNode(table)) {\n return\n }\n\n tableDOMElement = getTableElement(table, editor.getElementByKey(table.getKey()))\n\n if (tableDOMElement) {\n const rowCount = table.getChildrenSize()\n const colCount = (table.getChildAtIndex(0) as TableRowNode)?.getChildrenSize()\n\n const rowIndex = $getTableRowIndexFromTableCellNode(maybeTableCell)\n const colIndex = $getTableColumnIndexFromTableCellNode(maybeTableCell)\n\n if (rowIndex === rowCount - 1) {\n hoveredRowNode = maybeTableCell\n } else if (colIndex === colCount - 1) {\n hoveredColumnNode = maybeTableCell\n }\n }\n }\n },\n { editor },\n )\n\n if (!tableDOMElement) {\n return\n }\n\n // this is the scrollable div container of the table (in case of overflow)\n const tableContainerElement = (tableDOMElement as HTMLTableElement).parentElement\n\n if (!tableContainerElement) {\n return\n }\n\n const {\n bottom: tableElemBottom,\n height: tableElemHeight,\n left: tableElemLeft,\n right: tableElemRight,\n width: tableElemWidth,\n y: tableElemY,\n } = (tableDOMElement as HTMLTableElement).getBoundingClientRect()\n\n let tableHasScroll = false\n if (\n tableContainerElement &&\n tableContainerElement.classList.contains('LexicalEditorTheme__tableScrollableWrapper')\n ) {\n tableHasScroll = tableContainerElement.scrollWidth > tableContainerElement.clientWidth\n }\n\n const { left: editorElemLeft, y: editorElemY } = anchorElem.getBoundingClientRect()\n\n if (hoveredRowNode) {\n setShownColumn(false)\n setShownRow(true)\n setPosition({\n height: BUTTON_WIDTH_PX,\n left:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetLeft\n : tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetWidth\n : tableElemWidth,\n })\n } else if (hoveredColumnNode) {\n setShownColumn(true)\n setShownRow(false)\n setPosition({\n height: tableElemHeight,\n left: tableElemRight - editorElemLeft + 5,\n top: tableElemY - editorElemY,\n width: BUTTON_WIDTH_PX,\n })\n }\n },\n 50,\n 250,\n )\n\n // Hide the buttons on any table dimensions change to prevent last row cells\n // overlap behind the 'Add Row' button when text entry changes cell height\n const tableResizeObserver = useMemo(() => {\n return new ResizeObserver(() => {\n setShownRow(false)\n setShownColumn(false)\n })\n }, [])\n\n useEffect(() => {\n if (!shouldListenMouseMove) {\n return\n }\n\n document.addEventListener('mousemove', debouncedOnMouseMove)\n\n return () => {\n setShownRow(false)\n setShownColumn(false)\n\n document.removeEventListener('mousemove', debouncedOnMouseMove)\n }\n }, [shouldListenMouseMove, debouncedOnMouseMove])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerMutationListener(\n TableNode,\n (mutations) => {\n editor.getEditorState().read(\n () => {\n let resetObserver = false\n for (const [key, type] of mutations) {\n switch (type) {\n case 'created': {\n tableSetRef.current.add(key)\n resetObserver = true\n break\n }\n case 'destroyed': {\n tableSetRef.current.delete(key)\n resetObserver = true\n break\n }\n default:\n break\n }\n }\n if (resetObserver) {\n // Reset resize observers\n tableResizeObserver.disconnect()\n for (const tableKey of tableSetRef.current) {\n const { tableElement } = $getTableAndElementByKey(tableKey)\n tableResizeObserver.observe(tableElement)\n }\n setShouldListenMouseMove(tableSetRef.current.size > 0)\n }\n },\n { editor },\n )\n },\n { skipInitialization: false },\n ),\n )\n }, [editor, tableResizeObserver])\n\n const insertAction = (insertRow: boolean) => {\n editor.update(() => {\n if (tableCellDOMNodeRef.current) {\n const maybeTableNode = $getNearestNodeFromDOMNode(tableCellDOMNodeRef.current)\n maybeTableNode?.selectEnd()\n if (insertRow) {\n $insertTableRowAtSelection()\n setShownRow(false)\n } else {\n $insertTableColumnAtSelection()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!isEditable) {\n return null\n }\n\n return (\n <>\n {isShownRow && (\n <button\n aria-label=\"Add Row\"\n className={editorConfig.editorConfig.lexical.theme.tableAddRows}\n onClick={() => insertAction(true)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n {isShownColumn && (\n <button\n aria-label=\"Add Column\"\n className={editorConfig.editorConfig.lexical.theme.tableAddColumns}\n onClick={() => insertAction(false)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n </>\n )\n}\n\nfunction getMouseInfo(\n event: MouseEvent,\n editorConfig: EditorConfig,\n): {\n isOutside: boolean\n tableDOMNode: HTMLElement | null\n} {\n const target = event.target\n\n if (isHTMLElement(target)) {\n const tableDOMNode = target.closest<HTMLElement>(\n `td.${editorConfig.theme.tableCell}, th.${editorConfig.theme.tableCell}`,\n )\n\n const isOutside = !(\n tableDOMNode ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddRows}`) ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddColumns}`) ||\n target.closest<HTMLElement>(`div.${editorConfig.theme.tableCellResizer}`)\n )\n\n return { isOutside, tableDOMNode }\n } else {\n return { isOutside: true, tableDOMNode: null }\n }\n}\n\nexport function TableHoverActionsPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): null | React.ReactPortal {\n const isEditable = useLexicalEditable()\n\n if (!isEditable) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n", "'use client'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport debounce from './debounce.js'\n\n// Define the type for debounced function that includes cancel method\ninterface DebouncedFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): ReturnType<T>\n cancel: () => void\n}\n\nexport function useDebounce<T extends (...args: never[]) => void>(\n fn: T,\n ms: number,\n maxWait?: number,\n) {\n // Update the ref type to include cancel method\n const debouncedRef = useRef<DebouncedFunction<T> | null>(null)\n\n useEffect(() => {\n debouncedRef.current = debounce(fn, ms, { maxWait }) as DebouncedFunction<T>\n\n return () => {\n debouncedRef.current?.cancel()\n }\n }, [fn, ms, maxWait])\n\n const callback = useCallback((...args: Parameters<T>) => {\n if (debouncedRef.current) {\n debouncedRef.current(...args)\n }\n }, [])\n\n return callback\n}\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck - not worth it migrate jsdoc to tsdoc\n'use client'\n// Copied & modified from https://github.com/lodash/lodash/blob/main/src/debounce.ts\n/*\nThe MIT License\n\nCopyright JS Foundation and other contributors <https://js.foundation/>\n\nBased on Underscore.js, copyright Jeremy Ashkenas,\nDocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/lodash/lodash\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nCopyright and related rights for sample code are waived via CC0. Sample\ncode is defined as all source code displayed within the prose of the\ndocumentation.\n\nCC0: http://creativecommons.org/publicdomain/zero/1.0/\n\n====\n\nFiles located in the node_modules and vendor directories are externally\nmaintained libraries used by this software which have their own\nlicenses; we recommend you read them, as their terms may differ from the\nterms above.\n */\n\n/** Error message constants. */\nconst FUNC_ERROR_TEXT = 'Expected a function'\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nconst nativeMax = Math.max,\n nativeMin = Math.min\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [sortOnOptions={}] The options object.\n * @param {boolean} [sortOnOptions.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [sortOnOptions.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [sortOnOptions.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n let lastArgs,\n lastCallTime,\n lastInvokeTime = 0,\n lastThis,\n leading = false,\n maxing = false,\n maxWait,\n result,\n timerID,\n trailing = true\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT)\n }\n wait = wait || 0\n if (typeof options === 'object') {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? nativeMax(options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc(time) {\n const args = lastArgs,\n thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerID = setTimeout(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait(time) {\n const timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall\n\n return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting\n }\n\n function shouldInvoke(time) {\n const timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (\n lastCallTime === undefined ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (maxing && timeSinceLastInvoke >= maxWait)\n )\n }\n\n function timerExpired() {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerID = setTimeout(timerExpired, remainingWait(time))\n }\n\n function trailingEdge(time) {\n timerID = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel() {\n if (timerID !== undefined) {\n clearTimeout(timerID)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerID = undefined\n }\n\n function flush() {\n return timerID === undefined ? result : trailingEdge(Date.now())\n }\n\n function debounced() {\n const time = Date.now(),\n isInvoking = shouldInvoke(time)\n\n // eslint-disable-next-line prefer-rest-params\n lastArgs = arguments\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerID === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerID)\n timerID = setTimeout(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerID === undefined) {\n timerID = setTimeout(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n return debounced\n}\n\n// eslint-disable-next-line no-restricted-exports\nexport default debounce\n", "'use client'\n\nimport type {\n EditorThemeClasses,\n Klass,\n LexicalCommand,\n LexicalEditor,\n LexicalNode,\n RangeSelection,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { TablePlugin as LexicalReactTablePlugin } from '@lexical/react/LexicalTablePlugin'\nimport { INSERT_TABLE_COMMAND, TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { formatDrawerSlug, useEditDepth } from '@payloadcms/ui'\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand } from 'lexical'\nimport { createContext, use, useEffect, useMemo, useState } from 'react'\nimport * as React from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { FieldsDrawer } from '../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport './index.scss'\n\nexport type CellContextShape = {\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n set: (\n cellEditorConfig: CellEditorConfig | null,\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null,\n ) => void\n}\n\nexport type CellEditorConfig = Readonly<{\n namespace: string\n nodes?: ReadonlyArray<Klass<LexicalNode>>\n onError: (error: Error, editor: LexicalEditor) => void\n readOnly?: boolean\n theme?: EditorThemeClasses\n}>\n\nexport const OPEN_TABLE_DRAWER_COMMAND: LexicalCommand<{}> = createCommand(\n 'OPEN_EMBED_DRAWER_COMMAND',\n)\n\nexport const CellContext = createContext<CellContextShape>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n set: () => {\n // Empty\n },\n})\n\nexport function TableContext({ children }: { children: JSX.Element }) {\n const [contextValue, setContextValue] = useState<{\n cellEditorConfig: CellEditorConfig | null\n cellEditorPlugins: Array<JSX.Element> | JSX.Element | null\n }>({\n cellEditorConfig: null,\n cellEditorPlugins: null,\n })\n return (\n <CellContext\n value={useMemo(\n () => ({\n cellEditorConfig: contextValue.cellEditorConfig,\n cellEditorPlugins: contextValue.cellEditorPlugins,\n set: (cellEditorConfig, cellEditorPlugins) => {\n setContextValue({ cellEditorConfig, cellEditorPlugins })\n },\n }),\n [contextValue.cellEditorConfig, contextValue.cellEditorPlugins],\n )}\n >\n {children}\n </CellContext>\n )\n}\n\nexport const TablePlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const cellContext = use(CellContext)\n const editDepth = useEditDepth()\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n\n const drawerSlug = formatDrawerSlug({\n slug: 'lexical-table-create-' + uuid,\n depth: editDepth,\n })\n const { toggleDrawer } = useLexicalDrawer(drawerSlug, true)\n\n useEffect(() => {\n if (!editor.hasNodes([TableNode, TableRowNode, TableCellNode])) {\n throw new Error(\n 'TablePlugin: TableNode, TableRowNode, or TableCellNode is not registered on editor',\n )\n }\n\n return mergeRegister(\n editor.registerCommand(\n OPEN_TABLE_DRAWER_COMMAND,\n () => {\n let rangeSelection: null | RangeSelection = null\n\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n rangeSelection = selection\n }\n })\n\n if (rangeSelection) {\n toggleDrawer()\n }\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n )\n }, [cellContext, editor, toggleDrawer])\n\n return (\n <React.Fragment>\n <FieldsDrawer\n drawerSlug={drawerSlug}\n drawerTitle=\"Create Table\"\n featureKey=\"experimental_table\"\n handleDrawerSubmit={(_fields, data) => {\n if (!data.columns || !data.rows) {\n return\n }\n\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {\n columns: String(data.columns),\n rows: String(data.rows),\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n <LexicalReactTablePlugin\n hasCellBackgroundColor={false}\n hasCellMerge\n hasHorizontalScroll={true}\n />\n </React.Fragment>\n )\n}\n", "'use client'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport type { ExclusiveUploadFeatureProps } from '../server/index.js'\n\nimport { UploadIcon } from '../../../lexical/ui/icons/Upload/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from './drawer/commands.js'\nimport { $isUploadNode, UploadNode } from './nodes/UploadNode.js'\nimport { UploadPlugin } from './plugin/index.js'\n\nexport type UploadFeaturePropsClient = {\n collections: {\n [collection: string]: {\n hasExtraFields: boolean\n }\n }\n} & ExclusiveUploadFeatureProps\n\nexport const UploadFeatureClient = createClientFeature<UploadFeaturePropsClient>({\n nodes: [UploadNode],\n plugins: [\n {\n Component: UploadPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: UploadIcon,\n key: 'upload',\n keywords: ['upload', 'image', 'file', 'img', 'picture', 'photo', 'media'],\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: UploadIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isUploadNode(firstNode)\n },\n key: 'upload',\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n})\n", "'use client'\nimport React from 'react'\n\nexport const UploadIcon: React.FC = () => (\n <svg\n aria-hidden=\"true\"\n className=\"icon\"\n fill=\"none\"\n focusable=\"false\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M14.6667 4H5.33333C4.59695 4 4 4.59695 4 5.33333V14.6667C4 15.403 4.59695 16 5.33333 16H14.6667C15.403 16 16 15.403 16 14.6667V5.33333C16 4.59695 15.403 4 14.6667 4Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.99984 9.33366C8.73622 9.33366 9.33317 8.73671 9.33317 8.00033C9.33317 7.26395 8.73622 6.66699 7.99984 6.66699C7.26346 6.66699 6.6665 7.26395 6.6665 8.00033C6.6665 8.73671 7.26346 9.33366 7.99984 9.33366Z\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 11.9995L13.9427 9.94214C13.6926 9.69218 13.3536 9.55176 13 9.55176C12.6464 9.55176 12.3074 9.69218 12.0573 9.94214L6 15.9995\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "'use client'\nimport type { DOMConversionMap, EditorConfig, LexicalEditor, LexicalNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type {\n Internal_UploadData,\n SerializedUploadNode,\n UploadData,\n} from '../../server/nodes/UploadNode.js'\n\nimport { $convertUploadElement } from '../../server/nodes/conversions.js'\nimport { UploadServerNode } from '../../server/nodes/UploadNode.js'\nimport { PendingUploadComponent } from '../component/pending/index.js'\n\nconst RawUploadComponent = React.lazy(() =>\n import('../../client/component/index.js').then((module) => ({ default: module.UploadComponent })),\n)\n\nexport class UploadNode extends UploadServerNode {\n static override clone(node: UploadServerNode): UploadServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n override decorate(editor?: LexicalEditor, config?: EditorConfig): JSX.Element {\n if ((this.__data as Internal_UploadData).pending) {\n return <PendingUploadComponent />\n }\n return (\n <RawUploadComponent\n className={config?.theme?.upload ?? 'LexicalEditorTheme__upload'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedUploadNode {\n return super.exportJSON()\n }\n}\n\nexport function $createUploadNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n\n return $applyNodeReplacement(new UploadNode({ data: data as UploadData }))\n}\n\nexport function $isUploadNode(node: LexicalNode | null | undefined): node is UploadNode {\n return node instanceof UploadNode\n}\n", "// This file contains functions used to convert dom elements to upload or pending upload lexical nodes. It requires the actual node\n// creation functions to be passed in to stay compatible with both client and server code.\nimport type { DOMConversionOutput } from 'lexical'\n\nimport ObjectID from 'bson-objectid'\n\nimport type { $createUploadNode } from '../../client/nodes/UploadNode.js'\nimport type { $createUploadServerNode, Internal_UploadData } from './UploadNode.js'\n\nexport function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\n return (\n img.parentElement != null &&\n img.parentElement.tagName === 'LI' &&\n img.previousSibling === null &&\n img.getAttribute('aria-roledescription') === 'checkbox'\n )\n}\n\nexport function $convertUploadElement(\n domNode: HTMLImageElement,\n $createNode: typeof $createUploadNode | typeof $createUploadServerNode,\n): DOMConversionOutput | null {\n if (domNode.hasAttribute('data-lexical-pending-upload-form-id')) {\n const formID = domNode.getAttribute('data-lexical-pending-upload-form-id')\n\n if (formID != null) {\n const node = $createNode({\n data: {\n pending: {\n formID,\n src: domNode.getAttribute('src') || '',\n },\n } as Internal_UploadData,\n })\n return { node }\n }\n }\n if (\n domNode.hasAttribute('data-lexical-upload-relation-to') &&\n domNode.hasAttribute('data-lexical-upload-id')\n ) {\n const id = domNode.getAttribute('data-lexical-upload-id')\n const relationTo = domNode.getAttribute('data-lexical-upload-relation-to')\n\n if (id != null && relationTo != null) {\n const node = $createNode({\n data: {\n fields: {},\n relationTo,\n value: id,\n },\n })\n return { node }\n }\n }\n\n // Create pending UploadNode. Auto-Upload functionality will then be handled by the node transform\n const node = $createNode({\n data: {\n pending: {\n formID: new ObjectID.default().toHexString(),\n src: domNode.getAttribute('src') || '',\n },\n } as Internal_UploadData,\n })\n\n return { node }\n}\n", "import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type {\n CollectionSlug,\n DataFromCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { StronglyTypedLeafNode } from '../../../../nodeTypes.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in CollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\n/**\n * Internal use only - UploadData type that can contain a pending state\n * @internal\n */\nexport type Internal_UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n pending?: {\n /**\n * ID that corresponds to the bulk upload form ID\n */\n formID: string\n /**\n * src value of the image dom element\n */\n src: string\n }\n} & UploadData<TUploadExtraFieldsData>\n\n/**\n * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.\n * This type is for internal use only as it will be deprecated in the future.\n * @internal\n *\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TUploadExtraFieldsData\n /**\n * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n */\n id: string\n relationTo: TCollectionSlug\n /**\n * Value can be just the document ID, or the full, populated document\n */\n value: number | string | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode = StronglyTypedLeafNode<SerializedDecoratorBlockNode, 'upload'> &\n UploadData\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n", "'use client'\n\nimport { ShimmerEffect } from '@payloadcms/ui'\n\nimport '../index.scss'\n\nexport const PendingUploadComponent = (): React.ReactNode => {\n return (\n <div className={'lexical-upload'}>\n <ShimmerEffect height={'95px'} width={'203px'} />\n </div>\n )\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useBulkUpload, useEffectEvent, useModal } from '@payloadcms/ui'\nimport ObjectID from 'bson-objectid'\nimport {\n $createRangeSelection,\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_LOW,\n createCommand,\n DROP_COMMAND,\n getDOMSelectionFromTarget,\n isHTMLElement,\n PASTE_COMMAND,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { Internal_UploadData, UploadData } from '../../server/nodes/UploadNode.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { useEnabledRelationships } from '../../../relationship/client/utils/useEnabledRelationships.js'\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $createUploadNode, $isUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\ndeclare global {\n interface DragEvent {\n rangeOffset?: number\n rangeParent?: Node\n }\n}\n\nfunction canDropImage(event: DragEvent): boolean {\n const target = event.target\n return !!(\n isHTMLElement(target) &&\n !target.closest('code, span.editor-image') &&\n isHTMLElement(target.parentElement) &&\n target.parentElement.closest('div.ContentEditable__root')\n )\n}\n\nfunction getDragSelection(event: DragEvent): null | Range | undefined {\n // Source: https://github.com/AlessioGr/lexical/blob/main/packages/lexical-playground/src/plugins/ImagesPlugin/index.tsx\n let range\n const domSelection = getDOMSelectionFromTarget(event.target)\n if (document.caretRangeFromPoint) {\n range = document.caretRangeFromPoint(event.clientX, event.clientY)\n } else if (event.rangeParent && domSelection !== null) {\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0)\n range = domSelection.getRangeAt(0)\n } else {\n throw Error(`Cannot get the selection when dragging`)\n }\n\n return range\n}\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\ntype FileToUpload = {\n alt?: string\n file: File\n /**\n * Bulk Upload Form ID that should be created, which can then be matched\n * against the node formID if the upload is successful\n */\n formID: string\n}\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n collectionSlugsBlacklist: clientProps?.disabledCollections,\n collectionSlugsWhitelist: clientProps?.enabledCollections,\n uploads: true,\n })\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n\n const { isModalOpen, openModal } = useModal()\n\n const openBulkUpload = useEffectEvent(({ files }: { files: FileToUpload[] }) => {\n if (files?.length === 0) {\n return\n }\n\n setInitialForms((initialForms) => [\n ...(initialForms ?? []),\n ...files.map((file) => ({\n file: file.file,\n formID: file.formID,\n })),\n ])\n\n if (!isModalOpen(bulkUploadDrawerSlug)) {\n if (!enabledCollectionSlugs.length || !enabledCollectionSlugs[0]) {\n return\n }\n\n setCollectionSlug(enabledCollectionSlugs[0])\n setSelectableCollections(enabledCollectionSlugs)\n\n setOnCancel(() => {\n // Remove all the pending upload nodes that were added but not uploaded\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n\n if ($isUploadNode(node)) {\n const nodeData = node.getData()\n if ((nodeData as Internal_UploadData)?.pending) {\n node.remove()\n }\n }\n }\n })\n })\n\n setOnSuccess((newDocs) => {\n const newDocsMap = new Map(newDocs.map((doc) => [doc.formID, doc]))\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n if ($isUploadNode(node)) {\n const nodeData: Internal_UploadData = node.getData()\n\n if (nodeData?.pending) {\n const newDoc = newDocsMap.get(nodeData.pending?.formID)\n if (newDoc) {\n node.replace(\n $createUploadNode({\n data: {\n id: new ObjectID.default().toHexString(),\n fields: {},\n relationTo: newDoc.collectionSlug,\n value: newDoc.doc.id,\n } as UploadData,\n }),\n )\n }\n }\n }\n }\n })\n })\n\n openModal(bulkUploadDrawerSlug)\n }\n })\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n /**\n * Handle auto-uploading files if you copy & paste an image dom element from the clipboard\n */\n editor.registerNodeTransform(UploadNode, (node) => {\n const nodeData: Internal_UploadData = node.getData()\n if (!nodeData?.pending) {\n return\n }\n\n async function upload() {\n let transformedImage: FileToUpload | null = null\n\n const src = nodeData?.pending?.src\n const formID = nodeData?.pending?.formID as string\n\n if (src?.startsWith('data:')) {\n // It's a base64-encoded image\n const mimeMatch = src.match(/data:(image\\/[a-zA-Z]+);base64,/)\n const mimeType = mimeMatch ? mimeMatch[1] : 'image/png' // Default to PNG if MIME type not found\n const base64Data = src.replace(/^data:image\\/[a-zA-Z]+;base64,/, '')\n const byteCharacters = atob(base64Data)\n const byteNumbers = new Array(byteCharacters.length)\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers)\n const file = new File([byteArray], 'pasted-image.' + mimeType?.split('/', 2)[1], {\n type: mimeType,\n })\n transformedImage = { alt: undefined, file, formID }\n } else if (src?.startsWith('http') || src?.startsWith('https')) {\n // It's an image URL\n const res = await fetch(src)\n const blob = await res.blob()\n const inferredFileName =\n src.split('/').pop() || 'pasted-image' + blob.type.split('/', 2)[1]\n const file = new File([blob], inferredFileName, {\n type: blob.type,\n })\n\n transformedImage = { alt: undefined, file, formID }\n }\n\n if (!transformedImage) {\n return\n }\n\n openBulkUpload({ files: [transformedImage] })\n }\n void upload()\n }),\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n // Pending UploadNodes are automatically created when importDOM is called. However, if you paste a file from your computer\n // directly, importDOM won't be called, as it's not a HTML dom element. So we need to handle that case here.\n\n if (!(event instanceof ClipboardEvent)) {\n return false\n }\n const clipboardData = event.clipboardData\n\n if (!clipboardData?.types?.length || clipboardData?.types?.includes('text/html')) {\n // HTML is handled through importDOM => registerNodeTransform for pending UploadNode\n return false\n }\n\n const files: FileToUpload[] = []\n if (clipboardData?.files?.length) {\n Array.from(clipboardData.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Insert a pending UploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Handle drag & drop of files from the desktop into the editor\n editor.registerCommand(\n DROP_COMMAND,\n (event) => {\n if (!(event instanceof DragEvent)) {\n return false\n }\n\n const dt = event.dataTransfer\n\n if (!dt?.types?.length) {\n return false\n }\n\n const files: FileToUpload[] = []\n if (dt?.files?.length) {\n Array.from(dt.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Prevent the default browser drop handling, which would open the file in the browser\n event.preventDefault()\n event.stopPropagation()\n\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n if (canDropImage(event)) {\n const range = getDragSelection(event)\n const selection = $createRangeSelection()\n if (range !== null && range !== undefined) {\n selection.applyDOMRange(range)\n }\n $setSelection(selection)\n\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\nimport type { ListDrawerProps } from '@payloadcms/ui'\nimport type { LexicalEditor } from 'lexical'\nimport type { UploadCollectionSlug } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { toast } from '@payloadcms/ui'\nimport { $getNodeByKey, COMMAND_PRIORITY_EDITOR } from 'lexical'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useLexicalListDrawer } from '../../../../utilities/fieldsDrawer/useLexicalListDrawer.js'\nimport { $createUploadNode } from '../nodes/UploadNode.js'\nimport { INSERT_UPLOAD_COMMAND } from '../plugin/index.js'\nimport { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from './commands.js'\n\nconst insertUpload = ({\n editor,\n relationTo,\n replaceNodeKey,\n value,\n}: {\n editor: LexicalEditor\n relationTo: string\n replaceNodeKey: null | string\n value: number | string\n}) => {\n if (!replaceNodeKey) {\n editor.dispatchCommand(INSERT_UPLOAD_COMMAND, {\n // @ts-expect-error - TODO: fix this\n fields: null,\n relationTo,\n value,\n })\n } else {\n editor.update(() => {\n const node = $getNodeByKey(replaceNodeKey)\n if (node) {\n node.replace(\n $createUploadNode({\n data: {\n // @ts-expect-error - TODO: fix this\n fields: null,\n relationTo,\n value,\n },\n }),\n )\n }\n })\n }\n}\n\ntype Props = {\n enabledCollectionSlugs: UploadCollectionSlug[]\n}\n\nconst UploadDrawerComponent: React.FC<Props> = ({ enabledCollectionSlugs }) => {\n const [editor] = useLexicalComposerContext()\n\n const [replaceNodeKey, setReplaceNodeKey] = useState<null | string>(null)\n\n const { closeListDrawer, ListDrawer, openListDrawer } = useLexicalListDrawer({\n collectionSlugs: enabledCollectionSlugs,\n uploads: true,\n })\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_UPLOAD_WITH_DRAWER_COMMAND,\n (payload) => {\n setReplaceNodeKey(payload?.replace ? payload?.replace.nodeKey : null)\n openListDrawer()\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor, openListDrawer])\n\n const onSelect = useCallback<NonNullable<ListDrawerProps['onSelect']>>(\n ({ collectionSlug, doc }) => {\n closeListDrawer()\n insertUpload({\n editor,\n relationTo: collectionSlug,\n replaceNodeKey,\n value: doc.id,\n })\n },\n [editor, closeListDrawer, replaceNodeKey],\n )\n\n return <ListDrawer onSelect={onSelect} />\n}\n\nconst UploadDrawerComponentFallback: React.FC = () => {\n const [editor] = useLexicalComposerContext()\n\n useEffect(() => {\n return editor.registerCommand<{\n replace: { nodeKey: string } | false\n }>(\n INSERT_UPLOAD_WITH_DRAWER_COMMAND,\n () => {\n toast.error('No upload collections enabled')\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n )\n }, [editor])\n\n return null\n}\n\nexport const UploadDrawer = ({ enabledCollectionSlugs }: Props): React.ReactNode => {\n if (!enabledCollectionSlugs?.length) {\n return <UploadDrawerComponentFallback />\n }\n\n return <UploadDrawerComponent enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n", "'use client'\n\nimport type { EditorConfig as LexicalEditorConfig } from 'lexical'\nimport type { RichTextFieldClient } from 'payload'\n\nimport { ShimmerEffect, useConfig } from '@payloadcms/ui'\nimport React, { lazy, Suspense, useEffect, useState } from 'react'\n\nimport type { FeatureProviderClient } from '../features/typesClient.js'\nimport type { SanitizedClientEditorConfig } from '../lexical/config/types.js'\nimport type { LexicalFieldAdminClientProps, LexicalRichTextFieldProps } from '../types.js'\n\nimport { defaultEditorLexicalConfig } from '../lexical/config/client/default.js'\nimport { loadClientFeatures } from '../lexical/config/client/loader.js'\nimport { sanitizeClientEditorConfig } from '../lexical/config/client/sanitize.js'\nimport { RichTextViewProvider, useRichTextView } from './RichTextViewProvider.js'\n\nconst RichTextEditor = lazy(() =>\n import('./Field.js').then((module) => ({ default: module.RichText })),\n)\n\nexport const RichTextField: React.FC<LexicalRichTextFieldProps> = (props) => {\n return (\n <RichTextViewProvider views={props.views}>\n <RichTextFieldImpl {...props} />\n </RichTextViewProvider>\n )\n}\n\nexport const RichTextFieldImpl: React.FC<LexicalRichTextFieldProps> = (props) => {\n const {\n admin: _admin = {},\n clientFeatures,\n featureClientImportMap = {},\n featureClientSchemaMap,\n field,\n lexicalEditorConfig: _lexicalEditorConfig = defaultEditorLexicalConfig,\n schemaPath,\n views,\n } = props\n const { currentView } = useRichTextView()\n const currentViewAdminConfig: LexicalFieldAdminClientProps = views?.[currentView]?.admin ?? _admin\n const currentViewLexicalEditorConfig: LexicalEditorConfig =\n views?.[currentView]?.lexical ?? _lexicalEditorConfig\n\n const { config } = useConfig()\n\n const [finalSanitizedEditorConfig, setFinalSanitizedEditorConfig] =\n useState<null | SanitizedClientEditorConfig>(null)\n\n useEffect(() => {\n if (finalSanitizedEditorConfig && finalSanitizedEditorConfig.view === currentView) {\n return\n }\n\n const featureProvidersLocal: FeatureProviderClient<any, any>[] = []\n for (const clientFeature of Object.values(clientFeatures)) {\n if (!clientFeature.clientFeatureProvider) {\n continue\n }\n featureProvidersLocal.push(\n clientFeature.clientFeatureProvider(clientFeature.clientFeatureProps),\n ) // Execute the clientFeatureProvider function here, as the server cannot execute functions imported from use client files\n }\n\n const resolvedClientFeatures = loadClientFeatures({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field: field as RichTextFieldClient,\n schemaPath: schemaPath ?? field.name,\n unSanitizedEditorConfig: {\n features: featureProvidersLocal,\n lexical: currentViewLexicalEditorConfig,\n },\n })\n\n setFinalSanitizedEditorConfig(\n sanitizeClientEditorConfig(\n resolvedClientFeatures,\n currentViewLexicalEditorConfig,\n currentViewAdminConfig,\n currentView,\n ),\n )\n }, [\n currentViewAdminConfig,\n clientFeatures,\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field,\n finalSanitizedEditorConfig,\n currentViewLexicalEditorConfig,\n schemaPath,\n currentView,\n ]) // TODO: Optimize this and use useMemo for this in the future. This might break sub-richtext-blocks from the blocks feature. Need to investigate\n\n return (\n <Suspense fallback={<ShimmerEffect height=\"35vh\" />}>\n {finalSanitizedEditorConfig && (\n <RichTextEditor\n {...props}\n editorConfig={finalSanitizedEditorConfig}\n key={finalSanitizedEditorConfig.view}\n />\n )}\n </Suspense>\n )\n}\n", "import type { EditorThemeClasses } from 'lexical'\n\nexport const LexicalEditorTheme: EditorThemeClasses = {\n block: 'LexicalEditorTheme__block',\n blockCursor: 'LexicalEditorTheme__blockCursor',\n characterLimit: 'LexicalEditorTheme__characterLimit',\n code: 'LexicalEditorTheme__code',\n inlineBlock: 'LexicalEditorTheme__inlineBlock',\n\n heading: {\n h1: 'LexicalEditorTheme__h1',\n h2: 'LexicalEditorTheme__h2',\n h3: 'LexicalEditorTheme__h3',\n h4: 'LexicalEditorTheme__h4',\n h5: 'LexicalEditorTheme__h5',\n h6: 'LexicalEditorTheme__h6',\n },\n hr: 'LexicalEditorTheme__hr',\n hrSelected: 'LexicalEditorTheme__hrSelected',\n indent: 'LexicalEditorTheme__indent',\n link: 'LexicalEditorTheme__link',\n list: {\n checklist: 'LexicalEditorTheme__checklist',\n listitem: 'LexicalEditorTheme__listItem',\n listitemChecked: 'LexicalEditorTheme__listItemChecked',\n listitemUnchecked: 'LexicalEditorTheme__listItemUnchecked',\n nested: {\n listitem: 'LexicalEditorTheme__nestedListItem',\n },\n olDepth: [\n 'LexicalEditorTheme__ol1',\n 'LexicalEditorTheme__ol2',\n 'LexicalEditorTheme__ol3',\n 'LexicalEditorTheme__ol4',\n 'LexicalEditorTheme__ol5',\n ],\n ul: 'LexicalEditorTheme__ul',\n },\n ltr: 'LexicalEditorTheme__ltr',\n mark: 'LexicalEditorTheme__mark',\n markOverlap: 'LexicalEditorTheme__markOverlap',\n paragraph: 'LexicalEditorTheme__paragraph',\n placeholder: 'LexicalEditorTheme__placeholder',\n quote: 'LexicalEditorTheme__quote',\n relationship: 'LexicalEditorTheme__relationship',\n rtl: 'LexicalEditorTheme__rtl',\n tab: 'LexicalEditorTheme__tabNode',\n table: 'LexicalEditorTheme__table',\n tableAddColumns: 'LexicalEditorTheme__tableAddColumns',\n tableAddRows: 'LexicalEditorTheme__tableAddRows',\n tableAlignment: {\n center: 'LexicalEditorTheme__tableAlignmentCenter',\n right: 'LexicalEditorTheme__tableAlignmentRight',\n },\n tableCell: 'LexicalEditorTheme__tableCell',\n tableCellActionButton: 'LexicalEditorTheme__tableCellActionButton',\n tableCellActionButtonContainer: 'LexicalEditorTheme__tableCellActionButtonContainer',\n tableCellHeader: 'LexicalEditorTheme__tableCellHeader',\n tableCellResizer: 'LexicalEditorTheme__tableCellResizer',\n tableCellSelected: 'LexicalEditorTheme__tableCellSelected',\n tableFrozenColumn: 'LexicalEditorTheme__tableFrozenColumn',\n tableRowStriping: 'LexicalEditorTheme__tableRowStriping',\n tableScrollableWrapper: 'LexicalEditorTheme__tableScrollableWrapper',\n tableSelected: 'LexicalEditorTheme__tableSelected',\n tableSelection: 'LexicalEditorTheme__tableSelection',\n text: {\n bold: 'LexicalEditorTheme__textBold',\n code: 'LexicalEditorTheme__textCode',\n italic: 'LexicalEditorTheme__textItalic',\n strikethrough: 'LexicalEditorTheme__textStrikethrough',\n subscript: 'LexicalEditorTheme__textSubscript',\n superscript: 'LexicalEditorTheme__textSuperscript',\n underline: 'LexicalEditorTheme__textUnderline',\n underlineStrikethrough: 'LexicalEditorTheme__textUnderlineStrikethrough',\n },\n upload: 'LexicalEditorTheme__upload',\n}\n", "'use client'\nimport type { EditorConfig as LexicalEditorConfig } from 'lexical'\n\nimport { LexicalEditorTheme } from '../../theme/EditorTheme.js'\n\nexport const defaultEditorLexicalConfig: LexicalEditorConfig = {\n namespace: 'lexical',\n theme: LexicalEditorTheme,\n}\n", "'use client'\n\nimport type { ClientConfig, RichTextFieldClient } from 'payload'\n\nimport type {\n ClientFeatureProviderMap,\n ResolvedClientFeature,\n ResolvedClientFeatureMap,\n} from '../../../features/typesClient.js'\nimport type { FeatureClientSchemaMap } from '../../../types.js'\nimport type { ClientEditorConfig } from '../types.js'\n\n/**\n * This function expects client functions to ALREADY be ordered & dependencies checked on the server\n * @param unSanitizedEditorConfig\n */\nexport function loadClientFeatures({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n field,\n schemaPath,\n unSanitizedEditorConfig,\n}: {\n config: ClientConfig\n featureClientImportMap: Record<string, any>\n featureClientSchemaMap: FeatureClientSchemaMap\n field?: RichTextFieldClient\n schemaPath: string\n unSanitizedEditorConfig: ClientEditorConfig\n}): ResolvedClientFeatureMap {\n const featureProviderMap: ClientFeatureProviderMap = new Map()\n\n for (const featureProvider of unSanitizedEditorConfig.features) {\n if (\n !featureProvider?.clientFeatureProps?.featureKey ||\n featureProvider?.clientFeatureProps?.order === undefined ||\n featureProvider?.clientFeatureProps?.order === null\n ) {\n throw new Error(\n 'A Feature you have installed does not return the client props as clientFeatureProps. Please make sure to always return those props, even if they are null, as other important props like order and featureKey are later on injected.',\n )\n }\n featureProviderMap.set(featureProvider.clientFeatureProps.featureKey, featureProvider)\n }\n\n // sort unSanitizedEditorConfig.features by order\n unSanitizedEditorConfig.features = unSanitizedEditorConfig.features.sort(\n (a, b) => a.clientFeatureProps.order - b.clientFeatureProps.order,\n )\n\n const resolvedFeatures: ResolvedClientFeatureMap = new Map()\n\n // Make sure all dependencies declared in the respective features exist\n let loaded = 0\n for (const featureProvider of unSanitizedEditorConfig.features) {\n const feature: Partial<ResolvedClientFeature<any>> =\n typeof featureProvider.feature === 'function'\n ? featureProvider.feature({\n config,\n featureClientImportMap,\n featureClientSchemaMap,\n featureProviderMap,\n field,\n resolvedFeatures,\n schemaPath,\n unSanitizedEditorConfig,\n })\n : featureProvider.feature\n\n feature.key = featureProvider.clientFeatureProps.featureKey\n feature.order = loaded\n\n resolvedFeatures.set(\n featureProvider.clientFeatureProps.featureKey,\n feature as ResolvedClientFeature<any>,\n )\n\n loaded++\n }\n\n return resolvedFeatures\n}\n", "'use client'\n\nimport type { EditorConfig as LexicalEditorConfig } from 'lexical'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { ToolbarGroup } from '../../../features/toolbars/types.js'\nimport type {\n ResolvedClientFeatureMap,\n SanitizedClientFeatures,\n} from '../../../features/typesClient.js'\nimport type { LexicalFieldAdminClientProps } from '../../../types.js'\nimport type { SanitizedClientEditorConfig } from '../types.js'\n\nexport const sanitizeClientFeatures = (\n features: ResolvedClientFeatureMap,\n): SanitizedClientFeatures => {\n const sanitized: SanitizedClientFeatures = {\n enabledFeatures: [],\n enabledFormats: [],\n markdownTransformers: [],\n nodes: [],\n plugins: [],\n providers: [],\n slashMenu: {\n dynamicGroups: [],\n groups: [],\n },\n toolbarFixed: {\n groups: [],\n },\n toolbarInline: {\n groups: [],\n },\n }\n\n // Allow customization of groups for toolbarFixed\n let customGroups: Record<string, Partial<ToolbarGroup>> = {}\n features.forEach((feature) => {\n if (feature.key === 'toolbarFixed' && feature.sanitizedClientFeatureProps?.customGroups) {\n customGroups = {\n ...customGroups,\n ...feature.sanitizedClientFeatureProps.customGroups,\n }\n }\n })\n\n if (!features?.size) {\n return sanitized\n }\n\n features.forEach((feature) => {\n if (feature.providers?.length) {\n sanitized.providers = sanitized.providers.concat(feature.providers)\n }\n\n if (feature.enableFormats?.length) {\n sanitized.enabledFormats.push(...feature.enableFormats)\n }\n\n if (feature.nodes?.length) {\n // Important: do not use concat\n for (const node of feature.nodes) {\n sanitized.nodes.push(node)\n }\n }\n if (feature.plugins?.length) {\n feature.plugins.forEach((plugin, i) => {\n sanitized.plugins?.push({\n clientProps: feature.sanitizedClientFeatureProps,\n Component: plugin.Component as any, // Appeases strict: true\n key: feature.key + i,\n position: plugin.position,\n })\n })\n }\n\n if (feature.toolbarInline?.groups?.length) {\n for (const group of feature.toolbarInline.groups) {\n // 1. find the group with the same key or create new one\n let foundGroup = sanitized.toolbarInline.groups.find(\n (sanitizedGroup) => sanitizedGroup.key === group.key,\n )\n if (!foundGroup) {\n foundGroup = {\n ...group,\n items: [],\n }\n } else {\n sanitized.toolbarInline.groups = sanitized.toolbarInline.groups.filter(\n (sanitizedGroup) => sanitizedGroup.key !== group.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (group?.items?.length) {\n foundGroup.items = foundGroup.items.concat(group.items)\n }\n sanitized.toolbarInline?.groups.push(foundGroup)\n }\n }\n\n if (feature.toolbarFixed?.groups?.length) {\n for (const group of feature.toolbarFixed.groups) {\n // 1. find the group with the same key or create new one\n let foundGroup = sanitized.toolbarFixed.groups.find(\n (sanitizedGroup) => sanitizedGroup.key === group.key,\n )\n if (!foundGroup) {\n foundGroup = {\n ...group,\n items: [],\n }\n } else {\n sanitized.toolbarFixed.groups = sanitized.toolbarFixed.groups.filter(\n (sanitizedGroup) => sanitizedGroup.key !== group.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (group?.items?.length) {\n foundGroup.items = foundGroup.items.concat(group.items)\n }\n sanitized.toolbarFixed?.groups.push(foundGroup)\n }\n }\n\n if (feature.slashMenu?.groups) {\n if (feature.slashMenu.dynamicGroups?.length) {\n sanitized.slashMenu.dynamicGroups = sanitized.slashMenu.dynamicGroups.concat(\n feature.slashMenu.dynamicGroups,\n )\n }\n\n for (const optionGroup of feature.slashMenu.groups) {\n // 1. find the group with the same name or create new one\n let group = sanitized.slashMenu.groups.find((group) => group.key === optionGroup.key)\n if (!group) {\n group = {\n ...optionGroup,\n items: [],\n }\n } else {\n sanitized.slashMenu.groups = sanitized.slashMenu.groups.filter(\n (group) => group.key !== optionGroup.key,\n )\n }\n\n // 2. Add options to group options array and add to sanitized.slashMenu.groupsWithOptions\n if (optionGroup?.items?.length) {\n group.items = group.items.concat(optionGroup.items)\n }\n sanitized.slashMenu.groups.push(group)\n }\n }\n\n if (feature.markdownTransformers?.length) {\n // Important: do not use concat\n for (const transformer of feature.markdownTransformers) {\n if (typeof transformer === 'function') {\n sanitized.markdownTransformers.push(\n transformer({\n allNodes: sanitized.nodes,\n allTransformers: sanitized.markdownTransformers,\n }),\n )\n } else {\n sanitized.markdownTransformers.push(transformer)\n }\n }\n }\n sanitized.enabledFeatures.push(feature.key)\n })\n\n // Apply custom group configurations to toolbarFixed groups\n if (Object.keys(customGroups).length > 0) {\n sanitized.toolbarFixed.groups = sanitized.toolbarFixed.groups.map((group) => {\n const customConfig = customGroups[group.key]\n if (customConfig) {\n return deepMerge(group, customConfig)\n }\n return group\n })\n }\n\n // Sort sanitized.toolbarInline.groups by order property\n sanitized.toolbarInline.groups.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n // Sort sanitized.toolbarFixed.groups by order property\n sanitized.toolbarFixed.groups.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n\n // Sort sanitized.toolbarInline.groups.[group].entries by order property\n for (const group of sanitized.toolbarInline.groups) {\n group.items.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n }\n\n // Sort sanitized.toolbarFixed.groups.[group].entries by order property\n for (const group of sanitized.toolbarFixed.groups) {\n group.items.sort((a, b) => {\n if (a.order && b.order) {\n return a.order - b.order\n } else if (a.order) {\n return -1\n } else if (b.order) {\n return 1\n } else {\n return 0\n }\n })\n }\n\n return sanitized\n}\n\nexport function sanitizeClientEditorConfig(\n resolvedClientFeatureMap: ResolvedClientFeatureMap,\n lexical?: LexicalEditorConfig,\n admin?: LexicalFieldAdminClientProps,\n view?: string,\n): SanitizedClientEditorConfig {\n return {\n admin,\n features: sanitizeClientFeatures(resolvedClientFeatureMap),\n lexical: lexical!,\n resolvedFeatureMap: resolvedClientFeatureMap,\n view,\n }\n}\n", "'use client'\n\n/**\n * @deprecated - remove in 4.0. lexical already exports an isHTMLElement utility\n */\nexport function isHTMLElement(x: unknown): x is HTMLElement {\n return x instanceof HTMLElement\n}\n", "'use client'\nexport function joinClasses(...args: Array<boolean | null | string | undefined>): string {\n return args.filter(Boolean).join(' ')\n}\n", "'use client'\ntype Force = [number, number]\ntype Listener = (force: Force, e: TouchEvent) => void\ninterface ElementValues {\n handleTouchend: (e: TouchEvent) => void\n handleTouchstart: (e: TouchEvent) => void\n listeners: Set<Listener>\n start: Force | null\n}\n\nconst elements = new WeakMap<HTMLElement, ElementValues>()\n\nfunction readTouch(e: TouchEvent): [number, number] | null {\n const touch = e.changedTouches[0]\n if (touch === undefined) {\n return null\n }\n return [touch.clientX, touch.clientY]\n}\n\nfunction addListener(element: HTMLElement, cb: Listener): () => void {\n let elementValues = elements.get(element)\n if (elementValues === undefined) {\n const listeners = new Set<Listener>()\n const handleTouchstart = (e: TouchEvent): void => {\n if (elementValues !== undefined) {\n elementValues.start = readTouch(e)\n }\n }\n const handleTouchend = (e: TouchEvent): void => {\n if (elementValues === undefined) {\n return\n }\n const { start } = elementValues\n if (start === null) {\n return\n }\n const end = readTouch(e)\n for (const listener of listeners) {\n if (end !== null) {\n listener([end[0] - start[0], end[1] - start[1]], e)\n }\n }\n }\n element.addEventListener('touchstart', handleTouchstart)\n element.addEventListener('touchend', handleTouchend)\n\n elementValues = {\n handleTouchend,\n handleTouchstart,\n listeners,\n start: null,\n }\n elements.set(element, elementValues)\n }\n elementValues.listeners.add(cb)\n return () => {\n deleteListener(element, cb)\n }\n}\n\nfunction deleteListener(element: HTMLElement, cb: Listener): void {\n const elementValues = elements.get(element)\n if (elementValues === undefined) {\n return\n }\n const { listeners } = elementValues\n listeners.delete(cb)\n if (listeners.size === 0) {\n elements.delete(element)\n element.removeEventListener('touchstart', elementValues.handleTouchstart)\n element.removeEventListener('touchend', elementValues.handleTouchend)\n }\n}\n\nexport function addSwipeLeftListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (x < 0 && -x > Math.abs(y)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeRightListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (x > 0 && x > Math.abs(y)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeUpListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (y < 0 && -y > Math.abs(x)) {\n cb(x, e)\n }\n })\n}\n\nexport function addSwipeDownListener(\n element: HTMLElement,\n cb: (_force: number, e: TouchEvent) => void,\n): () => void {\n return addListener(element, (force, e) => {\n const [x, y] = force\n if (y > 0 && y > Math.abs(x)) {\n cb(x, e)\n }\n })\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockEditButton = () => {\n const { EditButton } = useInlineBlockComponentContext()\n\n return EditButton ? <EditButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockRemoveButton = () => {\n const { RemoveButton } = useInlineBlockComponentContext()\n\n return RemoveButton ? <RemoveButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockLabel = () => {\n const { Label } = useInlineBlockComponentContext()\n\n return Label ? <Label /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useInlineBlockComponentContext } from '../index.js'\n\nexport const InlineBlockContainer = ({ children }: { children: React.ReactNode }) => {\n const { InlineBlockContainer } = useInlineBlockComponentContext()\n\n return InlineBlockContainer ? <InlineBlockContainer>{children}</InlineBlockContainer> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { type BlockCollapsibleProps, useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockCollapsible: React.FC<BlockCollapsibleProps> = (props) => {\n const { children, ...rest } = props\n const { BlockCollapsible } = useBlockComponentContext()\n\n return BlockCollapsible ? <BlockCollapsible {...rest}>{children}</BlockCollapsible> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockEditButton = () => {\n const { EditButton } = useBlockComponentContext()\n\n return EditButton ? <EditButton /> : null\n}\n", "'use client'\nimport React from 'react'\n\nimport { useBlockComponentContext } from '../BlockContent.js'\n\nexport const BlockRemoveButton = () => {\n const { RemoveButton } = useBlockComponentContext()\n\n return RemoveButton ? <RemoveButton /> : null\n}\n", "import { stringify } from 'qs-esm'\n\nimport type { HTMLPopulateFn } from '../lexicalToHtml/async/types.js'\n\nexport const getRestPopulateFn: (args: {\n /**\n * E.g. `http://localhost:3000/api`\n */\n apiURL: string\n depth?: number\n draft?: boolean\n locale?: string\n}) => HTMLPopulateFn = ({ apiURL, depth, draft, locale }) => {\n const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => {\n const query = stringify(\n { depth: depth ?? 0, draft: draft ?? false, locale, select },\n { addQueryPrefix: true },\n )\n\n const res = await fetch(`${apiURL}/${collectionSlug}/${id}${query}`, {\n credentials: 'include',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n method: 'GET',\n }).then((res) => res.json())\n\n return res\n }\n\n return populateFn\n}\n", "import type { BlockJSX } from 'payload'\n\n/**\n * @internal\n * @experimental - API may change in minor releases\n */\nexport const codeConverter: BlockJSX = {\n customEndRegex: {\n optional: true,\n regExp: /[ \\t]*```$/,\n },\n customStartRegex: /^[ \\t]*```(\\w+)?/,\n doNotTrimChildren: true,\n export: ({ fields }) => {\n const isSingleLine = !fields.code.includes('\\n') && !fields.language?.length\n if (isSingleLine) {\n return '```' + fields.code + '```'\n }\n\n return '```' + (fields.language || '') + (fields.code ? '\\n' + fields.code : '') + '\\n' + '```'\n },\n import: ({ children, closeMatch, openMatch }) => {\n const language = openMatch?.[1]\n\n // Removed first and last \\n from children if present\n if (children.startsWith('\\n')) {\n children = children.slice(1)\n }\n if (children.endsWith('\\n')) {\n children = children.slice(0, -1)\n }\n\n const isSingleLineAndComplete =\n !!closeMatch && !children.includes('\\n') && openMatch?.input?.trim() !== '```' + language\n\n if (isSingleLineAndComplete) {\n return {\n code: language + (children?.length ? children : ''), // No need to add space to children as they are not trimmed\n language: '',\n }\n }\n\n return {\n code: children,\n language,\n }\n },\n}\n", "'use client'\n\nimport type { CodeFieldClient, CodeFieldClientProps } from 'payload'\n\nimport { CodeField, useFormFields } from '@payloadcms/ui'\nimport React, { useId, useMemo } from 'react'\n\nimport { defaultLanguages } from './defaultLanguages.js'\n\nexport type AdditionalCodeComponentProps = {\n /**\n * @default first key of the `languages` prop\n */\n defaultLanguage?: string\n /**\n * @default all languages supported by Monaco Editor\n */\n languages?: Record<string, string>\n /**\n * Override the name of the block.\n *\n * @default 'Code'\n */\n slug?: string\n /**\n * Configure typescript settings for the editor\n */\n typescript?: {\n /**\n * By default, the editor will not perform semantic validation. This means that\n * while syntax errors will be highlighted, other issues like missing imports or incorrect\n * types will not be.\n *\n * @default false\n */\n enableSemanticValidation?: boolean\n /**\n * Additional types to fetch and include in the editor for autocompletion.\n *\n * For example, to include types for payload, you would set this to\n *\n * [{ url: 'https://unpkg.com/payload@latest/dist/index.d.ts', filePath: 'file:///node_modules/payload/index.d.ts' }]\n */\n fetchTypes?: Array<{\n filePath: string\n url: string\n }>\n /**\n * @default undefined\n */\n paths?: Record<string, string[]>\n /**\n * @default \"ESNext\"\n */\n target?: string\n /**\n * @default ['node_modules/@types']\n */\n typeRoots?: string[]\n }\n}\n\nexport const CodeComponent: React.FC<AdditionalCodeComponentProps & CodeFieldClientProps> = ({\n autoComplete,\n field,\n forceRender,\n languages = defaultLanguages,\n path,\n permissions,\n readOnly,\n renderedBlocks,\n schemaPath,\n typescript,\n validate,\n}) => {\n const languageField = useFormFields(([fields]) => fields['language'])\n\n const language: string =\n (languageField?.value as string) || (languageField?.initialValue as string) || 'typescript'\n\n // unique id per component instance to ensure Monaco creates a distinct model\n // for each TypeScript code block. Using React's useId is SSR-safe and builtin.\n const instanceId = useId()\n\n const label = languages[language]\n\n const props: CodeFieldClient = useMemo<CodeFieldClient>(\n () => ({\n ...field,\n type: 'code',\n admin: {\n ...field.admin,\n editorOptions: {},\n editorProps: {\n // If typescript is set, @monaco-editor/react needs to set the URI to a .ts or .tsx file when it calls createModel().\n // Provide a unique defaultPath per instance so Monaco doesn't reuse the same model\n // across multiple code block instances. We use field.name + instanceId for debugability.\n defaultPath: language === 'ts' ? `file-${field.name}-${instanceId}.tsx` : undefined,\n },\n language,\n },\n }),\n [field, language, instanceId],\n )\n\n const key = `${field.name}-${language}-${label}`\n\n return (\n props && (\n <CodeField\n autoComplete={autoComplete}\n field={props}\n forceRender={forceRender}\n key={key}\n onMount={(_editor, monaco) => {\n monaco.editor.defineTheme('vs-dark', {\n base: 'vs-dark',\n colors: {\n 'editor.background': '#222222',\n },\n inherit: true,\n rules: [],\n })\n\n monaco.editor.defineTheme('vs', {\n base: 'vs',\n colors: {\n 'editor.background': '#f5f5f5',\n },\n inherit: true,\n rules: [],\n })\n monaco.languages.typescript.typescriptDefaults.setCompilerOptions({\n allowNonTsExtensions: true,\n // Set module resolution to NodeJs to enable autocompletion\n allowJs: true,\n allowSyntheticDefaultImports: true,\n esModuleInterop: true,\n jsx: monaco.languages.typescript.JsxEmit.React,\n moduleResolution: monaco.languages.typescript.ModuleResolutionKind.NodeJs,\n noEmit: true,\n paths: typescript?.paths,\n reactNamespace: 'React',\n target: monaco.languages.typescript.ScriptTarget[\n typescript?.target ?? ('ESNext' as any)\n ] as any,\n typeRoots: typescript?.typeRoots ?? ['node_modules/@types'],\n })\n\n monaco.languages.typescript.typescriptDefaults.setDiagnosticsOptions({\n noSemanticValidation: typescript?.enableSemanticValidation ? false : true,\n noSyntaxValidation: false,\n })\n\n const run = async () => {\n if (\n typescript?.fetchTypes &&\n Array.isArray(typescript.fetchTypes) &&\n typescript.fetchTypes.length > 0\n ) {\n await Promise.all(\n typescript.fetchTypes.map(async (type) => {\n const types = await fetch(type.url)\n const typesText = await types.text()\n monaco.languages.typescript.typescriptDefaults.addExtraLib(\n typesText,\n type.filePath,\n )\n }),\n )\n }\n }\n void run()\n }}\n path={path}\n permissions={permissions}\n readOnly={readOnly}\n renderedBlocks={renderedBlocks}\n schemaPath={schemaPath}\n validate={validate}\n />\n )\n )\n}\n", "/**\n * Source: https://github.com/microsoft/monaco-editor/tree/main/src/basic-languages\n */\nexport const defaultLanguages: Record<string, string> = {\n abap: 'ABAP',\n apex: 'Apex',\n azcli: 'Azure CLI',\n bat: 'Batch',\n bicep: 'Bicep',\n cameligo: 'CameLIGO',\n clojure: 'Clojure',\n coffee: 'CoffeeScript',\n cpp: 'C++',\n csharp: 'C#',\n csp: 'CSP',\n css: 'CSS',\n cypher: 'Cypher',\n dart: 'Dart',\n dockerfile: 'Dockerfile',\n ecl: 'ECL',\n elixir: 'Elixir',\n flow9: 'Flow9',\n freemarker2: 'FreeMarker 2',\n fsharp: 'F#',\n go: 'Go',\n graphql: 'GraphQL',\n handlebars: 'Handlebars',\n hcl: 'HCL',\n html: 'HTML',\n ini: 'INI',\n java: 'Java',\n javascript: 'JavaScript',\n julia: 'Julia',\n kotlin: 'Kotlin',\n less: 'Less',\n lexon: 'Lexon',\n liquid: 'Liquid',\n lua: 'Lua',\n m3: 'M3',\n markdown: 'Markdown',\n mdx: 'MDX',\n mips: 'MIPS',\n msdax: 'DAX',\n mysql: 'MySQL',\n 'objective-c': 'Objective-C',\n pascal: 'Pascal',\n pascaligo: 'PascaLIGO',\n perl: 'Perl',\n pgsql: 'PostgreSQL',\n php: 'PHP',\n pla: 'PLA',\n plaintext: 'Plain Text',\n postiats: 'Postiats',\n powerquery: 'Power Query',\n powershell: 'PowerShell',\n protobuf: 'Protobuf',\n pug: 'Pug',\n python: 'Python',\n qsharp: 'Q#',\n r: 'R',\n razor: 'Razor',\n redis: 'Redis',\n redshift: 'Amazon Redshift',\n restructuredtext: 'reStructuredText',\n ruby: 'Ruby',\n rust: 'Rust',\n sb: 'Small Basic',\n scala: 'Scala',\n scheme: 'Scheme',\n scss: 'SCSS',\n shell: 'Shell',\n solidity: 'Solidity',\n sophia: 'Sophia',\n sparql: 'SPARQL',\n sql: 'SQL',\n st: 'Structured Text',\n swift: 'Swift',\n systemverilog: 'SystemVerilog',\n tcl: 'Tcl',\n twig: 'Twig',\n typescript: 'TypeScript',\n typespec: 'TypeSpec',\n vb: 'Visual Basic',\n wgsl: 'WGSL',\n xml: 'XML',\n yaml: 'YAML',\n}\n", "'use client'\nimport type { ComboboxEntry } from '@payloadcms/ui'\nimport type {} from 'payload'\n\nimport './index.scss'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n ChevronIcon,\n Combobox,\n CopyToClipboard,\n PopupList,\n RenderFields,\n useForm,\n useFormFields,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { AdditionalCodeComponentProps } from './Code.js'\n\nimport { CodeBlockIcon } from '../../../../../lexical/ui/icons/CodeBlock/index.js'\nimport { useBlockComponentContext } from '../../../client/component/BlockContent.js'\nimport { Collapse } from './Collapse/index.js'\nimport { defaultLanguages } from './defaultLanguages.js'\nimport { FloatingCollapse } from './FloatingCollapse/index.js'\n\nconst baseClass = 'payload-richtext-code-block'\nexport const CodeBlockBlockComponent: React.FC<Pick<AdditionalCodeComponentProps, 'languages'>> = (\n args,\n) => {\n const { languages: languagesFromProps } = args\n const languages = languagesFromProps || defaultLanguages\n\n const { BlockCollapsible, formSchema, RemoveButton } = useBlockComponentContext()\n const { setModified } = useForm()\n const { t } = useTranslation()\n\n const { codeField } = useFormFields(([fields]) => ({\n codeField: fields?.code,\n }))\n\n const { selectedLanguageField, setSelectedLanguage } = useFormFields(([fields, dispatch]) => ({\n selectedLanguageField: fields?.language,\n setSelectedLanguage: (language: string) => {\n dispatch({\n type: 'UPDATE',\n path: 'language',\n value: language,\n })\n setModified(true)\n },\n }))\n\n const selectedLanguageLabel = languages[selectedLanguageField?.value as keyof typeof languages]\n\n const isEditable = useLexicalEditable()\n\n const languageEntries = React.useMemo<ComboboxEntry[]>(() => {\n return Object.entries(languages).map(([languageCode, languageLabel]) => ({\n name: `${languageCode} ${languageLabel}`,\n Component: (\n <PopupList.Button\n active={false}\n disabled={false}\n onClick={() => {\n setSelectedLanguage(languageCode)\n }}\n >\n <span className={`${baseClass}__language-code`} data-language={languageCode}>\n {languageLabel}\n </span>\n </PopupList.Button>\n ),\n }))\n }, [languages, setSelectedLanguage])\n\n return (\n <BlockCollapsible\n Actions={\n <div className={`${baseClass}__actions`}>\n <Combobox\n button={\n <div\n className={`${baseClass}__language-selector-button`}\n data-selected-language={selectedLanguageField?.value}\n >\n <span>{selectedLanguageLabel}</span>\n <ChevronIcon className={`${baseClass}__chevron`} />\n </div>\n }\n buttonType=\"custom\"\n className={`${baseClass}__language-selector`}\n disabled={!isEditable}\n entries={languageEntries}\n horizontalAlign=\"right\"\n minEntriesForSearch={8}\n searchPlaceholder={t('fields:searchForLanguage')}\n showScrollbar\n size=\"large\"\n />\n <CopyToClipboard value={(codeField?.value as string) ?? ''} />\n\n <Collapse />\n\n {isEditable && <RemoveButton />}\n </div>\n }\n className={baseClass}\n collapsibleProps={{\n AfterCollapsible: <FloatingCollapse />,\n disableHeaderToggle: true,\n disableToggleIndicator: true,\n }}\n Pill={\n <div className={`${baseClass}__pill`}>\n <CodeBlockIcon />\n </div>\n }\n >\n <RenderFields\n fields={formSchema}\n forceRender={true}\n parentIndexPath=\"\"\n parentPath={''}\n parentSchemaPath=\"\"\n permissions={true}\n readOnly={!isEditable}\n />\n </BlockCollapsible>\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const CodeBlockIcon: React.FC = () => (\n <svg fill=\"none\" height=\"12\" viewBox=\"0 0 15 12\" width=\"15\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.3738 8.62598L14.0404 5.95931L11.3738 3.29264M3.37376 3.29264L0.707092 5.95931L3.37376 8.62598M9.04043 0.625977L5.70709 11.2926\"\n stroke=\"currentColor\"\n strokeLinecap=\"square\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'code-block-collapse-button'\nimport { useCollapsible } from '@payloadcms/ui'\n\nimport { CollapseIcon } from '../../../../../../lexical/ui/icons/Collapse/index.js'\n\nexport const Collapse: React.FC = () => {\n const { toggle } = useCollapsible()\n return (\n <button className={baseClass} onClick={toggle} type=\"button\">\n <CollapseIcon />\n </button>\n )\n}\n", "'use client'\nimport React from 'react'\n\nexport const CollapseIcon: React.FC = () => (\n <svg fill=\"none\" height=\"15\" viewBox=\"0 0 15 15\" width=\"15\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M7.16667 13.8333V9.83333M7.16667 9.83333L9.16667 11.8333M7.16667 9.83333L5.16667 11.8333M7.16667 4.5V0.5M7.16667 4.5L9.16667 2.5M7.16667 4.5L5.16667 2.5M1.83333 7.16667H0.5M5.83333 7.16667H4.5M9.83333 7.16667H8.5M13.8333 7.16667H12.5\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n", "import React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'code-block-floating-collapse-button'\nimport { useCollapsible, useTranslation } from '@payloadcms/ui'\n\nimport { CollapseIcon } from '../../../../../../lexical/ui/icons/Collapse/index.js'\n\nexport const FloatingCollapse: React.FC = () => {\n const { isCollapsed, toggle } = useCollapsible()\n const { t } = useTranslation()\n\n if (!isCollapsed) {\n return null\n }\n\n return (\n <button className={baseClass} onClick={toggle} type=\"button\">\n <span>{t('general:collapse')}</span>\n <CollapseIcon />\n </button>\n )\n}\n", "'use client'\nimport type { RichTextField } from 'payload'\n\nimport {\n FieldContext,\n FieldPathContext,\n type FieldType,\n type RenderFieldServerFnArgs,\n ServerFunctionsContext,\n type ServerFunctionsContextType,\n ShimmerEffect,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef } from 'react'\n\nimport type { DefaultTypedEditorState } from '../../nodeTypes.js'\nimport type { LexicalRichTextField } from '../../types.js'\n\n/**\n * Utility to render a lexical editor on the client.\n *\n * @experimental - may break in minor releases\n * @todo - replace this with a general utility that works for all fields. Maybe merge with packages/ui/src/forms/RenderFields/RenderField.tsx\n */\nexport const RenderLexical: React.FC<\n /**\n * If value or setValue, or both, is provided, this component will manage its own value.\n * If neither is passed, it will rely on the parent form to manage the value.\n */\n {\n /**\n * Override the loading state while the field component is being fetched and rendered.\n */\n Loading?: React.ReactElement\n\n setValue?: FieldType<DefaultTypedEditorState | undefined>['setValue']\n value?: FieldType<DefaultTypedEditorState | undefined>['value']\n } & RenderFieldServerFnArgs<LexicalRichTextField>\n> = (args) => {\n const { field, initialValue, Loading, path, schemaPath, setValue, value } = args\n const [Component, setComponent] = React.useState<null | React.ReactNode>(null)\n const serverFunctionContext = useServerFunctions()\n const { _internal_renderField } = serverFunctionContext\n\n const [entityType, entitySlug] = schemaPath.split('.', 2)\n\n const fieldPath = path ?? (field && 'name' in field ? field?.name : '') ?? ''\n\n const renderLexical = useCallback(() => {\n async function render() {\n const { Field } = await _internal_renderField({\n field: {\n ...((field as RichTextField) || {}),\n type: 'richText',\n admin: {\n ...((field as RichTextField)?.admin || {}),\n // When using \"fake\" anchor fields, hidden is often set to true. We need to override that here to ensure the field is rendered.\n hidden: false,\n },\n },\n initialValue: initialValue ?? undefined,\n path,\n schemaPath,\n })\n\n setComponent(Field)\n }\n void render()\n }, [_internal_renderField, schemaPath, path, field, initialValue])\n\n const mounted = useRef(false)\n\n useEffect(() => {\n if (mounted.current) {\n return\n }\n mounted.current = true\n void renderLexical()\n }, [renderLexical])\n\n if (!Component) {\n return typeof Loading !== 'undefined' ? Loading : <ShimmerEffect />\n }\n\n /**\n * By default, the lexical will make form state requests (e.g. to get drawer fields), passing in the arguments\n * of the current field. However, we need to override those arguments to get it to make requests based on the\n * *target* field. The server only knows the schema map of the target field.\n */\n const adjustedServerFunctionContext: ServerFunctionsContextType = {\n ...serverFunctionContext,\n getFormState: async (getFormStateArgs) => {\n return serverFunctionContext.getFormState({\n ...getFormStateArgs,\n collectionSlug: entityType === 'collection' ? entitySlug : undefined,\n globalSlug: entityType === 'global' ? entitySlug : undefined,\n })\n },\n }\n\n if (typeof value === 'undefined' && !setValue) {\n return (\n <ServerFunctionsContext value={{ ...adjustedServerFunctionContext }}>\n <FieldPathContext key={fieldPath} value={fieldPath}>\n {Component}\n </FieldPathContext>\n </ServerFunctionsContext>\n )\n }\n\n const fieldValue: FieldType<DefaultTypedEditorState | undefined> = {\n disabled: false,\n formInitializing: false,\n formProcessing: false,\n formSubmitted: false,\n initialValue: value,\n path: fieldPath,\n setValue: setValue ?? (() => undefined),\n showError: false,\n value,\n }\n\n return (\n <ServerFunctionsContext value={{ ...adjustedServerFunctionContext }}>\n <FieldPathContext key={fieldPath} value={fieldPath}>\n <FieldContext value={fieldValue}>{Component}</FieldContext>\n </FieldPathContext>\n </ServerFunctionsContext>\n )\n}\n", "import type { SerializedLexicalNode } from 'lexical'\n\nimport type { DefaultNodeTypes, DefaultTypedEditorState, TypedEditorState } from '../nodeTypes.js'\n\n/**\n * Helper to build lexical editor state JSON from text and/or nodes.\n *\n * @param nodes - The nodes to include in the editor state. If you pass the `text` argument, this will append your nodes after the first paragraph node.\n * @param text - The text content to include in the editor state. This will create a paragraph node with a text node for you and set that as the first node.\n * @returns The constructed editor state JSON.\n *\n * @example\n *\n * just passing text:\n *\n * ```ts\n * const editorState = buildEditorState<DefaultNodeTypes>({ text: 'Hello world' }) // result typed as DefaultTypedEditorState\n * ```\n *\n * @example\n *\n * passing nodes:\n *\n * ```ts\n * const editorState = // result typed as TypedEditorState<DefaultNodeTypes | SerializedBlockNode> (or TypedEditorState<SerializedBlockNode>)\n * buildEditorState<DefaultNodeTypes | SerializedBlockNode>({ // or just buildEditorState<SerializedBlockNode> if you *only* want to allow block nodes\n * nodes: [\n * {\n * type: 'block',\n * fields: {\n * id: 'id',\n * blockName: 'Cool block',\n * blockType: 'myBlock',\n * },\n * format: 'left',\n * version: 1,\n * }\n * ],\n * })\n * ```\n */\nexport function buildEditorState<T extends SerializedLexicalNode>({\n nodes,\n text,\n}: {\n nodes?: TypedEditorState<T>['root']['children']\n text?: string\n}): TypedEditorState<T> {\n const editorJSON: DefaultTypedEditorState = {\n root: {\n type: 'root',\n children: [],\n direction: 'ltr',\n format: '',\n indent: 0,\n version: 1,\n },\n }\n\n if (text) {\n editorJSON.root.children.push({\n type: 'paragraph',\n children: [\n {\n type: 'text',\n detail: 0,\n format: 0,\n mode: 'normal',\n style: '',\n text,\n version: 1,\n },\n ],\n direction: 'ltr',\n format: '',\n indent: 0,\n textFormat: 0,\n textStyle: '',\n version: 1,\n })\n }\n\n if (nodes?.length) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n editorJSON.root.children.push(...(nodes as any))\n }\n\n return editorJSON as TypedEditorState<T>\n}\n\n/**\n *\n * Alias for `buildEditorState<DefaultNodeTypes>`\n *\n * @experimental this API may change or be removed in a minor release\n * @internal\n */\nexport const buildDefaultEditorState: typeof buildEditorState<DefaultNodeTypes> =\n buildEditorState<DefaultNodeTypes>\n"],
5
+ "mappings": "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6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACT,EACAC,QAAS,CACP,GAAM,6BACN,IAAO,4BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,2BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,4BACT,EACAC,QAAS,CACP,GAAM,6BACN,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,2BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,4BACT,EACAC,KAAM,CACJ,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,2BACT,EACAC,MAAO,CACL,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACT,EACAC,OAAQ,CACN,GAAM,6BACN,IAAO,4BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,6BACP,IAAO,6BACP,IAAO,2BACT,EACAC,QAAS,UACTC,KAAM,CACJ,GAAM,6BACN,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,6BACP,IAAO,6BACP,IAAO,6BACP,IAAO,4BACT,EACAC,QAAS,CACP,GAAM,mBACN,IAAO,kBACP,IAAO,mBACP,IAAO,kBACP,IAAO,mBACP,IAAO,mBACP,IAAO,mBACP,IAAO,mBACP,IAAO,mBACP,IAAO,mBACP,IAAO,kBACT,EACAC,OAAQ,CACN,GAAM,2BACN,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,2BACP,IAAO,4BACP,IAAO,4BACP,IAAO,4BACP,IAAO,2BACP,IAAO,4BACP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",
6
+ "names": ["slashMenuBasicGroupWithItems", "items", "key", "label", "i18n", "t", "c", "_c", "useLexicalComposerContext", "$isDecoratorBlockNode", "$findMatchingParent", "$getSelection", "$isElementNode", "$isNodeSelection", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "FORMAT_ELEMENT_COMMAND", "useEffect", "AlignCenterIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignJustifyIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignLeftIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "AlignRightIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "createClientFeature", "feature", "props", "featureProviderClient", "clientFeatureProps", "config", "featureClientImportMap", "featureClientSchemaMap", "featureProviderMap", "field", "resolvedFeatures", "schemaPath", "unSanitizedEditorConfig", "toReturn", "sanitizedClientFeatureProps", "newFeature", "toolbarAlignGroupWithItems", "items", "type", "ChildComponent", "AlignLeftIcon", "key", "order", "getFormatType", "node", "$isElementNode", "__format", "toolbarGroups", "toolbarAlignGroupWithItems", "ChildComponent", "AlignLeftIcon", "isActive", "selection", "$isRangeSelection", "getNodes", "$isDecoratorBlockNode", "parent", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "FORMAT_ELEMENT_COMMAND", "order", "AlignCenterIcon", "AlignRightIcon", "AlignJustifyIcon", "AlignPlugin", "$", "_c", "useLexicalComposerContext", "t0", "t1", "registerCommand", "_temp2", "COMMAND_PRIORITY_LOW", "useEffect", "AlignFeatureClient", "createClientFeature", "plugins", "Component", "position", "toolbarFixed", "groups", "toolbarInline", "_temp", "parentNode", "isInline", "format", "$getSelection", "$isNodeSelection", "nodes", "element", "$findMatchingParent", "setFormat", "$createQuoteNode", "$isQuoteNode", "QuoteNode", "$setBlocksType", "$getSelection", "$isRangeSelection", "BlockquoteIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "TextIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarTextDropdownGroupWithItems", "items", "type", "ChildComponent", "TextIcon", "key", "order", "$createQuoteNode", "$isQuoteNode", "QuoteNode", "MarkdownTransformer", "type", "dependencies", "export", "node", "exportChildren", "lines", "split", "output", "line", "push", "join", "regExp", "replace", "parentNode", "children", "_match", "isImport", "previousNode", "getPreviousSibling", "splice", "getChildrenSize", "select", "remove", "append", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "BlockquoteIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isQuoteNode", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "update", "$getSelection", "$setBlocksType", "$createQuoteNode", "order", "BlockquoteFeatureClient", "createClientFeature", "markdownTransformers", "MarkdownTransformer", "nodes", "QuoteNode", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "getTranslation", "BlockIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "rx", "stroke", "x", "y", "InlineBlocksIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "clipRule", "d", "fillRule", "getBlockImageComponent", "imageURL", "imageAltText", "_jsx", "alt", "className", "src", "style", "maxHeight", "maxWidth", "BlockIcon", "$parseSerializedNode", "JSOX", "extractPropsFromJSXPropsString", "propsString", "props", "key", "collectingKey", "i", "length", "char", "result", "handleValue", "value", "newIndex", "startIndex", "handleQuotedString", "handleObject", "handleArray", "handleUnquotedString", "bracketCount", "parse", "isSingleQuoted", "parseObject", "objString", "replace", "propsToJSXString", "props", "propsArray", "key", "value", "Object", "entries", "push", "escapeQuotes", "Array", "isArray", "map", "v", "JSON", "stringify", "replacer", "join", "str", "replace", "linesFromStartToContentAndPropsString", "isEndOptional", "lines", "regexpEndRegex", "startLineIndex", "startMatch", "trimChildren", "propsString", "content", "linesCopy", "slice", "isWithinContent", "contentSubTagStartAmount", "bracketCount", "quoteChar", "isSelfClosing", "isWithinCodeBlockAmount", "beforeStartLine", "index", "endlineLastCharIndex", "endLineIndex", "mainLoop", "lineIndex", "lineCopy", "entries", "line", "trim", "amountOfBeginningSpacesRemoved", "i", "length", "charIndex", "char", "nextChar", "match", "undefined", "Error", "join", "JSON", "stringify", "afterEndLine", "ObjectID", "$applyNodeReplacement", "DecoratorBlockNode", "addClassNamesToElement", "ObjectID", "$applyNodeReplacement", "ServerBlockNode", "__cacheBuster", "__fields", "constructor", "cacheBuster", "fields", "format", "key", "clone", "node", "__format", "__key", "getType", "importDOM", "importJSON", "serializedNode", "version", "data", "$createServerBlockNode", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "theme", "block", "decorate", "editor", "exportDOM", "text", "createTextNode", "getTextContent", "append", "exportJSON", "type", "getFields", "getCacheBuster", "getLatest", "setFields", "preventFormStateUpdate", "writable", "getWritable", "id", "default", "toHexString", "useLexicalComposerContext", "useLexicalEditable", "getTranslation", "Button", "Collapsible", "Drawer", "EditDepthProvider", "ErrorPill", "Form", "formatDrawerSlug", "FormSubmit", "Pill", "RenderFields", "SectionTitle", "useConfig", "useDocumentForm", "useDocumentInfo", "useEditDepth", "useFormSubmitted", "useServerFunctions", "useTranslation", "abortAndIgnore", "$getNodeByKey", "deepCopyObjectSimpleWithoutReactComponents", "reduceFieldsToValues", "React", "useCallback", "useEffect", "useMemo", "useRef", "v4", "uuid", "c", "_c", "useLexicalEditable", "RenderFields", "useFormSubmitted", "React", "createContext", "BlockComponentContext", "baseClass", "BlockCollapsible", "BlockDrawer", "CustomBlock", "EditButton", "errorCount", "formSchema", "initialState", "nodeKey", "RemoveButton", "useBlockComponentContext", "use", "BlockContent", "props", "$", "Collapsible", "contextProps", "fieldHasErrors", "isEditable", "t0", "props_0", "children", "rest", "_jsx", "CollapsibleWithErrorProps", "_jsxs", "value", "fields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "readOnly", "removeEmptyArrayValues", "fields", "key", "field", "Array", "isArray", "rows", "disableFormData", "BlockComponent", "props", "cacheBuster", "className", "baseClass", "formData", "nodeKey", "submitted", "useFormSubmitted", "id", "collectionSlug", "globalSlug", "useDocumentInfo", "fieldProps", "featureClientSchemaMap", "field", "parentLexicalRichTextField", "initialLexicalFormState", "schemaPath", "uuid", "uuidFromContext", "useEditorConfigContext", "fields", "parentDocumentFields", "useDocumentForm", "onChangeAbortControllerRef", "useRef", "AbortController", "editDepth", "useEditDepth", "errorCount", "setErrorCount", "React", "useState", "config", "useConfig", "drawerSlug", "formatDrawerSlug", "slug", "depth", "toggleDrawer", "useLexicalDrawer", "getDocPreferences", "setDocFieldPreferences", "editor", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "blockType", "getFormState", "useServerFunctions", "schemaFieldsPath", "initialState", "setInitialState", "cachedFormState", "formState", "mergedState", "Object", "fromEntries", "entries", "map", "fieldName", "fieldState", "initialValue", "value", "blockName", "passesCondition", "valid", "hasMounted", "prevCacheBuster", "useEffect", "current", "CustomLabel", "setCustomLabel", "customComponents", "BlockLabel", "undefined", "CustomBlock", "setCustomBlock", "Block", "abortController", "state", "data", "docPermissions", "docPreferences", "documentFormState", "deepCopyObjectSimpleWithoutReactComponents", "excludeFiles", "initialBlockData", "operation", "readOnly", "renderAllFields", "signal", "newFormStateData", "reduceFieldsToValues", "update", "node", "$getNodeByKey", "$isBlockNode", "newData", "setFields", "_components", "abortAndIgnore", "isCollapsed", "setIsCollapsed", "collapsed", "componentMapRenderedBlockPath", "blocksField", "clientBlock", "blockReferences", "blocksMap", "blocks", "i18n", "t", "useTranslation", "onChange", "useCallback", "prevFormState", "submit", "controller", "newFormState", "initialBlockFormState", "removeEmptyArrayValues", "setTimeout", "rowErrorCount", "formField", "values", "removeBlock", "remove", "blockDisplayName", "labels", "singular", "getTranslation", "onCollapsedChange", "changedCollapsed", "then", "currentDocPreferences", "collapsedArray", "name", "newCollapsed", "length", "includes", "push", "splice", "indexOf", "hello", "EditButton", "useMemo", "_jsx", "Button", "buttonStyle", "disabled", "el", "icon", "onClick", "e", "preventDefault", "stopPropagation", "onMouseDown", "round", "size", "tooltip", "label", "RemoveButton", "BlockCollapsible", "Actions", "children", "collapsibleProps", "disableBlockName", "editButton", "fieldHasErrors", "Label", "Pill", "CustomPill", "removeButton", "Collapsible", "filter", "Boolean", "join", "collapsibleStyle", "header", "_jsxs", "pillStyle", "admin", "SectionTitle", "path", "ErrorPill", "count", "withMessage", "_Fragment", "onToggle", "incomingCollapsedState", "blockID", "BlockDrawer", "EditDepthProvider", "Drawer", "title", "RenderFields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "FormSubmit", "programmaticSubmit", "Form", "beforeSubmit", "onSubmit", "BlockContent", "formSchema", "BlockNode", "ServerBlockNode", "clone", "node", "getType", "importJSON", "serializedNode", "version", "fields", "data", "$createBlockNode", "setFormat", "format", "decorate", "_editor", "config", "_jsx", "BlockComponent", "cacheBuster", "getCacheBuster", "className", "theme", "block", "formData", "getFields", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "id", "ObjectID", "default", "toHexString", "$isBlockNode", "createHeadlessEditor", "getLexicalToMarkdown", "allNodes", "allTransformers", "lexicalToMarkdown", "editorState", "headlessEditor", "createHeadlessEditor", "nodes", "setEditorState", "parseEditorState", "e", "console", "error", "markdown", "getEditorState", "read", "$convertToMarkdownString", "createHeadlessEditor", "getMarkdownToLexical", "allNodes", "allTransformers", "markdownToLexical", "markdown", "headlessEditor", "createHeadlessEditor", "nodes", "update", "$convertFromMarkdownString", "discrete", "getEditorState", "toJSON", "createTagRegexes", "tagName", "escapedTagName", "replace", "regExpEnd", "RegExp", "regExpStart", "getBlockMarkdownTransformers", "blocks", "inlineBlocks", "length", "transformers", "block", "transformer", "getMarkdownTransformerForBlock", "concat", "isInlineBlock", "jsx", "regex", "slug", "toReturn", "push", "allNodes", "allTransformers", "type", "dependencies", "InlineBlockNode", "export", "node", "$isInlineBlockNode", "getFields", "blockType", "toLowerCase", "nodeFields", "lexicalToMarkdown", "getLexicalToMarkdown", "exportResult", "fields", "hasProps", "props", "Object", "keys", "children", "propsToJSXString", "getEndIndex", "match", "endlineLastCharIndex", "linesFromStartToContentAndPropsString", "isEndOptional", "lines", "getTextContent", "regexpEndRegex", "startLineIndex", "startMatch", "trimChildren", "importRegExp", "customStartRegex", "regExp", "content", "propsString", "index", "import", "markdownToLexical", "getMarkdownToLexical", "blockFields", "closeMatch", "htmlToLexical", "openMatch", "extractPropsFromJSXPropsString", "inlineBlockNode", "$createInlineBlockNode", "BlockNode", "$isBlockNode", "sanitizedChildren", "includes", "child", "split", "sanitizedChild", "doNotTrimChildren", "handleImportAfterStartMatch", "customEndRegex", "undefined", "rootNode", "optional", "afterEndLine", "beforeStartLine", "unsanitizedContent", "endLineIndex", "endsWith", "slice", "startsWith", "$createBlockNode", "prevNodes", "nextNodes", "markdown", "root", "firstPrevNode", "append", "$parseSerializedNode", "lastChild", "getChildren", "linesInBetween", "line", "childrenString", "join", "trim", "createCommand", "INSERT_BLOCK_COMMAND", "INSERT_INLINE_BLOCK_COMMAND", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$wrapNodeInElement", "mergeRegister", "formatDrawerSlug", "useEditDepth", "$createParagraphNode", "$getNodeByKey", "$getPreviousSelection", "$getSelection", "$insertNodes", "$isParagraphNode", "$isRangeSelection", "$isRootOrShadowRoot", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "BlocksPlugin", "$", "_c", "editor", "useLexicalComposerContext", "targetNodeKey", "setTargetNodeKey", "useState", "setCreatedInlineBlock", "uuid", "useEditorConfigContext", "editDepth", "useEditDepth", "t0", "t1", "formatDrawerSlug", "slug", "depth", "drawerSlug", "toggleDrawer", "useLexicalDrawer", "t2", "hasNodes", "BlockNode", "Error", "mergeRegister", "registerCommand", "INSERT_BLOCK_COMMAND", "payload", "update", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "blockNode", "$createBlockNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "COMMAND_PRIORITY_EDITOR", "INSERT_INLINE_BLOCK_COMMAND", "fields", "node", "$getNodeByKey", "$isInlineBlockNode", "setFields", "inlineBlockNode", "$createInlineBlockNode", "$insertNodes", "$isRootOrShadowRoot", "getParentOrThrow", "$wrapNodeInElement", "$createParagraphNode", "selectEnd", "t3", "useEffect", "BlocksFeatureClient", "createClientFeature", "config", "featureClientSchemaMap", "props", "schemaPath", "schemaMapRenderedBlockPathPrefix", "schemaMapRenderedInlineBlockPathPrefix", "clientSchema", "blocksFields", "Object", "entries", "filter", "key", "startsWith", "replace", "includes", "map", "value", "inlineBlocksFields", "clientBlocks", "field", "blockReferences", "blocksMap", "blocks", "block", "undefined", "clientInlineBlocks", "markdownTransformers", "getBlockMarkdownTransformers", "inlineBlocks", "nodes", "BlockNode", "InlineBlockNode", "plugins", "Component", "BlocksPlugin", "position", "sanitizedClientFeatureProps", "slashMenu", "groups", "length", "items", "Icon", "getBlockImageComponent", "imageURL", "imageAltText", "slug", "keywords", "label", "i18n", "labels", "singular", "getTranslation", "onSelect", "editor", "dispatchCommand", "INSERT_BLOCK_COMMAND", "blockName", "blockType", "t", "inlineBlock", "InlineBlocksIcon", "INSERT_INLINE_BLOCK_COMMAND", "Boolean", "toolbarFixed", "type", "ChildComponent", "BlockIcon", "index", "isActive", "order", "c", "_c", "useLexicalComposerContext", "$createParagraphNode", "$createTextNode", "$getRoot", "getDOMSelection", "React", "useCallback", "useEffect", "useLayoutEffect", "useRef", "useState", "documentMode", "CAN_USE_DOM", "document", "IS_APPLE", "test", "navigator", "platform", "IS_FIREFOX", "userAgent", "CAN_USE_BEFORE_INPUT", "window", "InputEvent", "IS_SAFARI", "IS_IOS", "MSStream", "IS_ANDROID", "IS_WINDOWS", "IS_CHROME", "IS_APPLE_WEBKIT", "copy", "text", "textArea", "document", "createElement", "value", "style", "position", "opacity", "body", "appendChild", "focus", "select", "result", "execCommand", "console", "log", "error", "removeChild", "download", "filename", "a", "setAttribute", "encodeURIComponent", "display", "click", "formatStep", "step", "formattedStep", "formatOneStep", "name", "x", "y", "anchorPath", "toString", "anchorOffset", "focusPath", "focusOffset", "count", "join", "isSelectAll", "event", "key", "toLowerCase", "IS_APPLE", "metaKey", "ctrlKey", "sanitizeSelection", "selection", "anchorNode", "focusNode", "getPathFromNodeToEditor", "node", "rootElement", "currentNode", "path", "unshift", "Array", "from", "parentNode", "childNodes", "indexOf", "keyPresses", "Set", "useTestRecorder", "editor", "steps", "setSteps", "useState", "isRecording", "setIsRecording", "setCurrentInnerHTML", "templatedTest", "setTemplatedTest", "previousSelectionRef", "useRef", "skipNextSelectionChangeRef", "preRef", "getCurrentEditor", "useCallback", "generateTestContent", "getRootElement", "browserSelection", "getDOMSelection", "_window", "contains", "map", "pushStep", "currentSteps", "currentIndex", "length", "lastStep", "slice", "useLayoutEffect", "onKeyDown", "has", "onKeyUp", "registerRootListener", "prevRootElement", "removeEventListener", "addEventListener", "current", "scrollTo", "scrollHeight", "useEffect", "testContent", "registerUpdateListener", "dirtyElements", "dirtyLeaves", "editorState", "currentSelection", "_selection", "previousSelection", "skipNextSelectionChange", "size", "innerHTML", "toggleEditorSelection", "currentEditor", "update", "root", "$getRoot", "clear", "$createTextNode", "append", "$createParagraphNode", "currentIsRecording", "onSnapshotClick", "onCopyClick", "onDownloadClick", "_jsx", "className", "id", "onClick", "e", "preventDefault", "title", "type", "_jsxs", "ref", "TestRecorderPlugin", "$", "_c", "useLexicalComposerContext", "testRecorderButton", "testRecorderOutput", "t0", "Fragment", "children", "TestRecorderFeatureClient", "createClientFeature", "plugins", "Component", "TestRecorderPlugin", "position", "c", "_c", "useLexicalComposerContext", "TreeView", "TreeViewPlugin", "$", "editor", "t0", "_jsx", "timeTravelButtonClassName", "timeTravelPanelButtonClassName", "timeTravelPanelClassName", "timeTravelPanelSliderClassName", "treeTypeButtonClassName", "viewClassName", "TreeViewFeatureClient", "createClientFeature", "plugins", "Component", "TreeViewPlugin", "position", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "BoldIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarFormatGroupWithItems", "items", "type", "key", "order", "BOLD_ITALIC_STAR", "type", "format", "tag", "BOLD_ITALIC_UNDERSCORE", "intraword", "BOLD_STAR", "BOLD_UNDERSCORE", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "BoldIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "BoldFeatureClient", "createClientFeature", "featureProviderMap", "markdownTransformers", "BOLD_STAR", "BOLD_UNDERSCORE", "get", "push", "BOLD_ITALIC_UNDERSCORE", "BOLD_ITALIC_STAR", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "CodeIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "INLINE_CODE", "type", "format", "tag", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "CodeIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "InlineCodeFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "INLINE_CODE", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "ItalicIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "ITALIC_STAR", "type", "format", "tag", "ITALIC_UNDERSCORE", "intraword", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "ItalicIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "ItalicFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "ITALIC_STAR", "ITALIC_UNDERSCORE", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "StrikethroughIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "STRIKETHROUGH", "type", "format", "tag", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "StrikethroughIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "StrikethroughFeatureClient", "createClientFeature", "enableFormats", "markdownTransformers", "STRIKETHROUGH", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "SubscriptIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "SubscriptIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "SubscriptFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "SuperscriptIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "SuperscriptIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "SuperscriptFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "$isTableSelection", "$isRangeSelection", "FORMAT_TEXT_COMMAND", "UnderlineIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "toolbarGroups", "toolbarFormatGroupWithItems", "ChildComponent", "UnderlineIcon", "isActive", "selection", "$isRangeSelection", "$isTableSelection", "hasFormat", "key", "onSelect", "editor", "dispatchCommand", "FORMAT_TEXT_COMMAND", "order", "UnderlineFeatureClient", "createClientFeature", "enableFormats", "toolbarFixed", "groups", "toolbarInline", "kebabToCamelCase", "str", "replace", "_", "letter", "toUpperCase", "TextStateIcon", "css", "convertedCss", "Object", "fromEntries", "entries", "map", "key", "value", "_jsx", "style", "alignItems", "borderRadius", "display", "fontSize", "height", "justifyContent", "width", "useLexicalComposerContext", "$forEachSelectedTextNode", "$getNodeByKey", "$getState", "$setState", "createState", "TextNode", "useEffect", "registerTextStates", "state", "stateMap", "Map", "stateKey", "stateValues", "stateConfig", "parse", "value", "Object", "keys", "includes", "undefined", "set", "setTextState", "editor", "update", "textNode", "stateMapEntry", "get", "Error", "StatePlugin", "registerMutationListener", "mutatedNodes", "getEditorState", "read", "nodeKey", "mutation", "node", "dom", "getElementByKey", "mergedStyles", "create", "forEach", "stateEntry", "stateValue", "dataset", "css", "assign", "style", "cssText", "toolbarGroups", "props", "stateMap", "items", "stateKey", "state", "key", "stateValue", "meta", "push", "ChildComponent", "_jsx", "TextStateIcon", "css", "label", "onSelect", "editor", "setTextState", "type", "color", "i18n", "t", "undefined", "order", "TextStateFeatureClient", "createClientFeature", "registerTextStates", "plugins", "Component", "StatePlugin", "position", "toolbarFixed", "groups", "toolbarInline", "c", "_c", "useLexicalComposerContext", "$createHeadingNode", "$isHeadingNode", "HeadingNode", "$setBlocksType", "$getSelection", "$isRangeSelection", "useEffect", "H1Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H2Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H3Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H4Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H5Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "H6Icon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "d", "$createHeadingNode", "$isHeadingNode", "HeadingNode", "createBlockNode", "createNode", "parentNode", "children", "match", "node", "append", "replace", "select", "MarkdownTransformer", "enabledHeadingSizes", "pattern", "map", "tag", "Number", "slice", "size", "join", "regExp", "RegExp", "type", "dependencies", "HeadingNode", "export", "node", "exportChildren", "$isHeadingNode", "level", "getTag", "repeat", "replace", "createBlockNode", "match", "length", "$createHeadingNode", "$setHeading", "headingSize", "selection", "$getSelection", "$setBlocksType", "$createHeadingNode", "iconImports", "h1", "H1Icon", "h2", "H2Icon", "h3", "H3Icon", "h4", "H4Icon", "h5", "H5Icon", "h6", "H6Icon", "HeadingFeatureClient", "createClientFeature", "props", "enabledHeadingSizes", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "map", "i", "ChildComponent", "isActive", "$isRangeSelection", "node", "getNodes", "$isHeadingNode", "getTag", "parent", "getParent", "key", "label", "i18n", "t", "headingLevel", "charAt", "onSelect", "editor", "update", "order", "markdownTransformers", "MarkdownTransformer", "nodes", "HeadingNode", "plugins", "Component", "HeadingPlugin", "position", "sanitizedClientFeatureProps", "slashMenu", "groups", "length", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "t0", "$", "_c", "clientProps", "t1", "t2", "undefined", "t3", "at", "lowestAllowed", "useLexicalComposerContext", "t4", "t5", "registerNodeTransform", "includes", "setTag", "useEffect", "$isNodeSelection", "HorizontalRuleIcon", "_jsx", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "x", "y", "AddIcon", "_jsxs", "fill", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "toolbarAddDropdownGroupWithItems", "items", "type", "ChildComponent", "AddIcon", "key", "order", "addClassNamesToElement", "$applyNodeReplacement", "createCommand", "DecoratorNode", "INSERT_HORIZONTAL_RULE_COMMAND", "HorizontalRuleServerNode", "clone", "node", "__key", "getType", "importDOM", "hr", "conversion", "$convertHorizontalRuleElement", "priority", "importJSON", "serializedNode", "$createHorizontalRuleServerNode", "createDOM", "config", "element", "document", "createElement", "theme", "decorate", "exportDOM", "exportJSON", "type", "version", "getTextContent", "isInline", "updateDOM", "$applyNodeReplacement", "HorizontalRuleNode", "HorizontalRuleServerNode", "clone", "node", "getType", "importJSON", "serializedNode", "$createHorizontalRuleNode", "decorate", "exportJSON", "$createHorizontalRuleNode", "$applyNodeReplacement", "HorizontalRuleNode", "$isHorizontalRuleNode", "node", "MarkdownTransformer", "type", "dependencies", "HorizontalRuleNode", "export", "node", "exportChildren", "$isHorizontalRuleNode", "regExp", "replace", "parentNode", "$createHorizontalRuleNode", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "useEffect", "HorizontalRulePlugin", "$", "_c", "editor", "useLexicalComposerContext", "t0", "t1", "registerCommand", "INSERT_HORIZONTAL_RULE_COMMAND", "_temp", "COMMAND_PRIORITY_EDITOR", "useEffect", "type", "selection", "$getSelection", "$isRangeSelection", "focus", "getNode", "horizontalRuleNode", "$createHorizontalRuleNode", "$insertNodeToNearestRoot", "HorizontalRuleFeatureClient", "createClientFeature", "markdownTransformers", "MarkdownTransformer", "nodes", "HorizontalRuleNode", "plugins", "Component", "HorizontalRulePlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "HorizontalRuleIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_HORIZONTAL_RULE_COMMAND", "undefined", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isHorizontalRuleNode", "$findMatchingParent", "$isElementNode", "INDENT_CONTENT_COMMAND", "OUTDENT_CONTENT_COMMAND", "IndentDecreaseIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "IndentIncreaseIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "useLexicalComposerContext", "TabIndentationPlugin", "$findMatchingParent", "mergeRegister", "$getSelection", "$isElementNode", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "INDENT_CONTENT_COMMAND", "KEY_TAB_COMMAND", "OUTDENT_CONTENT_COMMAND", "TabNode", "useEffect", "IndentPlugin", "clientProps", "editor", "disabledNodes", "disableTabNode", "length", "registerCommand", "$handleIndentAndOutdent", "block", "includes", "getType", "indent", "getIndent", "setIndent", "registerUpdateListener", "dirtyElements", "editorState", "update", "nodeKey", "node", "_nodeMap", "get", "event", "preventDefault", "dispatchCommand", "shiftKey", "undefined", "registerNodeTransform", "remove", "_jsx", "indentOrOutdent", "selection", "alreadyHandled", "Set", "nodes", "getNodes", "i", "key", "getKey", "has", "parentBlock", "parentNode", "isInline", "parentKey", "canIndent", "add", "size", "toolbarIndentGroupWithItems", "items", "type", "key", "order", "toolbarGroups", "disabledNodes", "toolbarIndentGroupWithItems", "ChildComponent", "IndentDecreaseIcon", "isActive", "isEnabled", "selection", "nodes", "getNodes", "isOutdentable", "node", "isIndentable", "getIndent", "some", "Boolean", "$findMatchingParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "OUTDENT_CONTENT_COMMAND", "undefined", "order", "IndentIncreaseIcon", "isIndentableAndNotDisabled", "includes", "getType", "INDENT_CONTENT_COMMAND", "IndentFeatureClient", "createClientFeature", "props", "plugins", "Component", "IndentPlugin", "position", "sanitizedClientFeatureProps", "toolbarFixed", "groups", "toolbarInline", "$isElementNode", "canIndent", "$findMatchingParent", "$getSelection", "$isRangeSelection", "LinkIcon", "_jsx", "className", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "strokeLinejoin", "$isAtNodeEnd", "getSelectedNode", "selection", "anchor", "focus", "anchorNode", "getNode", "focusNode", "isBackward", "toolbarFeatureButtonsGroupWithItems", "items", "type", "key", "order", "$createTextNode", "addClassNamesToElement", "isHTMLAnchorElement", "ObjectID", "$applyNodeReplacement", "$createTextNode", "$getSelection", "$isElementNode", "$isRangeSelection", "createCommand", "ElementNode", "SUPPORTED_URL_PROTOCOLS", "Set", "LinkNode", "__fields", "__id", "constructor", "id", "fields", "linkType", "newTab", "key", "clone", "node", "__key", "getType", "importDOM", "a", "conversion", "$convertAnchorElement", "priority", "importJSON", "serializedNode", "$createLinkNode", "updateFromJSON", "version", "doc", "value", "default", "toHexString", "canBeEmpty", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "href", "sanitizeUrl", "url", "target", "rel", "manageRel", "theme", "link", "exportJSON", "getFields", "returnObject", "type", "getID", "extractWithChild", "child", "selection", "destination", "anchorNode", "anchor", "getNode", "focusNode", "focus", "isParentOf", "getTextContent", "length", "getLatest", "insertNewAfter", "restoreSelection", "getParentOrThrow", "linkNode", "append", "isInline", "parsedUrl", "URL", "has", "protocol", "setFields", "writable", "getWritable", "setID", "updateDOM", "prevNode", "removeAttribute", "domNode", "content", "textContent", "getAttribute", "$isLinkNode", "TOGGLE_LINK_COMMAND", "$toggleLink", "payload", "selectedNodes", "nodes", "extract", "forEach", "parent", "getParent", "getChildren", "insertBefore", "remove", "firstNode", "$getLinkAncestor", "text", "getLastChild", "prevParent", "is", "getPreviousSibling", "insertAfter", "children", "$getAncestor", "ancestor", "predicate", "input", "action", "result", "mutableInput", "includes", "re", "RegExp", "replace", "trim", "LinkMarkdownTransformer", "type", "dependencies", "LinkNode", "export", "_node", "exportChildren", "$isLinkNode", "node", "url", "getFields", "importRegExp", "regExp", "replace", "textNode", "match", "linkText", "linkUrl", "linkNode", "$createLinkNode", "fields", "doc", "linkType", "newTab", "linkTextNode", "$createTextNode", "setFormat", "getFormat", "append", "trigger", "$applyNodeReplacement", "$isElementNode", "AutoLinkNode", "LinkNode", "clone", "node", "id", "fields", "__fields", "key", "__key", "getType", "importDOM", "importJSON", "serializedNode", "$createAutoLinkNode", "updateFromJSON", "version", "doc", "value", "exportJSON", "serialized", "type", "children", "direction", "format", "indent", "insertNewAfter", "selection", "restoreSelection", "element", "getParentOrThrow", "$isElementNode", "linkNode", "append", "setFields", "$applyNodeReplacement", "$isAutoLinkNode", "c", "_c", "useLexicalComposerContext", "mergeRegister", "$createTextNode", "$getSelection", "$isElementNode", "$isLineBreakNode", "$isNodeSelection", "$isRangeSelection", "$isTextNode", "TextNode", "TextNodeValue", "useEffect", "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", "$isElementNode", "getLastDescendant", "$isLineBreakNode", "$isTextNode", "getTextContent", "isNextNodeValid", "nextNode", "getNextSibling", "getFirstDescendant", "isContentAroundIsValid", "matchStart", "matchEnd", "nodes", "extractMatchingNodes", "startIndex", "endIndex", "unmodifiedBeforeNodes", "matchingNodes", "unmodifiedAfterNodes", "matchingOffset", "currentOffset", "currentNodes", "currentNode", "currentNodeLength", "currentNodeStart", "push", "shift", "$createAutoLinkNode_", "fields", "linkType", "linkNode", "$createAutoLinkNode", "remainingTextNode", "linkTextNode", "splitText", "textNode", "$createTextNode", "setFormat", "getFormat", "setDetail", "getDetail", "setStyle", "getStyle", "append", "replace", "firstTextNode", "offset", "firstLinkTextNode", "linkNodes", "forEach", "currentNodeEnd", "endNode", "selection", "$getSelection", "selectedTextNode", "getNodes", "find", "$isRangeSelection", "select", "anchor", "focus", "$isNodeSelection", "$handleLinkCreation", "onChange", "initialText", "map", "join", "invalidMatchEnd", "matchLength", "actualMatchStart", "actualMatchEnd", "substring", "handleLinkEdit", "children", "getChildren", "childrenLength", "i", "child", "isSimpleText", "replaceWithChildren", "getFields", "flds", "setFields", "handleBadNeighbors", "previousSibling", "nextSibling", "$isAutoLinkNode", "isEmailURI", "startsWith", "j", "insertAfter", "remove", "getLatest", "getTextNodesToMatch", "textNodesToMatch", "useAutoLink", "editor", "$", "_c", "t0", "t1", "hasNodes", "AutoLinkNode", "Error", "onChangeWrapped", "prevUrl", "mergeRegister", "registerNodeTransform", "TextNodeValue", "parent", "getParentOrThrow", "previous", "$isLinkNode", "useEffect", "URL_REGEX", "EMAIL_REGEX", "MATCHERS", "AutoLinkPlugin", "useLexicalComposerContext", "ClickableLinkPlugin", "LexicalClickableLinkPlugin", "_jsx", "createPortal", "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", "formatAdminURL", "React", "useCallback", "useEffect", "useRef", "useState", "setFloatingElemPositionForLinkEditor", "targetRect", "floatingElem", "anchorElem", "verticalGap", "VERTICAL_GAP", "horizontalOffset", "HORIZONTAL_OFFSET", "scrollerElem", "parentElement", "style", "opacity", "transform", "floatingElemRect", "getBoundingClientRect", "anchorElementRect", "editorScrollerRect", "top", "left", "height", "width", "right", "createCommand", "TOGGLE_LINK_WITH_MODAL_COMMAND", "preventDefault", "event", "LinkEditor", "anchorElem", "editor", "useLexicalComposerContext", "linkNode", "setLinkNode", "useState", "editorRef", "useRef", "linkUrl", "setLinkUrl", "linkLabel", "setLinkLabel", "fieldProps", "schemaPath", "uuid", "useEditorConfigContext", "isEditable", "useLexicalEditable", "config", "getEntityConfig", "useConfig", "i18n", "t", "useTranslation", "stateData", "setStateData", "editDepth", "useEditDepth", "isLink", "setIsLink", "selectedNodes", "setSelectedNodes", "locale", "useLocale", "isAutoLink", "setIsAutoLink", "drawerSlug", "formatDrawerSlug", "slug", "depth", "toggleDrawer", "useLexicalDrawer", "setNotLink", "useCallback", "current", "style", "opacity", "transform", "undefined", "$updateLinkEditor", "selection", "$getSelection", "selectedNodeDomRect", "$isRangeSelection", "focusNode", "getSelectedNode", "getElementByKey", "getKey", "getBoundingClientRect", "focusLinkParent", "$findMatchingParent", "$isLinkNode", "badNode", "getNodes", "filter", "node", "$isLineBreakNode", "find", "is", "fields", "getFields", "data", "id", "getID", "text", "getTextContent", "linkType", "url", "routes", "admin", "doc", "relationTo", "value", "relatedField", "collectionSlug", "label", "String", "collection", "Error", "loadingLabel", "getTranslation", "labels", "singular", "replace", "requests", "get", "formatAdminURL", "apiRoute", "api", "path", "serverURL", "headers", "language", "params", "code", "then", "res", "ok", "status", "json", "useAsTitle", "title", "catch", "$isAutoLinkNode", "editorElem", "nativeSelection", "getDOMSelection", "_window", "activeElement", "document", "rootElement", "getRootElement", "contains", "anchorNode", "getRangeAt", "y", "setFloatingElemPositionForLinkEditor", "className", "useEffect", "mergeRegister", "registerCommand", "TOGGLE_LINK_WITH_MODAL_COMMAND", "payload", "dispatchCommand", "TOGGLE_LINK_COMMAND", "COMMAND_PRIORITY_LOW", "scrollerElem", "parentElement", "update", "getEditorState", "read", "window", "addEventListener", "removeEventListener", "registerUpdateListener", "editorState", "SELECTION_CHANGE_COMMAND", "KEY_ESCAPE_COMMAND", "COMMAND_PRIORITY_HIGH", "_jsxs", "React", "Fragment", "_jsx", "ref", "length", "href", "rel", "target", "__fields", "newTab", "ExternalLinkIcon", "_Fragment", "onClick", "onMouseDown", "tabIndex", "type", "EditIcon", "CloseMenuIcon", "FieldsDrawer", "drawerTitle", "featureKey", "handleDrawerSubmit", "newLinkPayload", "bareLinkFields", "linkParent", "getParent", "$createLinkNode", "schemaPathSuffix", "FloatingLinkEditorPlugin", "props", "anchorElem", "document", "body", "createPortal", "_jsx", "LinkEditor", "c", "_c", "useLexicalComposerContext", "mergeRegister", "$getSelection", "$isElementNode", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "PASTE_COMMAND", "useEffect", "absoluteRegExp", "relativeOrAnchorRegExp", "validateUrl", "url", "includes", "test", "absoluteRegExp", "relativeOrAnchorRegExp", "urlObj", "URL", "protocol", "hostname", "LinkPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "t2", "defaultLinkType", "defaultLinkURL", "hasNodes", "LinkNode", "Error", "mergeRegister", "registerCommand", "TOGGLE_LINK_COMMAND", "payload", "$toggleLink", "fields", "linkType", "url", "COMMAND_PRIORITY_LOW", "PASTE_COMMAND", "event", "selection", "$getSelection", "$isRangeSelection", "isCollapsed", "ClipboardEvent", "clipboardData", "clipboardText", "getData", "validateUrl", "getNodes", "some", "_temp", "linkFields", "doc", "newTab", "dispatchCommand", "text", "preventDefault", "useEffect", "node", "$isElementNode", "toolbarGroups", "toolbarFeatureButtonsGroupWithItems", "ChildComponent", "LinkIcon", "isActive", "selection", "$isRangeSelection", "selectedNode", "getSelectedNode", "$findMatchingParent", "$isLinkNode", "isEnabled", "$getSelection", "getTextContent", "length", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "TOGGLE_LINK_COMMAND", "selectedText", "selectedNodes", "getEditorState", "read", "getNodes", "linkFields", "doc", "TOGGLE_LINK_WITH_MODAL_COMMAND", "fields", "text", "order", "LinkFeatureClient", "createClientFeature", "props", "markdownTransformers", "LinkMarkdownTransformer", "nodes", "LinkNode", "disableAutoLinks", "AutoLinkNode", "filter", "Boolean", "plugins", "Component", "LinkPlugin", "position", "AutoLinkPlugin", "ClickableLinkPlugin", "FloatingLinkEditorPlugin", "sanitizedClientFeatureProps", "toolbarFixed", "groups", "toolbarInline", "$isListNode", "INSERT_CHECK_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "ChecklistIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "rx", "stroke", "x", "y", "d", "strokeWidth", "ListPlugin", "LexicalListPlugin", "_jsx", "shouldRegisterListBaseNodes", "type", "featureProviderMap", "has", "slashMenuListGroupWithItems", "items", "key", "label", "i18n", "t", "$isListNode", "ListItemNode", "ListNode", "$createListItemNode", "$createListNode", "$isListItemNode", "$isListNode", "LIST_INDENT_SIZE", "listReplace", "listType", "parentNode", "children", "match", "previousNode", "getPreviousSibling", "nextNode", "getNextSibling", "listItem", "undefined", "getListType", "firstChild", "getFirstChild", "insertBefore", "append", "remove", "list", "Number", "replace", "select", "indent", "Math", "floor", "length", "setIndent", "listExport", "listNode", "exportChildren", "depth", "output", "getChildren", "index", "listItemNode", "getChildrenSize", "push", "repeat", "prefix", "getStart", "getChecked", "join", "CHECK_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "CheckListPlugin", "LexicalCheckListPlugin", "_jsx", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "ChecklistIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_CHECK_LIST_COMMAND", "undefined", "order", "ChecklistFeatureClient", "createClientFeature", "featureProviderMap", "plugins", "Component", "LexicalCheckListPlugin", "position", "shouldRegister", "shouldRegisterListBaseNodes", "push", "LexicalListPlugin", "markdownTransformers", "CHECK_LIST", "nodes", "ListNode", "ListItemNode", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "$isListNode", "INSERT_ORDERED_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "OrderedListIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeWidth", "$isListNode", "ListItemNode", "ListNode", "ORDERED_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "OrderedListIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_ORDERED_LIST_COMMAND", "undefined", "order", "OrderedListFeatureClient", "createClientFeature", "featureProviderMap", "shouldRegister", "shouldRegisterListBaseNodes", "markdownTransformers", "ORDERED_LIST", "nodes", "ListNode", "ListItemNode", "plugins", "Component", "LexicalListPlugin", "position", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "$isListNode", "INSERT_UNORDERED_LIST_COMMAND", "ListItemNode", "ListNode", "$isRangeSelection", "UnorderedListIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "cx", "cy", "r", "stroke", "strokeWidth", "d", "$isListNode", "ListItemNode", "ListNode", "UNORDERED_LIST", "type", "dependencies", "ListNode", "ListItemNode", "export", "node", "exportChildren", "$isListNode", "listExport", "regExp", "replace", "listReplace", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "UnorderedListIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isListNode", "getListType", "parent", "getParent", "parentParent", "key", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_UNORDERED_LIST_COMMAND", "undefined", "order", "UnorderedListFeatureClient", "createClientFeature", "markdownTransformers", "UNORDERED_LIST", "nodes", "ListNode", "ListItemNode", "plugins", "Component", "LexicalListPlugin", "position", "slashMenu", "groups", "slashMenuListGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "addClassNamesToElement", "$applyNodeReplacement", "DecoratorNode", "React", "Component", "lazy", "then", "module", "default", "UnknownConvertedNodeComponent", "UnknownConvertedNode", "__data", "constructor", "data", "key", "clone", "node", "__key", "getType", "importJSON", "serializedNode", "$createUnknownConvertedNode", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "decorate", "_jsx", "exportJSON", "type", "version", "isInline", "updateDOM", "prevNode", "dom", "LexicalPluginToLexicalFeatureClient", "createClientFeature", "nodes", "UnknownConvertedNode", "addClassNamesToElement", "$applyNodeReplacement", "DecoratorNode", "React", "Component", "lazy", "then", "module", "default", "UnknownConvertedNodeComponent", "UnknownConvertedNode", "__data", "constructor", "data", "key", "clone", "node", "__key", "getType", "importJSON", "serializedNode", "$createUnknownConvertedNode", "canInsertTextAfter", "canInsertTextBefore", "createDOM", "config", "element", "document", "createElement", "decorate", "_jsx", "exportJSON", "type", "version", "isInline", "updateDOM", "prevNode", "dom", "SlateToLexicalFeatureClient", "createClientFeature", "nodes", "UnknownConvertedNode", "$setBlocksType", "$createParagraphNode", "$getSelection", "$isParagraphNode", "$isRangeSelection", "toolbarGroups", "toolbarTextDropdownGroupWithItems", "ChildComponent", "TextIcon", "isActive", "selection", "$isRangeSelection", "node", "getNodes", "$isParagraphNode", "getParent", "key", "label", "i18n", "t", "onSelect", "editor", "update", "$getSelection", "$setBlocksType", "$createParagraphNode", "order", "ParagraphFeatureClient", "createClientFeature", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "keywords", "toolbarFixed", "toolbarInline", "c", "_c", "useLexicalComposerContext", "useEffect", "useState", "BlockquoteJSXConverter", "quote", "node", "nodesToJSX", "children", "nodes", "_jsx", "HeadingJSXConverter", "heading", "node", "nodesToJSX", "children", "nodes", "NodeTag", "tag", "_jsx", "HorizontalRuleJSXConverter", "horizontalrule", "_jsx", "LinebreakJSXConverter", "linebreak", "_jsx", "LinkJSXConverter", "internalDocToHref", "autolink", "node", "nodesToJSX", "children", "nodes", "rel", "fields", "newTab", "undefined", "target", "_jsx", "href", "url", "link", "linkType", "linkNode", "console", "error", "v4", "uuidv4", "ListJSXConverter", "list", "node", "nodesToJSX", "children", "nodes", "NodeTag", "tag", "_jsx", "className", "listType", "listitem", "parent", "hasSubLists", "some", "child", "type", "uuid", "checked", "role", "style", "listStyleType", "tabIndex", "value", "_jsxs", "_Fragment", "id", "readOnly", "htmlFor", "undefined", "ParagraphJSXConverter", "paragraph", "node", "nodesToJSX", "children", "nodes", "length", "_jsx", "TabJSXConverter", "tab", "TableJSXConverter", "table", "node", "nodesToJSX", "children", "nodes", "_jsx", "className", "style", "borderCollapse", "tablecell", "TagName", "headerState", "headerStateClass", "backgroundColor", "undefined", "border", "padding", "colSpan", "rowSpan", "tablerow", "NodeFormat", "DOM_ELEMENT_TYPE", "DOM_TEXT_TYPE", "NO_DIRTY_NODES", "HAS_DIRTY_NODES", "FULL_RECONCILE", "IS_NORMAL", "IS_TOKEN", "IS_SEGMENTED", "IS_INERT", "IS_BOLD", "IS_ITALIC", "IS_STRIKETHROUGH", "IS_UNDERLINE", "IS_CODE", "IS_SUBSCRIPT", "IS_SUPERSCRIPT", "IS_HIGHLIGHT", "IS_DIRECTIONLESS", "IS_UNMERGEABLE", "IS_ALIGN_LEFT", "IS_ALIGN_CENTER", "IS_ALIGN_RIGHT", "IS_ALIGN_JUSTIFY", "IS_ALIGN_START", "IS_ALIGN_END", "IS_ALL_FORMATTING", "NON_BREAKING_SPACE", "DOUBLE_LINE_BREAK", "RTL", "LTR", "RTL_REGEX", "RegExp", "LTR_REGEX", "TEXT_TYPE_TO_FORMAT", "bold", "code", "highlight", "italic", "strikethrough", "subscript", "superscript", "underline", "DETAIL_TYPE_TO_DETAIL", "directionless", "unmergeable", "ELEMENT_TYPE_TO_FORMAT", "center", "end", "justify", "left", "right", "start", "ELEMENT_FORMAT_TO_TYPE", "TEXT_MODE_TO_TYPE", "normal", "segmented", "token", "TEXT_TYPE_TO_MODE", "TextJSXConverter", "text", "node", "format", "NodeFormat", "IS_BOLD", "_jsx", "IS_ITALIC", "IS_STRIKETHROUGH", "style", "textDecoration", "IS_UNDERLINE", "IS_CODE", "IS_SUBSCRIPT", "IS_SUPERSCRIPT", "UploadJSXConverter", "upload", "node", "uploadNode", "value", "uploadDoc", "alt", "fields", "url", "mimeType", "startsWith", "_jsx", "href", "rel", "filename", "sizes", "Object", "keys", "length", "height", "src", "width", "pictureJSX", "size", "imageSize", "filesize", "imageSizeURL", "push", "media", "srcSet", "type", "defaultJSXConverters", "ParagraphJSXConverter", "TextJSXConverter", "LinebreakJSXConverter", "BlockquoteJSXConverter", "TableJSXConverter", "HeadingJSXConverter", "HorizontalRuleJSXConverter", "ListJSXConverter", "LinkJSXConverter", "UploadJSXConverter", "TabJSXConverter", "jsx", "_jsx", "Fragment", "_Fragment", "React", "hasText", "value", "root", "children", "length", "hasOnlyEmptyParagraph", "type", "paragraphNode", "paragraphNodeChild", "createConverterFromNodeMapValue", "viewDef", "args", "converterArgs", "isEditor", "isJSXConverter", "Component", "html", "htmlContent", "_jsx", "dangerouslySetInnerHTML", "__html", "nodeMapToConverters", "nodeMap", "converters", "nodeType", "value", "Object", "entries", "blocks", "blockType", "_viewDef", "inlineBlocks", "convertLexicalToJSX", "data", "disableIndent", "disableTextAlign", "hasText", "mergedConverters", "convertLexicalNodesToJSX", "nodes", "root", "children", "parent", "_Fragment", "unknownConverter", "unknown", "map", "node", "i", "converterForNode", "type", "fields", "console", "error", "reactNode", "childIndex", "nodesToJSX", "style", "Array", "isArray", "includes", "format", "textAlign", "indent", "paddingInlineStart", "Number", "React", "isValidElement", "newStyle", "props", "cloneElement", "key", "filter", "Boolean", "RichText", "className", "converters", "data", "editorState", "disableContainer", "disableIndent", "disableTextAlign", "nodeMap", "finalConverters", "defaultConverters", "defaultJSXConverters", "content", "Array", "isArray", "convertLexicalToJSX", "_jsx", "_Fragment", "RichTextPlugin", "$", "_c", "editor", "useLexicalComposerContext", "t0", "getEditorState", "toJSON", "editorState", "setEditorState", "useState", "t1", "t2", "registerUpdateListener", "t3", "editorState_0", "useEffect", "_jsx", "className", "children", "RichText", "converters", "defaultJSXConverters", "data", "DebugJsxConverterFeatureClient", "createClientFeature", "plugins", "Component", "RichTextPlugin", "position", "tailwindColors", "amber", "black", "blue", "current", "cyan", "emerald", "fuchsia", "gray", "green", "indigo", "inherit", "lime", "neutral", "orange", "pink", "purple", "red", "rose", "sky", "slate", "stone", "teal", "transparent", "violet", "white", "yellow", "zinc", "defaultColors", "text", "css", "label", "background", "$isNodeSelection", "RelationshipIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "clipPath", "d", "stroke", "strokeLinecap", "strokeLinejoin", "id", "transform", "$applyNodeReplacement", "React", "DecoratorBlockNode", "addClassNamesToElement", "$applyNodeReplacement", "$relationshipElementToServerNode", "domNode", "id", "getAttribute", "relationTo", "node", "$createServerRelationshipNode", "value", "RelationshipServerNode", "__data", "constructor", "data", "format", "key", "clone", "__format", "__key", "getType", "importDOM", "div", "hasAttribute", "conversion", "priority", "importJSON", "serializedNode", "version", "importedData", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "theme", "relationship", "decorate", "_editor", "_config", "exportDOM", "setAttribute", "String", "text", "createTextNode", "getTextContent", "append", "exportJSON", "getData", "type", "getLatest", "setData", "writable", "getWritable", "RelationshipComponent", "lazy", "then", "module", "default", "$relationshipElementToNode", "domNode", "id", "getAttribute", "relationTo", "node", "$createRelationshipNode", "value", "RelationshipNode", "RelationshipServerNode", "clone", "getType", "importDOM", "div", "hasAttribute", "conversion", "priority", "importJSON", "serializedNode", "version", "importedData", "setFormat", "format", "decorate", "editor", "config", "_jsx", "className", "theme", "relationship", "data", "__data", "__format", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "$isRelationshipNode", "c", "_c", "useLexicalComposerContext", "$insertNodeToNearestRoot", "$getPreviousSelection", "$getSelection", "$isParagraphNode", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "createCommand", "useEffect", "c", "_c", "useLexicalComposerContext", "toast", "$getNodeByKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "c", "_c", "useLexicalComposerContext", "useListDrawer", "useModal", "$getNodeByKey", "$getPreviousSelection", "$getRoot", "$getSelection", "$isRangeSelection", "$setSelection", "useEffect", "useState", "useLexicalListDrawer", "args", "$", "editor", "selectionState", "setSelectionState", "wasOpen", "setWasOpen", "BaseListDrawer", "BaseListDrawerToggler", "t0", "closeDrawer", "baseCloseDrawer", "drawerSlug", "listDrawerSlug", "isDrawerOpen", "openDrawer", "baseOpenDrawer", "modalState", "t1", "Symbol", "for", "selection", "$storeSelection", "t2", "update", "anchor", "focus", "key", "clone", "selectEnd", "discrete", "skipTransforms", "restoreSelection", "t3", "closeListDrawer", "t4", "t5", "thisModalState", "isOpen", "setTimeout", "t6", "props", "_jsx", "onClick", "t7", "t8", "isListDrawerOpen", "ListDrawer", "ListDrawerToggler", "insertRelationship", "editor", "relationTo", "replaceNodeKey", "value", "update", "node", "$getNodeByKey", "replace", "$createRelationshipNode", "dispatchCommand", "INSERT_RELATIONSHIP_COMMAND", "RelationshipDrawerComponent", "t0", "$", "_c", "enabledCollectionSlugs", "useLexicalComposerContext", "setReplaceNodeKey", "useState", "t1", "t2", "collectionSlugs", "selectedCollection", "closeListDrawer", "ListDrawer", "openListDrawer", "useLexicalListDrawer", "t3", "t4", "registerCommand", "INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND", "payload", "nodeKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "t5", "t6", "collectionSlug", "doc", "id", "onSelect", "_jsx", "RelationshipDrawerComponentFallback", "_temp", "RelationshipDrawer", "length", "toast", "error", "useConfig", "useEntityVisibility", "React", "useEnabledRelationships", "options", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "uploads", "config", "collections", "visibleEntities", "useMemo", "enabledCollectionSlugs", "enabledCollections", "whitelistSet", "Set", "blacklistSet", "collection", "slug", "admin", "enableRichTextRelationship", "upload", "includes", "has", "push", "INSERT_RELATIONSHIP_COMMAND", "createCommand", "RelationshipPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "disabledCollections", "t2", "enabledCollections", "t3", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "enabledCollectionSlugs", "useEnabledRelationships", "t4", "t5", "hasNodes", "RelationshipNode", "Error", "registerCommand", "_temp", "COMMAND_PRIORITY_EDITOR", "useEffect", "t6", "_jsx", "RelationshipDrawer", "payload", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "relationshipNode", "$createRelationshipNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "RelationshipFeatureClient", "createClientFeature", "nodes", "RelationshipNode", "plugins", "Component", "RelationshipPlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "RelationshipIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND", "replace", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isRelationshipNode", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "useScrollInfo", "useThrottledEffect", "useTranslation", "React", "useMemo", "c", "_c", "mergeRegister", "$addUpdateTag", "$getSelection", "useDeferredValue", "useEffect", "useState", "baseClass", "ToolbarButton", "t0", "$", "_c", "children", "editor", "item", "t1", "Symbol", "for", "active", "enabled", "_state", "setState", "useState", "deferredState", "useDeferredValue", "editorConfigContext", "useEditorConfigContext", "t2", "t3", "t4", "key", "t5", "filter", "Boolean", "className", "join", "t6", "getEditorState", "read", "selection", "$getSelection", "newActive", "isActive", "newEnabled", "isEnabled", "prev", "updateStates", "runDeprioritized", "useRunDeprioritized", "t7", "t8", "listener", "cleanup", "mergeRegister", "registerUpdateListener", "document", "addEventListener", "removeEventListener", "useEffect", "t9", "focus", "update", "_temp", "onSelect", "handleClick", "handleMouseDown", "_temp2", "t10", "_jsx", "onClick", "onMouseDown", "type", "$addUpdateTag", "e", "preventDefault", "c", "_c", "React", "useCallback", "useDeferredValue", "useEffect", "useMemo", "mergeRegister", "useTranslation", "$getSelection", "Button", "$addUpdateTag", "isDOMNode", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "createPortal", "baseClass", "DropDownContext", "createContext", "DropDownItem", "active", "children", "editor", "enabled", "Icon", "item", "itemKey", "tooltip", "className", "key", "filter", "Boolean", "join", "ref", "dropDownContext", "use", "Error", "registerItem", "current", "_jsx", "buttonStyle", "disabled", "extraButtonProps", "icon", "iconPosition", "iconStyle", "onClick", "focus", "update", "onSelect", "isActive", "onMouseDown", "e", "preventDefault", "type", "DropDownItems", "dropDownRef", "itemsContainerClassNames", "onClose", "items", "setItems", "highlightedItem", "setHighlightedItem", "itemRef", "prev", "handleKeyDown", "event", "includes", "index", "indexOf", "length", "contextValue", "value", "onKeyDown", "DropDown", "buttonAriaLabel", "buttonClassName", "dropdownKey", "label", "stopCloseOnClickSelf", "buttonRef", "showDropDown", "setShowDropDown", "handleClose", "button", "dropDown", "left", "top", "getBoundingClientRect", "scrollTopOffset", "window", "scrollY", "document", "documentElement", "scrollTop", "style", "offsetHeight", "Math", "min", "innerWidth", "offsetWidth", "handle", "target", "contains", "addEventListener", "removeEventListener", "portal", "body", "_jsxs", "Fragment", "baseClass", "ToolbarItem", "t0", "$", "_c", "active", "anchorElem", "editor", "enabled", "item", "i18n", "useTranslation", "fieldProps", "t1", "useEditorConfigContext", "featureClientSchemaMap", "schemaPath", "Component", "t2", "_jsx", "key", "title", "croppedTitle", "label", "length", "substring", "DropDownItem", "Icon", "ChildComponent", "undefined", "itemKey", "tooltip", "children", "className", "MemoToolbarItem", "React", "memo", "ToolbarDropdown", "classNames", "group", "itemsContainerClassNames", "maxActiveItems", "onActiveChange", "toolbarState", "setToolbarState", "useState", "activeItemKeys", "enabledGroup", "enabledItemKeys", "deferredToolbarState", "useDeferredValue", "editorConfigContext", "items", "groupKey", "runDeprioritized", "useRunDeprioritized", "updateStates", "useCallback", "getEditorState", "read", "selection", "$getSelection", "_activeItemKeys", "_activeItems", "_enabledItemKeys", "isActive", "push", "isEnabled", "activeItems", "useEffect", "mergeRegister", "registerUpdateListener", "renderedItems", "useMemo", "map", "includes", "DropDown", "buttonAriaLabel", "buttonClassName", "filter", "Boolean", "join", "disabled", "dropdownKey", "ButtonGroupItem", "anchorElem", "editor", "item", "Component", "_jsx", "key", "ChildComponent", "ToolbarButton", "ToolbarGroupComponent", "t0", "$", "_c", "editorConfig", "group", "index", "i18n", "useTranslation", "fieldProps", "t1", "useEditorConfigContext", "featureClientSchemaMap", "schemaPath", "dropdownLabel", "setDropdownLabel", "useState", "undefined", "DropdownIcon", "setDropdownIcon", "t2", "items", "type", "length", "t3", "useEffect", "t4", "t5", "activeItems", "label", "substring", "t", "count", "onActiveChange", "t6", "features", "toolbarFixed", "groups", "_jsxs", "className", "children", "ToolbarDropdown", "Icon", "itemsContainerClassNames", "maxActiveItems", "map", "item_0", "FixedToolbar", "clientProps", "parentWithFixedToolbar", "currentToolbarRef", "useRef", "isEditable", "useLexicalEditable", "y", "useScrollInfo", "parentToolbarElem", "useMemo", "disableIfParentHasFixedToolbar", "sibling", "editorContainerRef", "current", "previousElementSibling", "classList", "contains", "useThrottledEffect", "currentToolbarElem", "currentRect", "getBoundingClientRect", "parentRect", "bottom", "top", "remove", "add", "onFocus", "event", "stopPropagation", "ref", "Fragment", "i", "getParentEditorWithFixedToolbar", "editorConfigContext", "parentEditor", "resolvedFeatureMap", "has", "FixedToolbarPlugin", "currentEditor", "useLexicalComposerContext", "currentEditorConfig", "applyToFocusedEditor", "focusedEditor", "Symbol", "for", "bb0", "document", "body", "FixedToolbarFeatureClient", "createClientFeature", "plugins", "Component", "FixedToolbarPlugin", "position", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "mergeRegister", "$getSelection", "$isRangeSelection", "$isTextNode", "COMMAND_PRIORITY_LOW", "getDOMSelection", "SELECTION_CHANGE_COMMAND", "useCallback", "useEffect", "useRef", "useState", "React", "createPortal", "getDOMRangeRect", "nativeSelection", "rootElement", "domRange", "getRangeAt", "rect", "anchorNode", "inner", "firstElementChild", "getBoundingClientRect", "setFloatingElemPosition", "args", "alwaysDisplayOnTop", "anchorElem", "anchorFlippedOffset", "floatingElem", "horizontalOffset", "HORIZONTAL_OFFSET", "horizontalPosition", "specialHandlingForCaret", "targetRect", "verticalGap", "VERTICAL_GAP", "scrollerElem", "parentElement", "style", "opacity", "transform", "floatingElemRect", "getBoundingClientRect", "anchorElementRect", "editorScrollerRect", "top", "height", "left", "width", "addedToTop", "right", "bottom", "ButtonGroupItem", "anchorElem", "editor", "item", "Component", "_jsx", "key", "ChildComponent", "ToolbarButton", "ToolbarGroupComponent", "t0", "$", "_c", "group", "index", "editorConfig", "useEditorConfigContext", "DropdownIcon", "setDropdownIcon", "useState", "t1", "items", "type", "length", "undefined", "t2", "useEffect", "t3", "t4", "activeItems", "onActiveChange", "t5", "features", "toolbarInline", "groups", "_jsxs", "className", "children", "ToolbarDropdown", "Icon", "maxActiveItems", "map", "item_0", "InlineToolbar", "floatingToolbarRef", "useRef", "caretRef", "closeFloatingToolbar", "useCallback", "current", "isOpacityZero", "style", "opacity", "isPointerEventsNone", "pointerEvents", "mouseMoveListener", "e", "buttons", "x", "clientX", "y", "clientY", "elementUnderMouse", "document", "elementFromPoint", "contains", "mouseUpListener", "addEventListener", "removeEventListener", "$updateTextFormatFloatingToolbar", "selection", "$getSelection", "nativeSelection", "getDOMSelection", "_window", "possibleLinkEditor", "querySelector", "isLinkEditorVisible", "rootElement", "getRootElement", "isCollapsed", "anchorNode", "rangeRect", "getDOMRangeRect", "offsetIfFlipped", "setFloatingElemPosition", "alwaysDisplayOnTop", "floatingElem", "horizontalPosition", "targetRect", "anchorFlippedOffset", "horizontalOffset", "specialHandlingForCaret", "verticalGap", "scrollerElem", "parentElement", "update", "getEditorState", "read", "window", "mergeRegister", "registerUpdateListener", "editorState", "registerCommand", "SELECTION_CHANGE_COMMAND", "COMMAND_PRIORITY_LOW", "ref", "i", "useInlineToolbar", "isText", "setIsText", "isEditable", "useLexicalEditable", "isComposing", "$isRangeSelection", "getTextContent", "nodes", "getNodes", "foundNodeWithText", "node", "$isTextNode", "rawTextContent", "replace", "updatePopup", "registerRootListener", "createPortal", "InlineToolbarPlugin", "useLexicalComposerContext", "InlineToolbarFeatureClient", "createClientFeature", "plugins", "Component", "InlineToolbarPlugin", "position", "TableCellNode", "TableNode", "TableRowNode", "TableIcon", "_jsx", "className", "fill", "height", "viewBox", "width", "xmlns", "clipRule", "d", "fillRule", "$createTableCellNode", "$createTableNode", "$createTableRowNode", "$isTableCellNode", "$isTableNode", "$isTableRowNode", "TableCellHeaderStates", "TableCellNode", "TableNode", "TableRowNode", "$isParagraphNode", "$isTextNode", "TABLE_ROW_REG_EXP", "TABLE_ROW_DIVIDER_REG_EXP", "TableMarkdownTransformer", "allTransformers", "type", "dependencies", "TableNode", "TableRowNode", "TableCellNode", "export", "node", "$isTableNode", "output", "row", "getChildren", "rowOutput", "$isTableRowNode", "isHeaderRow", "cell", "$isTableCellNode", "push", "$convertToMarkdownString", "replace", "trim", "__headerState", "TableCellHeaderStates", "ROW", "join", "map", "_", "regExp", "parentNode", "_1", "match", "match0", "test", "table", "getPreviousSibling", "rows", "lastRow", "length", "forEach", "setHeaderStyles", "remove", "matchCells", "mapToTableCells", "sibling", "maxCells", "$isParagraphNode", "getChildrenSize", "firstChild", "getFirstChild", "$isTextNode", "cells", "getTextContent", "Math", "max", "unshift", "previousSibling", "$createTableNode", "tableRow", "$createTableRowNode", "append", "i", "$createTableCell", "getTableColumnsSize", "selectEnd", "textContent", "$createTableCellNode", "NO_STATUS", "$convertFromMarkdownString", "split", "text", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$computeTableMapSkipCellCheck", "$deleteTableColumnAtSelection", "$deleteTableRowAtSelection", "$getNodeTriplet", "$getTableCellNodeFromLexicalNode", "$getTableColumnIndexFromTableCellNode", "$getTableNodeFromLexicalNodeOrThrow", "$getTableRowIndexFromTableCellNode", "$insertTableColumnAtSelection", "$insertTableRowAtSelection", "$isTableCellNode", "$isTableSelection", "$mergeCells", "$unmergeCell", "getTableElement", "getTableObserverFromTableElement", "TableCellHeaderStates", "TableCellNode", "mergeRegister", "useScrollInfo", "$getSelection", "$isElementNode", "$isRangeSelection", "$isTextNode", "$setSelection", "COMMAND_PRIORITY_CRITICAL", "getDOMSelection", "isDOMNode", "SELECTION_CHANGE_COMMAND", "React", "useCallback", "useEffect", "useRef", "useState", "createPortal", "MeatballsIcon", "_jsxs", "fill", "height", "viewBox", "width", "xmlns", "_jsx", "d", "computeSelectionCount", "selection", "selectionShape", "getShape", "columns", "toX", "fromX", "rows", "toY", "fromY", "$canUnmerge", "$getSelection", "$isRangeSelection", "isCollapsed", "$isTableSelection", "anchor", "is", "focus", "cell", "$getNodeTriplet", "__colSpan", "__rowSpan", "$selectLastDescendant", "node", "lastDescendant", "getLastDescendant", "$isTextNode", "select", "$isElementNode", "selectEnd", "selectNext", "TableActionMenu", "cellMerge", "contextRef", "onClose", "setIsMenuOpen", "tableCellNode", "_tableCellNode", "editor", "useLexicalComposerContext", "dropDownRef", "useRef", "updateTableCellNode", "useState", "selectionCounts", "updateSelectionCounts", "canMergeCells", "setCanMergeCells", "canUnmergeCell", "setCanUnmergeCell", "y", "useScrollInfo", "useEffect", "registerMutationListener", "TableCellNode", "nodeMutations", "get", "getKey", "getEditorState", "read", "getLatest", "skipInitialization", "currentSelectionCounts", "menuButtonElement", "current", "dropDownElement", "rootElement", "getRootElement", "rootEleRect", "getBoundingClientRect", "menuButtonRect", "style", "opacity", "dropDownElementRect", "margin", "leftPosition", "right", "width", "window", "innerWidth", "position", "left", "pageXOffset", "topPosition", "top", "height", "innerHeight", "bottom", "handleClickOutside", "event", "isDOMNode", "target", "contains", "addEventListener", "removeEventListener", "clearTableSelection", "useCallback", "update", "isAttached", "tableNode", "$getTableNodeFromLexicalNodeOrThrow", "tableElement", "getTableElement", "getElementByKey", "Error", "tableObserver", "getTableObserverFromTableElement", "$clearHighlight", "markDirty", "$setSelection", "mergeTableCellsAtSelection", "tableCells", "getNodes", "filter", "$isTableCellNode", "targetCell", "$mergeCells", "unmergeTableCellsAtSelection", "$unmergeCell", "insertTableRowAtSelection", "shouldInsertAfter", "i", "$insertTableRowAtSelection", "insertTableColumnAtSelection", "$insertTableColumnAtSelection", "deleteTableRowAtSelection", "$deleteTableRowAtSelection", "deleteTableAtSelection", "remove", "deleteTableColumnAtSelection", "$deleteTableColumnAtSelection", "toggleTableRowIsHeader", "tableRowIndex", "$getTableRowIndexFromTableCellNode", "gridMap", "$computeTableMapSkipCellCheck", "rowCells", "Set", "newStyle", "getHeaderStyles", "TableCellHeaderStates", "ROW", "col", "length", "mapCell", "has", "add", "setHeaderStyles", "toggleTableColumnIsHeader", "tableColumnIndex", "$getTableColumnIndexFromTableCellNode", "columnCells", "COLUMN", "row", "toggleRowStriping", "setRowStriping", "getRowStriping", "toggleFirstColumnFreeze", "setFrozenColumns", "getFrozenColumns", "mergeCellButton", "_jsx", "className", "onClick", "type", "createPortal", "_jsxs", "e", "stopPropagation", "ref", "Fragment", "__headerState", "document", "body", "TableCellActionMenuContainer", "anchorElem", "menuButtonRef", "menuRootRef", "isMenuOpen", "setTableMenuCellNode", "$moveMenu", "menu", "nativeSelection", "getDOMSelection", "_window", "activeElement", "disable", "classList", "tableCellParentNodeDOM", "anchorNode", "tableCellNodeFromSelection", "$getTableCellNodeFromLexicalNode", "getNode", "enabled", "isSelecting", "toggle", "tableCellRect", "anchorRect", "transform", "timeoutId", "callback", "undefined", "delayedCallback", "setTimeout", "mergeRegister", "registerUpdateListener", "registerCommand", "SELECTION_CHANGE_COMMAND", "COMMAND_PRIORITY_CRITICAL", "registerRootListener", "prevRootElement", "clearTimeout", "prevTableCellDOM", "MeatballsIcon", "TableActionMenuPlugin", "t0", "$", "_c", "isEditable", "useLexicalEditable", "t1", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$computeTableMapSkipCellCheck", "$getTableNodeFromLexicalNodeOrThrow", "$getTableRowIndexFromTableCellNode", "$isTableCellNode", "$isTableRowNode", "getDOMCellFromTarget", "getTableElement", "TableNode", "calculateZoomLevel", "mergeRegister", "$getNearestNodeFromDOMNode", "isHTMLElement", "SKIP_SCROLL_INTO_VIEW_TAG", "React", "useCallback", "useEffect", "useRef", "useState", "createPortal", "MIN_ROW_HEIGHT", "MIN_COLUMN_WIDTH", "TableCellResizer", "editor", "targetRef", "useRef", "resizerRef", "tableRectRef", "hasTable", "setHasTable", "useState", "editorConfig", "useEditorConfigContext", "mouseStartPosRef", "mouseCurrentPos", "updateMouseCurrentPos", "activeCell", "updateActiveCell", "isMouseDown", "updateIsMouseDown", "draggingDirection", "updateDraggingDirection", "resetState", "useCallback", "current", "isMouseDownOnEvent", "event", "buttons", "useEffect", "tableKeys", "Set", "mergeRegister", "registerMutationListener", "TableNode", "nodeMutations", "nodeKey", "mutation", "delete", "add", "size", "registerNodeTransform", "tableNode", "getColWidths", "numColumns", "getColumnCount", "columnWidth", "setColWidths", "Array", "fill", "onMouseMove", "target", "isHTMLElement", "x", "clientX", "y", "clientY", "contains", "cell", "getDOMCellFromTarget", "getEditorState", "read", "tableCellNode", "$getNearestNodeFromDOMNode", "elem", "Error", "$getTableNodeFromLexicalNodeOrThrow", "tableElement", "getTableElement", "getElementByKey", "getKey", "getBoundingClientRect", "onMouseDown", "onMouseUp", "removeRootListener", "registerRootListener", "rootElement", "prevRootElement", "removeEventListener", "addEventListener", "isHeightChanging", "direction", "updateRowHeight", "heightChange", "update", "$isTableCellNode", "baseRowIndex", "$getTableRowIndexFromTableCellNode", "tableRows", "getChildren", "tableRowIndex", "getColSpan", "getRowSpan", "length", "tableRow", "$isTableRowNode", "height", "getHeight", "undefined", "rowCells", "Math", "min", "map", "getCellNodeHeight", "Infinity", "newHeight", "max", "setHeight", "tag", "SKIP_SCROLL_INTO_VIEW_TAG", "activeEditor", "clientHeight", "getCellColumnIndex", "tableMap", "columnIndex", "forEach", "row", "columnIndexInner", "updateColumnWidth", "widthChange", "$computeTableMapSkipCellCheck", "colWidths", "width", "newColWidths", "newWidth", "mouseUpHandler", "handler", "preventDefault", "stopPropagation", "zoom", "calculateZoomLevel", "document", "toggleResize", "resizerStyles", "setResizerStyles", "bottom", "left", "right", "top", "zoneWidth", "styles", "backgroundColor", "cursor", "window", "scrollX", "scrollY", "tableRect", "_jsx", "ref", "_jsxs", "Fragment", "className", "lexical", "theme", "tableCellResizer", "style", "TableCellResizerPlugin", "$", "_c", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "t0", "createPortal", "c", "_c", "useLexicalComposerContext", "useLexicalEditable", "$getTableAndElementByKey", "$getTableColumnIndexFromTableCellNode", "$getTableRowIndexFromTableCellNode", "$insertTableColumnAtSelection", "$insertTableRowAtSelection", "$isTableCellNode", "$isTableNode", "getTableElement", "TableNode", "$findMatchingParent", "mergeRegister", "$getNearestNodeFromDOMNode", "isHTMLElement", "useEffect", "useMemo", "useRef", "useState", "createPortal", "c", "_c", "useEffect", "useRef", "FUNC_ERROR_TEXT", "nativeMax", "Math", "max", "nativeMin", "min", "debounce", "func", "wait", "options", "lastArgs", "lastCallTime", "lastInvokeTime", "lastThis", "leading", "maxing", "maxWait", "result", "timerID", "trailing", "TypeError", "invokeFunc", "time", "args", "thisArg", "undefined", "apply", "leadingEdge", "setTimeout", "timerExpired", "remainingWait", "timeSinceLastCall", "timeSinceLastInvoke", "timeWaiting", "shouldInvoke", "Date", "now", "trailingEdge", "cancel", "clearTimeout", "flush", "debounced", "isInvoking", "arguments", "debounce_default", "useDebounce", "fn", "ms", "maxWait", "$", "_c", "debouncedRef", "useRef", "t0", "t1", "current", "debounce", "cancel", "useEffect", "t2", "Symbol", "for", "t3", "args", "BUTTON_WIDTH_PX", "TableHoverActionsContainer", "anchorElem", "editor", "useLexicalComposerContext", "isEditable", "useLexicalEditable", "editorConfig", "useEditorConfigContext", "isShownRow", "setShownRow", "useState", "isShownColumn", "setShownColumn", "shouldListenMouseMove", "setShouldListenMouseMove", "position", "setPosition", "tableSetRef", "useRef", "Set", "tableCellDOMNodeRef", "debouncedOnMouseMove", "useDebounce", "event", "isOutside", "tableDOMNode", "getMouseInfo", "lexical", "current", "hoveredRowNode", "hoveredColumnNode", "tableDOMElement", "getEditorState", "read", "maybeTableCell", "$getNearestNodeFromDOMNode", "$isTableCellNode", "table", "$findMatchingParent", "node", "$isTableNode", "getTableElement", "getElementByKey", "getKey", "rowCount", "getChildrenSize", "colCount", "getChildAtIndex", "rowIndex", "$getTableRowIndexFromTableCellNode", "colIndex", "$getTableColumnIndexFromTableCellNode", "tableContainerElement", "parentElement", "bottom", "tableElemBottom", "height", "tableElemHeight", "left", "tableElemLeft", "right", "tableElemRight", "width", "tableElemWidth", "y", "tableElemY", "getBoundingClientRect", "tableHasScroll", "classList", "contains", "scrollWidth", "clientWidth", "editorElemLeft", "editorElemY", "offsetLeft", "top", "offsetWidth", "tableResizeObserver", "useMemo", "ResizeObserver", "useEffect", "document", "addEventListener", "removeEventListener", "mergeRegister", "registerMutationListener", "TableNode", "mutations", "resetObserver", "key", "type", "add", "delete", "disconnect", "tableKey", "tableElement", "$getTableAndElementByKey", "observe", "size", "skipInitialization", "insertAction", "insertRow", "update", "selectEnd", "$insertTableRowAtSelection", "$insertTableColumnAtSelection", "_jsxs", "_Fragment", "_jsx", "className", "theme", "tableAddRows", "onClick", "style", "tableAddColumns", "target", "isHTMLElement", "closest", "tableCell", "tableCellResizer", "TableHoverActionsPlugin", "t0", "$", "_c", "t1", "undefined", "body", "t2", "createPortal", "c", "_c", "useLexicalComposerContext", "TablePlugin", "LexicalReactTablePlugin", "INSERT_TABLE_COMMAND", "TableCellNode", "TableNode", "TableRowNode", "mergeRegister", "formatDrawerSlug", "useEditDepth", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "createCommand", "createContext", "use", "useEffect", "useMemo", "useState", "React", "OPEN_TABLE_DRAWER_COMMAND", "createCommand", "CellContext", "createContext", "cellEditorConfig", "cellEditorPlugins", "set", "TableContext", "children", "contextValue", "setContextValue", "useState", "_jsx", "value", "useMemo", "TablePlugin", "$", "_c", "editor", "useLexicalComposerContext", "cellContext", "use", "editDepth", "useEditDepth", "fieldProps", "t0", "uuid", "useEditorConfigContext", "schemaPath", "t1", "t2", "formatDrawerSlug", "slug", "depth", "drawerSlug", "toggleDrawer", "useLexicalDrawer", "t3", "hasNodes", "TableNode", "TableRowNode", "TableCellNode", "Error", "mergeRegister", "registerCommand", "rangeSelection", "getEditorState", "read", "selection", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_EDITOR", "t4", "useEffect", "t5", "_fields", "data", "columns", "rows", "dispatchCommand", "INSERT_TABLE_COMMAND", "String", "t6", "_jsxs", "Fragment", "FieldsDrawer", "drawerTitle", "featureKey", "handleDrawerSubmit", "schemaPathSuffix", "LexicalReactTablePlugin", "hasCellBackgroundColor", "hasCellMerge", "hasHorizontalScroll", "TableFeatureClient", "createClientFeature", "markdownTransformers", "TableMarkdownTransformer", "nodes", "TableNode", "TableCellNode", "TableRowNode", "plugins", "Component", "TablePlugin", "position", "TableCellResizerPlugin", "TableActionMenuPlugin", "TableHoverActionsPlugin", "providers", "TableContext", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "TableIcon", "key", "keywords", "label", "onSelect", "editor", "dispatchCommand", "OPEN_TABLE_DRAWER_COMMAND", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "$isNodeSelection", "UploadIcon", "_jsxs", "className", "fill", "focusable", "height", "viewBox", "width", "xmlns", "_jsx", "d", "stroke", "strokeLinecap", "strokeLinejoin", "ObjectID", "$applyNodeReplacement", "React", "ObjectID", "$convertUploadElement", "domNode", "$createNode", "hasAttribute", "formID", "getAttribute", "node", "data", "pending", "src", "id", "relationTo", "fields", "value", "ObjectID", "default", "toHexString", "DecoratorBlockNode", "addClassNamesToElement", "ObjectID", "$applyNodeReplacement", "UploadServerNode", "DecoratorBlockNode", "__data", "constructor", "data", "format", "key", "clone", "node", "__format", "__key", "getType", "importDOM", "img", "conversion", "domNode", "$convertUploadElement", "$createUploadServerNode", "priority", "importJSON", "serializedNode", "version", "value", "id", "ObjectID", "default", "toHexString", "importedData", "fields", "pending", "relationTo", "setFormat", "isInline", "createDOM", "config", "element", "document", "createElement", "addClassNamesToElement", "theme", "upload", "decorate", "exportDOM", "setAttribute", "String", "formID", "src", "exportJSON", "getData", "type", "getLatest", "setData", "writable", "getWritable", "updateDOM", "$applyNodeReplacement", "ShimmerEffect", "PendingUploadComponent", "_jsx", "className", "height", "width", "RawUploadComponent", "lazy", "then", "module", "default", "UploadComponent", "UploadNode", "UploadServerNode", "clone", "node", "getType", "importDOM", "img", "conversion", "domNode", "$convertUploadElement", "$createUploadNode", "priority", "importJSON", "serializedNode", "version", "value", "id", "ObjectID", "toHexString", "importedData", "fields", "pending", "relationTo", "data", "setFormat", "format", "decorate", "editor", "config", "__data", "_jsx", "PendingUploadComponent", "className", "theme", "upload", "__format", "nodeKey", "getKey", "exportJSON", "$applyNodeReplacement", "$isUploadNode", "c", "_c", "useLexicalComposerContext", "$dfsIterator", "$insertNodeToNearestRoot", "mergeRegister", "useBulkUpload", "useEffectEvent", "useModal", "ObjectID", "$createRangeSelection", "$getPreviousSelection", "$getSelection", "$isParagraphNode", "$isRangeSelection", "$setSelection", "COMMAND_PRIORITY_EDITOR", "COMMAND_PRIORITY_LOW", "createCommand", "DROP_COMMAND", "getDOMSelectionFromTarget", "isHTMLElement", "PASTE_COMMAND", "useEffect", "c", "_c", "useLexicalComposerContext", "toast", "$getNodeByKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "useState", "insertUpload", "editor", "relationTo", "replaceNodeKey", "value", "update", "node", "$getNodeByKey", "replace", "$createUploadNode", "data", "fields", "dispatchCommand", "INSERT_UPLOAD_COMMAND", "UploadDrawerComponent", "t0", "$", "_c", "enabledCollectionSlugs", "useLexicalComposerContext", "setReplaceNodeKey", "useState", "t1", "collectionSlugs", "uploads", "closeListDrawer", "ListDrawer", "openListDrawer", "useLexicalListDrawer", "t2", "t3", "registerCommand", "INSERT_UPLOAD_WITH_DRAWER_COMMAND", "payload", "nodeKey", "COMMAND_PRIORITY_EDITOR", "useEffect", "t4", "t5", "collectionSlug", "doc", "id", "onSelect", "_jsx", "UploadDrawerComponentFallback", "_temp", "UploadDrawer", "length", "toast", "error", "canDropImage", "event", "target", "isHTMLElement", "closest", "parentElement", "getDragSelection", "range", "domSelection", "getDOMSelectionFromTarget", "document", "caretRangeFromPoint", "clientX", "clientY", "rangeParent", "collapse", "rangeOffset", "getRangeAt", "Error", "INSERT_UPLOAD_COMMAND", "createCommand", "UploadPlugin", "t0", "$", "_c", "clientProps", "editor", "useLexicalComposerContext", "t1", "disabledCollections", "t2", "enabledCollections", "t3", "collectionSlugsBlacklist", "collectionSlugsWhitelist", "uploads", "enabledCollectionSlugs", "useEnabledRelationships", "drawerSlug", "bulkUploadDrawerSlug", "setCollectionSlug", "setInitialForms", "setOnCancel", "setOnSuccess", "setSelectableCollections", "useBulkUpload", "isModalOpen", "openModal", "useModal", "t4", "t5", "files", "length", "initialForms", "map", "_temp", "update", "_temp2", "newDocs", "newDocsMap", "Map", "_temp3", "dfsNode_0", "$dfsIterator", "node_0", "dfsNode", "node", "$isUploadNode", "nodeData_0", "getData", "nodeData", "pending", "newDoc", "get", "formID", "replace", "$createUploadNode", "data", "id", "ObjectID", "default", "toHexString", "fields", "relationTo", "collectionSlug", "value", "doc", "openBulkUpload", "useEffectEvent", "hasNodes", "UploadNode", "mergeRegister", "registerNodeTransform", "node_1", "nodeData_1", "transformedImage", "src", "startsWith", "mimeMatch", "match", "mimeType", "base64Data", "byteCharacters", "atob", "byteNumbers", "Array", "i", "charCodeAt", "byteArray", "Uint8Array", "File", "split", "type", "blob", "fetch", "inferredFileName", "pop", "registerCommand", "payload", "selection", "$getSelection", "$getPreviousSelection", "$isRangeSelection", "uploadNode", "focus", "focusNode", "getNode", "$insertNodeToNearestRoot", "$isParagraphNode", "__first", "remove", "COMMAND_PRIORITY_EDITOR", "PASTE_COMMAND", "ClipboardEvent", "clipboardData", "types", "includes", "files_0", "from", "forEach", "file_2", "push", "alt", "file", "selection_0", "file_3", "pendingUploadNode", "URL", "createObjectURL", "focus_0", "focusNode_0", "COMMAND_PRIORITY_LOW", "DROP_COMMAND", "event_0", "DragEvent", "dt", "dataTransfer", "files_1", "file_4", "preventDefault", "stopPropagation", "selection_1", "$createRangeSelection", "applyDOMRange", "$setSelection", "file_5", "pendingUploadNode_0", "focus_1", "focusNode_1", "t6", "useEffect", "t7", "_jsx", "UploadDrawer", "UploadFeatureClient", "createClientFeature", "nodes", "UploadNode", "plugins", "Component", "UploadPlugin", "position", "slashMenu", "groups", "slashMenuBasicGroupWithItems", "Icon", "UploadIcon", "key", "keywords", "label", "i18n", "t", "onSelect", "editor", "dispatchCommand", "INSERT_UPLOAD_WITH_DRAWER_COMMAND", "replace", "toolbarFixed", "toolbarAddDropdownGroupWithItems", "ChildComponent", "isActive", "selection", "$isNodeSelection", "getNodes", "length", "firstNode", "$isUploadNode", "c", "_c", "ShimmerEffect", "useConfig", "lazy", "Suspense", "useEffect", "useState", "LexicalEditorTheme", "block", "blockCursor", "characterLimit", "code", "inlineBlock", "heading", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "hrSelected", "indent", "link", "list", "checklist", "listitem", "listitemChecked", "listitemUnchecked", "nested", "olDepth", "ul", "ltr", "mark", "markOverlap", "paragraph", "placeholder", "quote", "relationship", "rtl", "tab", "table", "tableAddColumns", "tableAddRows", "tableAlignment", "center", "right", "tableCell", "tableCellActionButton", "tableCellActionButtonContainer", "tableCellHeader", "tableCellResizer", "tableCellSelected", "tableFrozenColumn", "tableRowStriping", "tableScrollableWrapper", "tableSelected", "tableSelection", "text", "bold", "italic", "strikethrough", "subscript", "superscript", "underline", "underlineStrikethrough", "upload", "defaultEditorLexicalConfig", "namespace", "theme", "LexicalEditorTheme", "loadClientFeatures", "config", "featureClientImportMap", "featureClientSchemaMap", "field", "schemaPath", "unSanitizedEditorConfig", "featureProviderMap", "Map", "featureProvider", "features", "clientFeatureProps", "featureKey", "order", "undefined", "Error", "set", "sort", "a", "b", "resolvedFeatures", "loaded", "feature", "key", "deepMerge", "sanitizeClientFeatures", "features", "sanitized", "enabledFeatures", "enabledFormats", "markdownTransformers", "nodes", "plugins", "providers", "slashMenu", "dynamicGroups", "groups", "toolbarFixed", "toolbarInline", "customGroups", "forEach", "feature", "key", "sanitizedClientFeatureProps", "size", "length", "concat", "enableFormats", "push", "node", "plugin", "i", "clientProps", "Component", "position", "group", "foundGroup", "find", "sanitizedGroup", "filter", "items", "optionGroup", "transformer", "allNodes", "allTransformers", "Object", "keys", "map", "customConfig", "sort", "a", "b", "order", "sanitizeClientEditorConfig", "resolvedClientFeatureMap", "lexical", "admin", "view", "resolvedFeatureMap", "RichTextEditor", "lazy", "then", "module", "default", "RichText", "RichTextField", "props", "_jsx", "RichTextViewProvider", "views", "RichTextFieldImpl", "$", "_c", "admin", "t0", "clientFeatures", "featureClientImportMap", "t1", "featureClientSchemaMap", "field", "lexicalEditorConfig", "t2", "schemaPath", "t3", "undefined", "_admin", "t4", "_lexicalEditorConfig", "defaultEditorLexicalConfig", "currentView", "useRichTextView", "currentViewAdminConfig", "currentViewLexicalEditorConfig", "lexical", "config", "useConfig", "finalSanitizedEditorConfig", "setFinalSanitizedEditorConfig", "useState", "t5", "t6", "view", "featureProvidersLocal", "clientFeature", "Object", "values", "clientFeatureProvider", "push", "clientFeatureProps", "resolvedClientFeatures", "loadClientFeatures", "name", "unSanitizedEditorConfig", "features", "sanitizeClientEditorConfig", "useEffect", "t7", "Suspense", "fallback", "ShimmerEffect", "height", "_createElement", "editorConfig", "key", "isHTMLElement", "x", "HTMLElement", "joinClasses", "args", "filter", "Boolean", "join", "elements", "WeakMap", "readTouch", "e", "touch", "changedTouches", "undefined", "clientX", "clientY", "addListener", "element", "cb", "elementValues", "get", "listeners", "Set", "handleTouchstart", "start", "handleTouchend", "end", "listener", "addEventListener", "set", "add", "deleteListener", "delete", "size", "removeEventListener", "addSwipeLeftListener", "force", "x", "y", "Math", "abs", "addSwipeRightListener", "addSwipeUpListener", "addSwipeDownListener", "c", "_c", "InlineBlockEditButton", "$", "_c", "EditButton", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockRemoveButton", "$", "_c", "RemoveButton", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockLabel", "$", "_c", "Label", "useInlineBlockComponentContext", "t0", "_jsx", "c", "_c", "InlineBlockContainer", "t0", "$", "_c", "children", "useInlineBlockComponentContext", "t1", "_jsx", "BlockCollapsible", "props", "children", "rest", "useBlockComponentContext", "_jsx", "c", "_c", "BlockEditButton", "$", "_c", "EditButton", "useBlockComponentContext", "t0", "_jsx", "c", "_c", "BlockRemoveButton", "$", "_c", "RemoveButton", "useBlockComponentContext", "t0", "_jsx", "stringify", "getRestPopulateFn", "apiURL", "depth", "draft", "locale", "id", "collectionSlug", "select", "query", "addQueryPrefix", "fetch", "credentials", "headers", "Accept", "method", "then", "res", "json", "codeConverter", "customEndRegex", "optional", "regExp", "customStartRegex", "doNotTrimChildren", "export", "fields", "code", "includes", "language", "length", "import", "children", "closeMatch", "openMatch", "startsWith", "slice", "endsWith", "input", "trim", "CodeField", "useFormFields", "useId", "useMemo", "defaultLanguages", "abap", "apex", "azcli", "bat", "bicep", "cameligo", "clojure", "coffee", "cpp", "csharp", "csp", "css", "cypher", "dart", "dockerfile", "ecl", "elixir", "flow9", "freemarker2", "fsharp", "go", "graphql", "handlebars", "hcl", "html", "ini", "java", "javascript", "julia", "kotlin", "less", "lexon", "liquid", "lua", "m3", "markdown", "mdx", "mips", "msdax", "mysql", "pascal", "pascaligo", "perl", "pgsql", "php", "pla", "plaintext", "postiats", "powerquery", "powershell", "protobuf", "pug", "python", "qsharp", "r", "razor", "redis", "redshift", "restructuredtext", "ruby", "rust", "sb", "scala", "scheme", "scss", "shell", "solidity", "sophia", "sparql", "sql", "st", "swift", "systemverilog", "tcl", "twig", "typescript", "typespec", "vb", "wgsl", "xml", "yaml", "CodeComponent", "autoComplete", "field", "forceRender", "languages", "defaultLanguages", "path", "permissions", "readOnly", "renderedBlocks", "schemaPath", "typescript", "validate", "languageField", "useFormFields", "fields", "language", "value", "initialValue", "instanceId", "useId", "label", "props", "useMemo", "type", "admin", "editorOptions", "editorProps", "defaultPath", "name", "undefined", "key", "_jsx", "CodeField", "onMount", "_editor", "monaco", "editor", "defineTheme", "base", "colors", "inherit", "rules", "typescriptDefaults", "setCompilerOptions", "allowNonTsExtensions", "allowJs", "allowSyntheticDefaultImports", "esModuleInterop", "jsx", "JsxEmit", "React", "moduleResolution", "ModuleResolutionKind", "NodeJs", "noEmit", "paths", "reactNamespace", "target", "ScriptTarget", "typeRoots", "setDiagnosticsOptions", "noSemanticValidation", "enableSemanticValidation", "noSyntaxValidation", "fetchTypes", "Array", "isArray", "length", "Promise", "all", "map", "typesText", "fetch", "url", "text", "addExtraLib", "filePath", "useLexicalEditable", "ChevronIcon", "Combobox", "CopyToClipboard", "PopupList", "RenderFields", "useForm", "useFormFields", "useTranslation", "React", "CodeBlockIcon", "_jsx", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "useCollapsible", "CollapseIcon", "_jsx", "fill", "height", "viewBox", "width", "xmlns", "d", "stroke", "strokeLinecap", "strokeLinejoin", "baseClass", "Collapse", "toggle", "useCollapsible", "_jsx", "className", "onClick", "type", "CollapseIcon", "useCollapsible", "useTranslation", "baseClass", "FloatingCollapse", "isCollapsed", "toggle", "useCollapsible", "t", "useTranslation", "_jsxs", "className", "onClick", "type", "_jsx", "CollapseIcon", "baseClass", "CodeBlockBlockComponent", "args", "languages", "languagesFromProps", "defaultLanguages", "BlockCollapsible", "formSchema", "RemoveButton", "useBlockComponentContext", "setModified", "useForm", "t", "useTranslation", "codeField", "useFormFields", "fields", "code", "selectedLanguageField", "setSelectedLanguage", "dispatch", "language", "type", "path", "value", "selectedLanguageLabel", "isEditable", "useLexicalEditable", "languageEntries", "React", "useMemo", "Object", "entries", "map", "languageCode", "languageLabel", "name", "Component", "_jsx", "PopupList", "Button", "active", "disabled", "onClick", "className", "Actions", "_jsxs", "Combobox", "button", "ChevronIcon", "buttonType", "horizontalAlign", "minEntriesForSearch", "searchPlaceholder", "showScrollbar", "size", "CopyToClipboard", "Collapse", "collapsibleProps", "AfterCollapsible", "FloatingCollapse", "disableHeaderToggle", "disableToggleIndicator", "Pill", "CodeBlockIcon", "RenderFields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "readOnly", "c", "_c", "FieldContext", "FieldPathContext", "ServerFunctionsContext", "ShimmerEffect", "useServerFunctions", "React", "useEffect", "useRef", "RenderLexical", "args", "$", "field", "initialValue", "Loading", "path", "schemaPath", "setValue", "value", "Component", "setComponent", "useState", "serverFunctionContext", "_internal_renderField", "entityType", "entitySlug", "split", "fieldPath", "name", "t0", "Field", "type", "admin", "hidden", "undefined", "renderLexical", "mounted", "t1", "t2", "current", "_jsx", "adjustedServerFunctionContext", "getFormState", "getFormStateArgs", "collectionSlug", "globalSlug", "children", "fieldValue", "disabled", "formInitializing", "formProcessing", "formSubmitted", "_temp", "showError", "buildEditorState", "nodes", "text", "editorJSON", "root", "type", "children", "direction", "format", "indent", "version", "push", "detail", "mode", "style", "textFormat", "textStyle", "length", "buildDefaultEditorState"]
7
7
  }