@payloadcms/richtext-lexical 4.0.0-internal.2fddfc0 → 4.0.0-internal.3aa3d85
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.
- package/LICENSE.md +1 -1
- package/dist/exports/client/Field-XH5C4HFU.js +2 -0
- package/dist/exports/client/Field-XH5C4HFU.js.map +7 -0
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/chunk-X3D4LZS7.js +2 -0
- package/dist/exports/client/chunk-X3D4LZS7.js.map +7 -0
- package/dist/exports/client/index.d.ts +0 -2
- package/dist/exports/client/index.d.ts.map +1 -1
- package/dist/exports/client/index.js +24 -25
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/blockquote/client/index.js +2 -2
- package/dist/features/blockquote/client/index.js.map +1 -1
- package/dist/features/blockquote/server/index.js +2 -2
- package/dist/features/blockquote/server/index.js.map +1 -1
- package/dist/features/blocks/client/component/index.css +2 -2
- package/dist/features/blocks/client/componentInline/index.css +8 -8
- package/dist/features/blocks/client/markdown/getLexicalToMarkdown.d.ts +1 -1
- package/dist/features/blocks/client/markdown/getLexicalToMarkdown.d.ts.map +1 -1
- package/dist/features/blocks/client/markdown/getLexicalToMarkdown.js +1 -1
- package/dist/features/blocks/client/markdown/getLexicalToMarkdown.js.map +1 -1
- package/dist/features/blocks/client/markdown/getMarkdownToLexical.d.ts +1 -1
- package/dist/features/blocks/client/markdown/getMarkdownToLexical.d.ts.map +1 -1
- package/dist/features/blocks/client/markdown/getMarkdownToLexical.js +5 -2
- package/dist/features/blocks/client/markdown/getMarkdownToLexical.js.map +1 -1
- package/dist/features/blocks/client/markdown/markdownTransformer.d.ts +1 -2
- package/dist/features/blocks/client/markdown/markdownTransformer.d.ts.map +1 -1
- package/dist/features/blocks/client/markdown/markdownTransformer.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.css +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.css +2 -4
- package/dist/features/blocks/premade/CodeBlock/Component/index.css +5 -5
- package/dist/features/blocks/server/markdown/markdownTransformer.d.ts +1 -1
- package/dist/features/blocks/server/markdown/markdownTransformer.d.ts.map +1 -1
- package/dist/features/blocks/server/markdown/markdownTransformer.js.map +1 -1
- package/dist/features/blocks/server/schema.d.ts.map +1 -1
- package/dist/features/blocks/server/schema.js +3 -2
- package/dist/features/blocks/server/schema.js.map +1 -1
- package/dist/features/converters/lexicalToMarkdown/index.d.ts.map +1 -1
- package/dist/features/converters/lexicalToMarkdown/index.js +1 -1
- package/dist/features/converters/lexicalToMarkdown/index.js.map +1 -1
- package/dist/features/converters/markdownToLexical/index.d.ts.map +1 -1
- package/dist/features/converters/markdownToLexical/index.js +5 -2
- package/dist/features/converters/markdownToLexical/index.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/style.css +2 -2
- package/dist/features/experimental_table/client/index.js +2 -2
- package/dist/features/experimental_table/client/index.js.map +1 -1
- package/dist/features/experimental_table/markdownTransformer.d.ts +2 -2
- package/dist/features/experimental_table/markdownTransformer.d.ts.map +1 -1
- package/dist/features/experimental_table/markdownTransformer.js +6 -3
- package/dist/features/experimental_table/markdownTransformer.js.map +1 -1
- package/dist/features/experimental_table/server/index.js +2 -2
- package/dist/features/experimental_table/server/index.js.map +1 -1
- package/dist/features/format/bold/feature.client.js +1 -1
- package/dist/features/format/bold/feature.client.js.map +1 -1
- package/dist/features/format/bold/feature.server.d.ts.map +1 -1
- package/dist/features/format/bold/feature.server.js +1 -1
- package/dist/features/format/bold/feature.server.js.map +1 -1
- package/dist/features/format/inlineCode/feature.client.js +1 -1
- package/dist/features/format/inlineCode/feature.client.js.map +1 -1
- package/dist/features/format/inlineCode/feature.server.d.ts.map +1 -1
- package/dist/features/format/inlineCode/feature.server.js +1 -1
- package/dist/features/format/inlineCode/feature.server.js.map +1 -1
- package/dist/features/format/italic/feature.client.js +1 -1
- package/dist/features/format/italic/feature.client.js.map +1 -1
- package/dist/features/format/italic/feature.server.d.ts.map +1 -1
- package/dist/features/format/italic/feature.server.js +1 -1
- package/dist/features/format/italic/feature.server.js.map +1 -1
- package/dist/features/format/strikethrough/feature.client.js +1 -1
- package/dist/features/format/strikethrough/feature.client.js.map +1 -1
- package/dist/features/format/strikethrough/feature.server.d.ts.map +1 -1
- package/dist/features/format/strikethrough/feature.server.js +1 -1
- package/dist/features/format/strikethrough/feature.server.js.map +1 -1
- package/dist/features/heading/client/index.js +2 -2
- package/dist/features/heading/client/index.js.map +1 -1
- package/dist/features/heading/markdownTransformer.d.ts +2 -2
- package/dist/features/heading/markdownTransformer.d.ts.map +1 -1
- package/dist/features/heading/markdownTransformer.js +6 -19
- package/dist/features/heading/markdownTransformer.js.map +1 -1
- package/dist/features/heading/server/index.js +2 -2
- package/dist/features/heading/server/index.js.map +1 -1
- package/dist/features/horizontalRule/client/index.js +2 -2
- package/dist/features/horizontalRule/client/index.js.map +1 -1
- package/dist/features/horizontalRule/client/markdownTransformer.d.ts +2 -2
- package/dist/features/horizontalRule/client/markdownTransformer.d.ts.map +1 -1
- package/dist/features/horizontalRule/client/markdownTransformer.js +1 -1
- package/dist/features/horizontalRule/client/markdownTransformer.js.map +1 -1
- package/dist/features/horizontalRule/client/plugin/index.css +2 -2
- package/dist/features/horizontalRule/server/index.js +2 -2
- package/dist/features/horizontalRule/server/index.js.map +1 -1
- package/dist/features/horizontalRule/server/markdownTransformer.d.ts +2 -2
- package/dist/features/horizontalRule/server/markdownTransformer.d.ts.map +1 -1
- package/dist/features/horizontalRule/server/markdownTransformer.js +1 -1
- package/dist/features/horizontalRule/server/markdownTransformer.js.map +1 -1
- package/dist/features/link/client/index.js +2 -2
- package/dist/features/link/client/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +3 -3
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/index.css +7 -11
- package/dist/features/link/markdownTransformer.d.ts +4 -4
- package/dist/features/link/markdownTransformer.d.ts.map +1 -1
- package/dist/features/link/markdownTransformer.js +2 -2
- package/dist/features/link/markdownTransformer.js.map +1 -1
- package/dist/features/link/markdownTransformer.spec.js +10 -10
- package/dist/features/link/markdownTransformer.spec.js.map +1 -1
- package/dist/features/link/server/baseFields.js.map +1 -1
- package/dist/features/link/server/index.js +2 -2
- package/dist/features/link/server/index.js.map +1 -1
- package/dist/features/link/server/schema.d.ts.map +1 -1
- package/dist/features/link/server/schema.js +4 -2
- package/dist/features/link/server/schema.js.map +1 -1
- package/dist/features/lists/checklist/client/index.js +1 -1
- package/dist/features/lists/checklist/client/index.js.map +1 -1
- package/dist/features/lists/checklist/server/index.js +1 -1
- package/dist/features/lists/checklist/server/index.js.map +1 -1
- package/dist/features/lists/orderedList/client/index.js +1 -1
- package/dist/features/lists/orderedList/client/index.js.map +1 -1
- package/dist/features/lists/orderedList/server/index.js +1 -1
- package/dist/features/lists/orderedList/server/index.js.map +1 -1
- package/dist/features/lists/unorderedList/client/index.js +1 -1
- package/dist/features/lists/unorderedList/client/index.js.map +1 -1
- package/dist/features/lists/unorderedList/server/index.js +1 -1
- package/dist/features/lists/unorderedList/server/index.js.map +1 -1
- package/dist/features/relationship/server/schema.d.ts +3 -3
- package/dist/features/relationship/server/schema.d.ts.map +1 -1
- package/dist/features/relationship/server/schema.js +22 -5
- package/dist/features/relationship/server/schema.js.map +1 -1
- package/dist/features/textState/feature.client.js +1 -1
- package/dist/features/textState/feature.client.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.css +2 -2
- package/dist/features/toolbars/inline/client/Toolbar/index.css +2 -13
- package/dist/features/toolbars/shared/ToolbarDropdown/index.css +8 -12
- package/dist/features/toolbars/shared/useToolbarStates.d.ts.map +1 -1
- package/dist/features/toolbars/shared/useToolbarStates.js +3 -1
- package/dist/features/toolbars/shared/useToolbarStates.js.map +1 -1
- package/dist/features/typesClient.d.ts +1 -1
- package/dist/features/typesClient.d.ts.map +1 -1
- package/dist/features/typesClient.js.map +1 -1
- package/dist/features/typesServer.d.ts +2 -2
- package/dist/features/typesServer.d.ts.map +1 -1
- package/dist/features/typesServer.js.map +1 -1
- package/dist/features/upload/client/component/index.css +9 -9
- package/dist/features/upload/client/plugin/index.js +5 -5
- package/dist/features/upload/client/plugin/index.js.map +1 -1
- package/dist/features/upload/server/index.js +2 -2
- package/dist/features/upload/server/index.js.map +1 -1
- package/dist/features/upload/server/markdownTransformer.d.ts +2 -2
- package/dist/features/upload/server/markdownTransformer.d.ts.map +1 -1
- package/dist/features/upload/server/markdownTransformer.js +1 -1
- package/dist/features/upload/server/markdownTransformer.js.map +1 -1
- package/dist/features/upload/server/schema.d.ts +4 -4
- package/dist/features/upload/server/schema.d.ts.map +1 -1
- package/dist/features/upload/server/schema.js +26 -6
- package/dist/features/upload/server/schema.js.map +1 -1
- package/dist/field/Diff/converters/unknown/index.css +1 -1
- package/dist/field/Field.js +1 -1
- package/dist/field/Field.js.map +1 -1
- package/dist/field/ViewSelector.css +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/field/index.css +11 -11
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -50
- package/dist/index.js.map +1 -1
- package/dist/lexical/LexicalEditor.css +2 -2
- package/dist/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/lexical/LexicalEditor.js +2 -36
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalProvider.d.ts.map +1 -1
- package/dist/lexical/LexicalProvider.js +7 -22
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/plugins/DecoratorPlugin/index.css +1 -1
- package/dist/lexical/plugins/MarkdownShortcut/index.d.ts.map +1 -1
- package/dist/lexical/plugins/MarkdownShortcut/index.js +1 -1
- package/dist/lexical/plugins/MarkdownShortcut/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.css +1 -5
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.css +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.css +3 -3
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/theme/EditorTheme.css +18 -19
- package/dist/lexical/ui/ContentEditable.css +5 -5
- package/dist/lexical/utils/markdown/convertFromMarkdownString.d.ts +17 -0
- package/dist/lexical/utils/markdown/convertFromMarkdownString.d.ts.map +1 -0
- package/dist/lexical/utils/markdown/convertFromMarkdownString.js +27 -0
- package/dist/lexical/utils/markdown/convertFromMarkdownString.js.map +1 -0
- package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js +88 -0
- package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js.map +1 -0
- package/dist/lexical/utils/markdown/createBlockNode.d.ts +1 -1
- package/dist/lexical/utils/markdown/createBlockNode.d.ts.map +1 -1
- package/dist/lexical/utils/markdown/createBlockNode.js.map +1 -1
- package/dist/lexical/utils/markdown/normalizeMarkdown.d.ts +25 -0
- package/dist/lexical/utils/markdown/normalizeMarkdown.d.ts.map +1 -0
- package/dist/lexical/utils/markdown/normalizeMarkdown.js +91 -0
- package/dist/lexical/utils/markdown/normalizeMarkdown.js.map +1 -0
- package/dist/lexical-proxy/@lexical-markdown.d.ts +1 -1
- package/dist/lexical-proxy/@lexical-markdown.d.ts.map +1 -1
- package/dist/lexical-proxy/@lexical-markdown.js +1 -1
- package/dist/lexical-proxy/@lexical-markdown.js.map +1 -1
- package/dist/types/schema.d.ts.map +1 -1
- package/dist/types/schema.js +12 -5
- package/dist/types/schema.js.map +1 -1
- package/dist/utilities/applyBaseFilterToFields.d.ts.map +1 -1
- package/dist/utilities/applyBaseFilterToFields.js.map +1 -1
- package/dist/utilities/generateImportMap.d.ts.map +1 -1
- package/dist/utilities/generateImportMap.js +3 -7
- package/dist/utilities/generateImportMap.js.map +1 -1
- package/package.json +22 -27
- package/dist/@types/assets.d.js +0 -2
- package/dist/@types/assets.d.js.map +0 -1
- package/dist/exports/client/Field-VW7ZGT6K.js +0 -2
- package/dist/exports/client/Field-VW7ZGT6K.js.map +0 -7
- package/dist/exports/client/chunk-4EIYXZ6H.js +0 -12
- package/dist/exports/client/chunk-4EIYXZ6H.js.map +0 -7
- package/dist/exports/server/rsc.browser.d.ts +0 -11
- package/dist/exports/server/rsc.browser.d.ts.map +0 -1
- package/dist/exports/server/rsc.browser.js +0 -10
- package/dist/exports/server/rsc.browser.js.map +0 -1
- package/dist/features/blockquote/markdownTransformer.d.ts +0 -3
- package/dist/features/blockquote/markdownTransformer.d.ts.map +0 -1
- package/dist/features/blockquote/markdownTransformer.js +0 -33
- package/dist/features/blockquote/markdownTransformer.js.map +0 -1
- package/dist/features/format/bold/markdownTransformers.d.ts +0 -6
- package/dist/features/format/bold/markdownTransformers.d.ts.map +0 -1
- package/dist/features/format/bold/markdownTransformers.js +0 -23
- package/dist/features/format/bold/markdownTransformers.js.map +0 -1
- package/dist/features/format/inlineCode/markdownTransformers.d.ts +0 -3
- package/dist/features/format/inlineCode/markdownTransformers.d.ts.map +0 -1
- package/dist/features/format/inlineCode/markdownTransformers.js +0 -6
- package/dist/features/format/inlineCode/markdownTransformers.js.map +0 -1
- package/dist/features/format/italic/markdownTransformers.d.ts +0 -4
- package/dist/features/format/italic/markdownTransformers.d.ts.map +0 -1
- package/dist/features/format/italic/markdownTransformers.js +0 -12
- package/dist/features/format/italic/markdownTransformers.js.map +0 -1
- package/dist/features/format/strikethrough/markdownTransformers.d.ts +0 -3
- package/dist/features/format/strikethrough/markdownTransformers.d.ts.map +0 -1
- package/dist/features/format/strikethrough/markdownTransformers.js +0 -6
- package/dist/features/format/strikethrough/markdownTransformers.js.map +0 -1
- package/dist/features/lists/checklist/markdownTransformers.d.ts +0 -3
- package/dist/features/lists/checklist/markdownTransformers.d.ts.map +0 -1
- package/dist/features/lists/checklist/markdownTransformers.js +0 -12
- package/dist/features/lists/checklist/markdownTransformers.js.map +0 -1
- package/dist/features/lists/orderedList/markdownTransformer.d.ts +0 -3
- package/dist/features/lists/orderedList/markdownTransformer.d.ts.map +0 -1
- package/dist/features/lists/orderedList/markdownTransformer.js +0 -12
- package/dist/features/lists/orderedList/markdownTransformer.js.map +0 -1
- package/dist/features/lists/shared/markdown.d.ts +0 -6
- package/dist/features/lists/shared/markdown.d.ts.map +0 -1
- package/dist/features/lists/shared/markdown.js +0 -57
- package/dist/features/lists/shared/markdown.js.map +0 -1
- package/dist/features/lists/unorderedList/markdownTransformer.d.ts +0 -3
- package/dist/features/lists/unorderedList/markdownTransformer.d.ts.map +0 -1
- package/dist/features/lists/unorderedList/markdownTransformer.js +0 -12
- package/dist/features/lists/unorderedList/markdownTransformer.js.map +0 -1
- package/dist/field/clientEntry.d.ts +0 -29
- package/dist/field/clientEntry.d.ts.map +0 -1
- package/dist/field/clientEntry.js +0 -86
- package/dist/field/clientEntry.js.map +0 -1
- package/dist/lexical/utils/guard.d.ts +0 -5
- package/dist/lexical/utils/guard.d.ts.map +0 -1
- package/dist/lexical/utils/guard.js +0 -9
- package/dist/lexical/utils/guard.js.map +0 -1
- package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.d.ts +0 -2
- package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.d.ts.map +0 -1
- package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js +0 -2
- package/dist/lexical-proxy/@lexical-react/LexicalContextMenuPlugin.js.map +0 -1
- package/dist/packages/@lexical/markdown/LexicalMarkdownHardLineBreak.spec.js +0 -160
- package/dist/packages/@lexical/markdown/LexicalMarkdownHardLineBreak.spec.js.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownExport.d.ts +0 -14
- package/dist/packages/@lexical/markdown/MarkdownExport.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownExport.js +0 -220
- package/dist/packages/@lexical/markdown/MarkdownExport.js.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownImport.d.ts +0 -19
- package/dist/packages/@lexical/markdown/MarkdownImport.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownImport.js +0 -199
- package/dist/packages/@lexical/markdown/MarkdownImport.js.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.d.ts +0 -11
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js +0 -304
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownTransformers.d.ts +0 -173
- package/dist/packages/@lexical/markdown/MarkdownTransformers.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/MarkdownTransformers.js +0 -352
- package/dist/packages/@lexical/markdown/MarkdownTransformers.js.map +0 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.d.ts +0 -22
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js +0 -91
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js.map +0 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.d.ts +0 -21
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js +0 -54
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js.map +0 -1
- package/dist/packages/@lexical/markdown/importTextTransformers.d.ts +0 -18
- package/dist/packages/@lexical/markdown/importTextTransformers.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/importTextTransformers.js +0 -54
- package/dist/packages/@lexical/markdown/importTextTransformers.js.map +0 -1
- package/dist/packages/@lexical/markdown/index.d.ts +0 -29
- package/dist/packages/@lexical/markdown/index.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/index.js +0 -39
- package/dist/packages/@lexical/markdown/index.js.map +0 -1
- package/dist/packages/@lexical/markdown/utils.d.ts +0 -34
- package/dist/packages/@lexical/markdown/utils.d.ts.map +0 -1
- package/dist/packages/@lexical/markdown/utils.js +0 -267
- package/dist/packages/@lexical/markdown/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lexical/plugins/MarkdownShortcut/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lexical/plugins/MarkdownShortcut/index.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAS1C,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { c as _c } from "react/compiler-runtime";
|
|
4
|
+
import { registerMarkdownShortcuts } from '@lexical/markdown';
|
|
4
5
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
5
6
|
import * as React from 'react';
|
|
6
|
-
import { registerMarkdownShortcuts } from '../../../packages/@lexical/markdown/MarkdownShortcuts.js';
|
|
7
7
|
import { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js';
|
|
8
8
|
export const MarkdownShortcutPlugin = () => {
|
|
9
9
|
const $ = _c(4);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","registerMarkdownShortcuts","useLexicalComposerContext","React","useEditorConfigContext","MarkdownShortcutPlugin","$","editorConfig","editor","t0","t1","features","markdownTransformers","useEffect"],"sources":["../../../../src/lexical/plugins/MarkdownShortcut/index.tsx"],"sourcesContent":["'use client'\n\nimport { registerMarkdownShortcuts } from '@lexical/markdown'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport * as React from 'react'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\n\nexport const MarkdownShortcutPlugin: React.FC = () => {\n const { editorConfig } = useEditorConfigContext()\n const [editor] = useLexicalComposerContext()\n\n React.useEffect(() => {\n return registerMarkdownShortcuts(editor, editorConfig.features.markdownTransformers ?? [])\n }, [editor, editorConfig.features.markdownTransformers])\n\n return null\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;AAEA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,yBAAyB,QAAQ;AAC1C,YAAYC,KAAA,MAAW;AAEvB,SAASC,sBAAsB,QAAQ;AAEvC,OAAO,MAAMC,sBAAA,GAAmCA,CAAA;EAAA,MAAAC,CAAA,GAAAN,EAAA;EAC9C;IAAAO;EAAA,IAAyBH,sBAAA;EACzB,OAAAI,MAAA,IAAiBN,yBAAA;EAAA,IAAAO,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAJ,CAAA,QAAAE,MAAA,IAAAF,CAAA,QAAAC,YAAA,CAAAI,QAAA,CAAAC,oBAAA;IAEDH,EAAA,GAAAA,CAAA,KACPR,yBAAA,CAA0BO,MAAA,EAAQD,YAAA,CAAAI,QAAA,CAAAC,oBAAA,MAAgD;IACxFF,EAAA,IAACF,MAAA,EAAQD,YAAA,CAAAI,QAAA,CAAAC,oBAAA;IAA2CN,CAAA,MAAAE,MAAA;IAAAF,CAAA,MAAAC,YAAA,CAAAI,QAAA,CAAAC,oBAAA;IAAAN,CAAA,MAAAG,EAAA;IAAAH,CAAA,MAAAI,EAAA;EAAA;IAAAD,EAAA,GAAAH,CAAA;IAAAI,EAAA,GAAAJ,CAAA;EAAA;EAFvDH,KAAA,CAAAU,SAAA,CAAgBJ,EAEhB,EAAGC,EAAoD;EAAA;AAAA,CAGzD","ignoreList":[]}
|
|
@@ -16,11 +16,7 @@
|
|
|
16
16
|
overflow-y: auto;
|
|
17
17
|
z-index: 10;
|
|
18
18
|
position: absolute;
|
|
19
|
-
box-shadow:
|
|
20
|
-
0 2px 6px 0 rgba(0, 0, 0, 0.12),
|
|
21
|
-
0 10px 16px 0 rgba(0, 0, 0, 0.08),
|
|
22
|
-
0 0 0.5px 0 rgba(0, 0, 0, 0.12),
|
|
23
|
-
0 0 0 1px rgba(0, 0, 0, 0.04);
|
|
19
|
+
box-shadow: var(--elevation-400-menu-panel);
|
|
24
20
|
}
|
|
25
21
|
|
|
26
22
|
.slash-menu-popup__group {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
cursor: grab;
|
|
7
7
|
opacity: 0;
|
|
8
8
|
position: absolute;
|
|
9
|
-
|
|
9
|
+
inset-inline-start: 0;
|
|
10
10
|
top: 0;
|
|
11
11
|
will-change: transform;
|
|
12
12
|
background-color: var(--color-bg);
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
> .editor-scroller
|
|
51
51
|
> .editor {
|
|
52
52
|
> .draggable-block-target-line {
|
|
53
|
-
|
|
53
|
+
inset-inline-start: var(--spacer-5);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
border-radius: var(--radius-small);
|
|
61
61
|
height: var(--spacer-1);
|
|
62
62
|
position: absolute;
|
|
63
|
-
|
|
63
|
+
inset-inline-start: 0;
|
|
64
64
|
top: 0;
|
|
65
65
|
opacity: 0;
|
|
66
66
|
will-change: transform;
|
|
@@ -271,7 +271,7 @@ function useDraggableBlockMenu(editor, anchorElem, isEditable) {
|
|
|
271
271
|
}
|
|
272
272
|
const highlightElem = document.createElement('div');
|
|
273
273
|
highlightElem.className = 'lexical-block-highlighter';
|
|
274
|
-
highlightElem.style.backgroundColor = 'var(--
|
|
274
|
+
highlightElem.style.backgroundColor = 'var(--color-bg-inverse)';
|
|
275
275
|
highlightElem.style.transition = 'opacity 0.5s ease-in-out';
|
|
276
276
|
highlightElem.style.zIndex = '1';
|
|
277
277
|
highlightElem.style.pointerEvents = 'none';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useLexicalComposerContext","eventFiles","$getNearestNodeFromDOMNode","$getNodeByKey","isHTMLElement","React","useEffect","useRef","useState","createPortal","useEditorConfigContext","Point","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","getBoundingClientRectWithoutTransform","setTargetLine","DRAGGABLE_BLOCK_MENU_CLASSNAME","DRAG_DATA_FORMAT","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","setDragImage","dataTransfer","draggableBlockElem","transform","style","setTimeout","hideTargetLine","targetLineElem","lastTargetBlockElem","opacity","marginBottom","marginTop","useDraggableBlockMenu","editor","anchorElem","isEditable","scrollerElem","parentElement","menuRef","targetLineRef","debugHighlightRef","isDraggingBlockRef","highlightTimersRef","setDraggableBlockElem","lastTargetBlock","setLastTargetBlock","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_draggableBlockElem","foundAtIndex","isFoundNodeEmptyParagraph","cache_threshold","horizontalOffset","point","x","y","startIndex","length","useEdgeAsDefault","verbose","document","addEventListener","removeEventListener","current","onDragover","isFileTransfer","targetBlockElem","fuzzy","preventDefault","dropEffect","isBelow","willStayInSamePosition","getBoundingClientRect","width","boundingBox","elem","onDrop","dragData","getData","update","draggedNode","targetNode","height","targetBlockElemHeight","top","targetBlockElemTop","mouseY","window","scrollY","insertAfter","insertBefore","remove","allPrevHighlighters","querySelectorAll","forEach","highlighter","newInsertedElem","getElementByKey","getKey","highlightTimer","newInsertedElemRect","highlightElem","createElement","className","backgroundColor","transition","zIndex","pointerEvents","boxSizing","borderRadius","position","body","appendChild","left","fadeTimer","removeTimer","push","clearTimeout","onDragStart","effectAllowed","nodeKey","node","setData","onDragEnd","_jsxs","Fragment","_jsx","draggable","ref","type","DraggableBlockPlugin","t0","t1","undefined","_editable"],"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\nimport type { DragEvent as ReactDragEvent } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { eventFiles } from '@lexical/rich-text'\nimport { $getNearestNodeFromDOMNode, $getNodeByKey, isHTMLElement } from 'lexical'\nimport * as React from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { Point } from '../../../utils/point.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\nimport './index.css'\nimport { setTargetLine } from './setTargetLine.js'\n\nconst DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu'\nconst DRAG_DATA_FORMAT = 'application/x-lexical-drag-block'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction setDragImage(dataTransfer: DataTransfer, draggableBlockElem: HTMLElement) {\n const { transform } = draggableBlockElem.style\n\n // Remove dragImage borders\n dataTransfer.setDragImage(draggableBlockElem, 0, 0)\n\n setTimeout(() => {\n draggableBlockElem.style.transform = transform\n })\n}\n\nfunction hideTargetLine(\n targetLineElem: HTMLElement | null,\n lastTargetBlockElem: HTMLElement | null,\n) {\n if (targetLineElem) {\n targetLineElem.style.opacity = '0'\n }\n if (lastTargetBlockElem) {\n lastTargetBlockElem.style.opacity = ''\n // Delete marginBottom and marginTop values we set\n lastTargetBlockElem.style.marginBottom = ''\n lastTargetBlockElem.style.marginTop = ''\n //lastTargetBlock.style.border = 'none'\n }\n}\n\nfunction useDraggableBlockMenu(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const targetLineRef = useRef<HTMLDivElement>(null)\n const debugHighlightRef = useRef<HTMLDivElement>(null)\n const isDraggingBlockRef = useRef<boolean>(false)\n const highlightTimersRef = useRef<ReturnType<typeof setTimeout>[]>([])\n const [draggableBlockElem, setDraggableBlockElem] = useState<HTMLElement | null>(null)\n const [lastTargetBlock, setLastTargetBlock] = useState<{\n boundingBox?: DOMRect\n elem: HTMLElement | null\n isBelow: boolean\n } | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -44 : -8\n\n useEffect(() => {\n /**\n * Handles positioning of the drag handle\n */\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n if (distanceFromScrollerElem === -1) {\n setDraggableBlockElem(null)\n return\n }\n\n if (isOnHandleElement(target, DRAGGABLE_BLOCK_MENU_CLASSNAME)) {\n return\n }\n\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _draggableBlockElem,\n foundAtIndex,\n isFoundNodeEmptyParagraph,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n verbose: false,\n })\n\n prevIndex = foundAtIndex\n\n //if (DEBUG && _draggableBlockElem) {\n //targetBlockElem.style.border = '3px solid red'\n // highlightElemOriginalPosition(debugHighlightRef, _draggableBlockElem, anchorElem)\n //}\n\n if (!_draggableBlockElem && !isFoundNodeEmptyParagraph) {\n return\n }\n\n if (draggableBlockElem !== _draggableBlockElem) {\n setDraggableBlockElem(_draggableBlockElem)\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, draggableBlockElem])\n\n useEffect(() => {\n if (menuRef.current) {\n setHandlePosition(\n draggableBlockElem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, draggableBlockElem, blockHandleHorizontalOffset])\n\n useEffect(() => {\n function onDragover(event: DragEvent): boolean {\n if (!isDraggingBlockRef.current) {\n return false\n }\n const [isFileTransfer] = eventFiles(event)\n if (isFileTransfer) {\n return false\n }\n\n const { pageY, target } = event\n if (!isHTMLElement(target)) {\n return false\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n 100,\n 50,\n )\n\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: targetBlockElem,\n foundAtIndex,\n isFoundNodeEmptyParagraph,\n } = getNodeCloseToPoint({\n anchorElem,\n editor,\n fuzzy: true,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: true,\n verbose: true,\n })\n\n prevIndex = foundAtIndex\n\n const targetLineElem = targetLineRef.current\n // targetBlockElem === null shouldn't happen\n if (targetBlockElem === null || targetLineElem === null) {\n return false\n }\n\n // Always prevent default and set dropEffect during drag to maintain the move cursor\n event.preventDefault()\n event.dataTransfer!.dropEffect = 'move'\n\n if (draggableBlockElem !== targetBlockElem) {\n const { isBelow, willStayInSamePosition } = setTargetLine(\n editorConfig?.admin?.hideGutter ? '0px' : 'var(--spacer-5)',\n blockHandleHorizontalOffset +\n (editorConfig?.admin?.hideGutter\n ? (menuRef?.current?.getBoundingClientRect()?.width ?? 0)\n : -(menuRef?.current?.getBoundingClientRect()?.width ?? 0)),\n targetLineElem,\n targetBlockElem,\n lastTargetBlock!,\n pageY,\n anchorElem,\n event,\n debugHighlightRef,\n isFoundNodeEmptyParagraph,\n )\n\n if (!willStayInSamePosition) {\n setLastTargetBlock({\n boundingBox: targetBlockElem.getBoundingClientRect(),\n elem: targetBlockElem,\n isBelow,\n })\n }\n } else if (lastTargetBlock?.elem) {\n hideTargetLine(targetLineElem, lastTargetBlock.elem)\n setLastTargetBlock({\n boundingBox: targetBlockElem.getBoundingClientRect(),\n elem: targetBlockElem,\n isBelow: false,\n })\n }\n\n return true\n }\n\n function onDrop(event: DragEvent): boolean {\n if (!isDraggingBlockRef.current) {\n return false\n }\n const [isFileTransfer] = eventFiles(event)\n if (isFileTransfer) {\n return false\n }\n const { dataTransfer, pageY, target } = event\n const dragData = dataTransfer?.getData(DRAG_DATA_FORMAT) || ''\n\n editor.update(() => {\n const draggedNode = $getNodeByKey(dragData)\n if (!draggedNode) {\n return false\n }\n if (!isHTMLElement(target)) {\n return false\n }\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n 100,\n 50,\n )\n\n const { blockElem: targetBlockElem, isFoundNodeEmptyParagraph } = getNodeCloseToPoint({\n anchorElem,\n editor,\n fuzzy: true,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n useEdgeAsDefault: true,\n })\n\n if (!targetBlockElem) {\n return false\n }\n const targetNode = $getNearestNodeFromDOMNode(targetBlockElem)\n if (!targetNode) {\n return false\n }\n if (targetNode === draggedNode) {\n return true\n }\n\n const { height: targetBlockElemHeight, top: targetBlockElemTop } =\n getBoundingClientRectWithoutTransform(targetBlockElem)\n\n const mouseY = pageY\n const isBelow = mouseY >= targetBlockElemTop + targetBlockElemHeight / 2 + window.scrollY\n\n if (!isFoundNodeEmptyParagraph) {\n if (isBelow) {\n // below targetBlockElem\n targetNode.insertAfter(draggedNode)\n } else {\n // above targetBlockElem\n targetNode.insertBefore(draggedNode)\n }\n } else {\n //\n targetNode.insertBefore(draggedNode)\n targetNode.remove()\n }\n\n /*\n if (pageY >= targetBlockElemTop + targetBlockElemHeight / 2) {\n targetNode.insertAfter(draggedNode)\n } else {\n targetNode.insertBefore(draggedNode)\n }*/\n if (draggableBlockElem !== null) {\n setDraggableBlockElem(null)\n }\n\n // find all previous elements with lexical-block-highlighter class and remove them\n const allPrevHighlighters = document.querySelectorAll('.lexical-block-highlighter')\n allPrevHighlighters.forEach((highlighter) => {\n highlighter.remove()\n })\n\n const newInsertedElem = editor.getElementByKey(draggedNode.getKey())\n const highlightTimer = setTimeout(() => {\n // add new temp html element to newInsertedElem with the same height and width and the class block-selected\n // to highlight the new inserted element\n const newInsertedElemRect = newInsertedElem?.getBoundingClientRect()\n if (!newInsertedElemRect) {\n return\n }\n const highlightElem = document.createElement('div')\n highlightElem.className = 'lexical-block-highlighter'\n\n highlightElem.style.backgroundColor = 'var(--theme-elevation-1000'\n highlightElem.style.transition = 'opacity 0.5s ease-in-out'\n highlightElem.style.zIndex = '1'\n highlightElem.style.pointerEvents = 'none'\n highlightElem.style.boxSizing = 'border-box'\n highlightElem.style.borderRadius = '4px'\n highlightElem.style.position = 'absolute'\n document.body.appendChild(highlightElem)\n\n highlightElem.style.opacity = '0.1'\n\n highlightElem.style.height = `${newInsertedElemRect.height + 8}px`\n highlightElem.style.width = `${newInsertedElemRect.width + 8}px`\n highlightElem.style.top = `${newInsertedElemRect.top + window.scrollY - 4}px`\n highlightElem.style.left = `${newInsertedElemRect.left - 4}px`\n\n const fadeTimer = setTimeout(() => {\n highlightElem.style.opacity = '0'\n const removeTimer = setTimeout(() => {\n highlightElem.remove()\n }, 500)\n highlightTimersRef.current.push(removeTimer)\n }, 1000)\n highlightTimersRef.current.push(fadeTimer)\n }, 120)\n highlightTimersRef.current.push(highlightTimer)\n })\n\n return true\n }\n\n // register onDragover event listeners:\n document.addEventListener('dragover', onDragover)\n // register onDrop event listeners:\n document.addEventListener('drop', onDrop)\n\n return () => {\n document.removeEventListener('dragover', onDragover)\n document.removeEventListener('drop', onDrop)\n highlightTimersRef.current.forEach(clearTimeout)\n highlightTimersRef.current = []\n }\n }, [\n scrollerElem,\n blockHandleHorizontalOffset,\n anchorElem,\n editor,\n lastTargetBlock,\n draggableBlockElem,\n editorConfig?.admin?.hideGutter,\n ])\n\n function onDragStart(event: ReactDragEvent<HTMLButtonElement>): void {\n const dataTransfer = event.dataTransfer\n if (!dataTransfer || !draggableBlockElem) {\n return\n }\n setDragImage(dataTransfer, draggableBlockElem)\n dataTransfer.effectAllowed = 'move'\n let nodeKey = ''\n editor.update(() => {\n const node = $getNearestNodeFromDOMNode(draggableBlockElem)\n if (node) {\n nodeKey = node.getKey()\n }\n })\n isDraggingBlockRef.current = true\n dataTransfer.setData(DRAG_DATA_FORMAT, nodeKey)\n }\n\n function onDragEnd(): void {\n isDraggingBlockRef.current = false\n if (lastTargetBlock?.elem) {\n hideTargetLine(targetLineRef.current, lastTargetBlock?.elem)\n }\n }\n\n return createPortal(\n <React.Fragment>\n <button\n aria-label=\"Drag to move\"\n className=\"icon draggable-block-menu\"\n draggable\n onDragEnd={onDragEnd}\n onDragStart={onDragStart}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n <div className=\"draggable-block-target-line\" ref={targetLineRef} />\n <div className=\"debug-highlight\" ref={debugHighlightRef} />\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function DraggableBlockPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useDraggableBlockMenu(editor, anchorElem, editor._editable)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useLexicalComposerContext","eventFiles","$getNearestNodeFromDOMNode","$getNodeByKey","isHTMLElement","React","useEffect","useRef","useState","createPortal","useEditorConfigContext","Point","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","getBoundingClientRectWithoutTransform","setTargetLine","DRAGGABLE_BLOCK_MENU_CLASSNAME","DRAG_DATA_FORMAT","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","setDragImage","dataTransfer","draggableBlockElem","transform","style","setTimeout","hideTargetLine","targetLineElem","lastTargetBlockElem","opacity","marginBottom","marginTop","useDraggableBlockMenu","editor","anchorElem","isEditable","scrollerElem","parentElement","menuRef","targetLineRef","debugHighlightRef","isDraggingBlockRef","highlightTimersRef","setDraggableBlockElem","lastTargetBlock","setLastTargetBlock","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_draggableBlockElem","foundAtIndex","isFoundNodeEmptyParagraph","cache_threshold","horizontalOffset","point","x","y","startIndex","length","useEdgeAsDefault","verbose","document","addEventListener","removeEventListener","current","onDragover","isFileTransfer","targetBlockElem","fuzzy","preventDefault","dropEffect","isBelow","willStayInSamePosition","getBoundingClientRect","width","boundingBox","elem","onDrop","dragData","getData","update","draggedNode","targetNode","height","targetBlockElemHeight","top","targetBlockElemTop","mouseY","window","scrollY","insertAfter","insertBefore","remove","allPrevHighlighters","querySelectorAll","forEach","highlighter","newInsertedElem","getElementByKey","getKey","highlightTimer","newInsertedElemRect","highlightElem","createElement","className","backgroundColor","transition","zIndex","pointerEvents","boxSizing","borderRadius","position","body","appendChild","left","fadeTimer","removeTimer","push","clearTimeout","onDragStart","effectAllowed","nodeKey","node","setData","onDragEnd","_jsxs","Fragment","_jsx","draggable","ref","type","DraggableBlockPlugin","t0","t1","undefined","_editable"],"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\nimport type { DragEvent as ReactDragEvent } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { eventFiles } from '@lexical/rich-text'\nimport { $getNearestNodeFromDOMNode, $getNodeByKey, isHTMLElement } from 'lexical'\nimport * as React from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { Point } from '../../../utils/point.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport { getBoundingClientRectWithoutTransform } from './getBoundingRectWithoutTransform.js'\nimport './index.css'\nimport { setTargetLine } from './setTargetLine.js'\n\nconst DRAGGABLE_BLOCK_MENU_CLASSNAME = 'draggable-block-menu'\nconst DRAG_DATA_FORMAT = 'application/x-lexical-drag-block'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction setDragImage(dataTransfer: DataTransfer, draggableBlockElem: HTMLElement) {\n const { transform } = draggableBlockElem.style\n\n // Remove dragImage borders\n dataTransfer.setDragImage(draggableBlockElem, 0, 0)\n\n setTimeout(() => {\n draggableBlockElem.style.transform = transform\n })\n}\n\nfunction hideTargetLine(\n targetLineElem: HTMLElement | null,\n lastTargetBlockElem: HTMLElement | null,\n) {\n if (targetLineElem) {\n targetLineElem.style.opacity = '0'\n }\n if (lastTargetBlockElem) {\n lastTargetBlockElem.style.opacity = ''\n // Delete marginBottom and marginTop values we set\n lastTargetBlockElem.style.marginBottom = ''\n lastTargetBlockElem.style.marginTop = ''\n //lastTargetBlock.style.border = 'none'\n }\n}\n\nfunction useDraggableBlockMenu(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const targetLineRef = useRef<HTMLDivElement>(null)\n const debugHighlightRef = useRef<HTMLDivElement>(null)\n const isDraggingBlockRef = useRef<boolean>(false)\n const highlightTimersRef = useRef<ReturnType<typeof setTimeout>[]>([])\n const [draggableBlockElem, setDraggableBlockElem] = useState<HTMLElement | null>(null)\n const [lastTargetBlock, setLastTargetBlock] = useState<{\n boundingBox?: DOMRect\n elem: HTMLElement | null\n isBelow: boolean\n } | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -44 : -8\n\n useEffect(() => {\n /**\n * Handles positioning of the drag handle\n */\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n if (distanceFromScrollerElem === -1) {\n setDraggableBlockElem(null)\n return\n }\n\n if (isOnHandleElement(target, DRAGGABLE_BLOCK_MENU_CLASSNAME)) {\n return\n }\n\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _draggableBlockElem,\n foundAtIndex,\n isFoundNodeEmptyParagraph,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n verbose: false,\n })\n\n prevIndex = foundAtIndex\n\n //if (DEBUG && _draggableBlockElem) {\n //targetBlockElem.style.border = '3px solid red'\n // highlightElemOriginalPosition(debugHighlightRef, _draggableBlockElem, anchorElem)\n //}\n\n if (!_draggableBlockElem && !isFoundNodeEmptyParagraph) {\n return\n }\n\n if (draggableBlockElem !== _draggableBlockElem) {\n setDraggableBlockElem(_draggableBlockElem)\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, draggableBlockElem])\n\n useEffect(() => {\n if (menuRef.current) {\n setHandlePosition(\n draggableBlockElem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, draggableBlockElem, blockHandleHorizontalOffset])\n\n useEffect(() => {\n function onDragover(event: DragEvent): boolean {\n if (!isDraggingBlockRef.current) {\n return false\n }\n const [isFileTransfer] = eventFiles(event)\n if (isFileTransfer) {\n return false\n }\n\n const { pageY, target } = event\n if (!isHTMLElement(target)) {\n return false\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n 100,\n 50,\n )\n\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: targetBlockElem,\n foundAtIndex,\n isFoundNodeEmptyParagraph,\n } = getNodeCloseToPoint({\n anchorElem,\n editor,\n fuzzy: true,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: true,\n verbose: true,\n })\n\n prevIndex = foundAtIndex\n\n const targetLineElem = targetLineRef.current\n // targetBlockElem === null shouldn't happen\n if (targetBlockElem === null || targetLineElem === null) {\n return false\n }\n\n // Always prevent default and set dropEffect during drag to maintain the move cursor\n event.preventDefault()\n event.dataTransfer!.dropEffect = 'move'\n\n if (draggableBlockElem !== targetBlockElem) {\n const { isBelow, willStayInSamePosition } = setTargetLine(\n editorConfig?.admin?.hideGutter ? '0px' : 'var(--spacer-5)',\n blockHandleHorizontalOffset +\n (editorConfig?.admin?.hideGutter\n ? (menuRef?.current?.getBoundingClientRect()?.width ?? 0)\n : -(menuRef?.current?.getBoundingClientRect()?.width ?? 0)),\n targetLineElem,\n targetBlockElem,\n lastTargetBlock!,\n pageY,\n anchorElem,\n event,\n debugHighlightRef,\n isFoundNodeEmptyParagraph,\n )\n\n if (!willStayInSamePosition) {\n setLastTargetBlock({\n boundingBox: targetBlockElem.getBoundingClientRect(),\n elem: targetBlockElem,\n isBelow,\n })\n }\n } else if (lastTargetBlock?.elem) {\n hideTargetLine(targetLineElem, lastTargetBlock.elem)\n setLastTargetBlock({\n boundingBox: targetBlockElem.getBoundingClientRect(),\n elem: targetBlockElem,\n isBelow: false,\n })\n }\n\n return true\n }\n\n function onDrop(event: DragEvent): boolean {\n if (!isDraggingBlockRef.current) {\n return false\n }\n const [isFileTransfer] = eventFiles(event)\n if (isFileTransfer) {\n return false\n }\n const { dataTransfer, pageY, target } = event\n const dragData = dataTransfer?.getData(DRAG_DATA_FORMAT) || ''\n\n editor.update(() => {\n const draggedNode = $getNodeByKey(dragData)\n if (!draggedNode) {\n return false\n }\n if (!isHTMLElement(target)) {\n return false\n }\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n 100,\n 50,\n )\n\n const { blockElem: targetBlockElem, isFoundNodeEmptyParagraph } = getNodeCloseToPoint({\n anchorElem,\n editor,\n fuzzy: true,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n useEdgeAsDefault: true,\n })\n\n if (!targetBlockElem) {\n return false\n }\n const targetNode = $getNearestNodeFromDOMNode(targetBlockElem)\n if (!targetNode) {\n return false\n }\n if (targetNode === draggedNode) {\n return true\n }\n\n const { height: targetBlockElemHeight, top: targetBlockElemTop } =\n getBoundingClientRectWithoutTransform(targetBlockElem)\n\n const mouseY = pageY\n const isBelow = mouseY >= targetBlockElemTop + targetBlockElemHeight / 2 + window.scrollY\n\n if (!isFoundNodeEmptyParagraph) {\n if (isBelow) {\n // below targetBlockElem\n targetNode.insertAfter(draggedNode)\n } else {\n // above targetBlockElem\n targetNode.insertBefore(draggedNode)\n }\n } else {\n //\n targetNode.insertBefore(draggedNode)\n targetNode.remove()\n }\n\n /*\n if (pageY >= targetBlockElemTop + targetBlockElemHeight / 2) {\n targetNode.insertAfter(draggedNode)\n } else {\n targetNode.insertBefore(draggedNode)\n }*/\n if (draggableBlockElem !== null) {\n setDraggableBlockElem(null)\n }\n\n // find all previous elements with lexical-block-highlighter class and remove them\n const allPrevHighlighters = document.querySelectorAll('.lexical-block-highlighter')\n allPrevHighlighters.forEach((highlighter) => {\n highlighter.remove()\n })\n\n const newInsertedElem = editor.getElementByKey(draggedNode.getKey())\n const highlightTimer = setTimeout(() => {\n // add new temp html element to newInsertedElem with the same height and width and the class block-selected\n // to highlight the new inserted element\n const newInsertedElemRect = newInsertedElem?.getBoundingClientRect()\n if (!newInsertedElemRect) {\n return\n }\n const highlightElem = document.createElement('div')\n highlightElem.className = 'lexical-block-highlighter'\n\n highlightElem.style.backgroundColor = 'var(--color-bg-inverse)'\n highlightElem.style.transition = 'opacity 0.5s ease-in-out'\n highlightElem.style.zIndex = '1'\n highlightElem.style.pointerEvents = 'none'\n highlightElem.style.boxSizing = 'border-box'\n highlightElem.style.borderRadius = '4px'\n highlightElem.style.position = 'absolute'\n document.body.appendChild(highlightElem)\n\n highlightElem.style.opacity = '0.1'\n\n highlightElem.style.height = `${newInsertedElemRect.height + 8}px`\n highlightElem.style.width = `${newInsertedElemRect.width + 8}px`\n highlightElem.style.top = `${newInsertedElemRect.top + window.scrollY - 4}px`\n highlightElem.style.left = `${newInsertedElemRect.left - 4}px`\n\n const fadeTimer = setTimeout(() => {\n highlightElem.style.opacity = '0'\n const removeTimer = setTimeout(() => {\n highlightElem.remove()\n }, 500)\n highlightTimersRef.current.push(removeTimer)\n }, 1000)\n highlightTimersRef.current.push(fadeTimer)\n }, 120)\n highlightTimersRef.current.push(highlightTimer)\n })\n\n return true\n }\n\n // register onDragover event listeners:\n document.addEventListener('dragover', onDragover)\n // register onDrop event listeners:\n document.addEventListener('drop', onDrop)\n\n return () => {\n document.removeEventListener('dragover', onDragover)\n document.removeEventListener('drop', onDrop)\n highlightTimersRef.current.forEach(clearTimeout)\n highlightTimersRef.current = []\n }\n }, [\n scrollerElem,\n blockHandleHorizontalOffset,\n anchorElem,\n editor,\n lastTargetBlock,\n draggableBlockElem,\n editorConfig?.admin?.hideGutter,\n ])\n\n function onDragStart(event: ReactDragEvent<HTMLButtonElement>): void {\n const dataTransfer = event.dataTransfer\n if (!dataTransfer || !draggableBlockElem) {\n return\n }\n setDragImage(dataTransfer, draggableBlockElem)\n dataTransfer.effectAllowed = 'move'\n let nodeKey = ''\n editor.update(() => {\n const node = $getNearestNodeFromDOMNode(draggableBlockElem)\n if (node) {\n nodeKey = node.getKey()\n }\n })\n isDraggingBlockRef.current = true\n dataTransfer.setData(DRAG_DATA_FORMAT, nodeKey)\n }\n\n function onDragEnd(): void {\n isDraggingBlockRef.current = false\n if (lastTargetBlock?.elem) {\n hideTargetLine(targetLineRef.current, lastTargetBlock?.elem)\n }\n }\n\n return createPortal(\n <React.Fragment>\n <button\n aria-label=\"Drag to move\"\n className=\"icon draggable-block-menu\"\n draggable\n onDragEnd={onDragEnd}\n onDragStart={onDragStart}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n <div className=\"draggable-block-target-line\" ref={targetLineRef} />\n <div className=\"debug-highlight\" ref={debugHighlightRef} />\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function DraggableBlockPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useDraggableBlockMenu(editor, anchorElem, editor._editable)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -131,8 +131,7 @@
|
|
|
131
131
|
.LexicalEditorTheme__tabNode.LexicalEditorTheme__textUnderline::after {
|
|
132
132
|
content: '';
|
|
133
133
|
position: absolute;
|
|
134
|
-
|
|
135
|
-
right: 0;
|
|
134
|
+
inset-inline: 0;
|
|
136
135
|
bottom: 0.15em;
|
|
137
136
|
border-bottom: 0.1em solid currentColor;
|
|
138
137
|
}
|
|
@@ -140,8 +139,7 @@
|
|
|
140
139
|
.LexicalEditorTheme__tabNode.LexicalEditorTheme__textStrikethrough::before {
|
|
141
140
|
content: '';
|
|
142
141
|
position: absolute;
|
|
143
|
-
|
|
144
|
-
right: 0;
|
|
142
|
+
inset-inline: 0;
|
|
145
143
|
top: 0.69em;
|
|
146
144
|
border-top: 0.1em solid currentColor;
|
|
147
145
|
}
|
|
@@ -150,8 +148,7 @@
|
|
|
150
148
|
.LexicalEditorTheme__tabNode.LexicalEditorTheme__textUnderlineStrikethrough::after {
|
|
151
149
|
content: '';
|
|
152
150
|
position: absolute;
|
|
153
|
-
|
|
154
|
-
right: 0;
|
|
151
|
+
inset-inline: 0;
|
|
155
152
|
}
|
|
156
153
|
|
|
157
154
|
.LexicalEditorTheme__tabNode.LexicalEditorTheme__textUnderlineStrikethrough::before {
|
|
@@ -201,7 +198,7 @@
|
|
|
201
198
|
content: '';
|
|
202
199
|
display: block;
|
|
203
200
|
position: absolute;
|
|
204
|
-
top: -
|
|
201
|
+
top: calc(var(--stroke-width-medium) * -1);
|
|
205
202
|
width: var(--spacer-3);
|
|
206
203
|
border-top: var(--stroke-width-small) solid var(--color-text);
|
|
207
204
|
animation: CursorBlink 1.1s steps(2, start) infinite;
|
|
@@ -263,7 +260,8 @@
|
|
|
263
260
|
.LexicalEditorTheme__listItem {
|
|
264
261
|
font-family: var(--text-body-large-font-family);
|
|
265
262
|
font-size: var(--text-body-large-font-size);
|
|
266
|
-
margin:
|
|
263
|
+
margin-block-end: var(--spacer-3);
|
|
264
|
+
margin-inline-start: var(--spacer-6);
|
|
267
265
|
}
|
|
268
266
|
|
|
269
267
|
.LexicalEditorTheme__listItem[style*='text-align: center'],
|
|
@@ -280,24 +278,25 @@
|
|
|
280
278
|
}
|
|
281
279
|
|
|
282
280
|
.LexicalEditorTheme__listItem[dir='rtl'] {
|
|
283
|
-
margin: 0
|
|
281
|
+
margin-block-end: 0.4em;
|
|
282
|
+
margin-inline-end: var(--spacer-6);
|
|
284
283
|
}
|
|
285
284
|
|
|
286
285
|
.LexicalEditorTheme__listItemChecked,
|
|
287
286
|
.LexicalEditorTheme__listItemUnchecked {
|
|
288
287
|
position: relative;
|
|
289
|
-
padding-
|
|
290
|
-
margin-
|
|
288
|
+
padding-inline-start: var(--spacer-4);
|
|
289
|
+
margin-inline-start: var(--spacer-3);
|
|
291
290
|
list-style-type: none;
|
|
292
291
|
outline: none;
|
|
293
292
|
}
|
|
294
293
|
|
|
295
294
|
.LexicalEditorTheme__listItemUnchecked[dir='rtl'],
|
|
296
295
|
.LexicalEditorTheme__listItemChecked[dir='rtl'] {
|
|
297
|
-
margin-
|
|
298
|
-
padding-
|
|
299
|
-
padding-
|
|
300
|
-
margin-
|
|
296
|
+
margin-inline-start: 0;
|
|
297
|
+
padding-inline-start: 0;
|
|
298
|
+
padding-inline-end: var(--spacer-4);
|
|
299
|
+
margin-inline-end: var(--spacer-3);
|
|
301
300
|
}
|
|
302
301
|
|
|
303
302
|
.LexicalEditorTheme__listItemChecked {
|
|
@@ -310,7 +309,7 @@
|
|
|
310
309
|
width: var(--spacer-3);
|
|
311
310
|
height: var(--spacer-3);
|
|
312
311
|
top: 0;
|
|
313
|
-
|
|
312
|
+
inset-inline-start: 0;
|
|
314
313
|
cursor: pointer;
|
|
315
314
|
display: block;
|
|
316
315
|
position: absolute;
|
|
@@ -320,14 +319,14 @@
|
|
|
320
319
|
|
|
321
320
|
.LexicalEditorTheme__listItemUnchecked[dir='rtl']:before,
|
|
322
321
|
.LexicalEditorTheme__listItemChecked[dir='rtl']:before {
|
|
323
|
-
|
|
324
|
-
|
|
322
|
+
inset-inline-start: auto;
|
|
323
|
+
inset-inline-end: 0;
|
|
325
324
|
}
|
|
326
325
|
|
|
327
326
|
.LexicalEditorTheme__listItemUnchecked:focus:before,
|
|
328
327
|
.LexicalEditorTheme__listItemChecked:focus:before {
|
|
329
328
|
outline: 0;
|
|
330
|
-
box-shadow: 0 0 0
|
|
329
|
+
box-shadow: 0 0 0 var(--stroke-width-medium) var(--color-border-selected);
|
|
331
330
|
}
|
|
332
331
|
|
|
333
332
|
.LexicalEditorTheme__listItemUnchecked:before {
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
outline: 0;
|
|
8
8
|
padding-top: var(--spacer-2);
|
|
9
9
|
padding-bottom: var(--spacer-2);
|
|
10
|
-
padding-
|
|
11
|
-
padding-
|
|
10
|
+
padding-inline-start: 0;
|
|
11
|
+
padding-inline-end: 0;
|
|
12
12
|
|
|
13
13
|
&:focus-visible {
|
|
14
14
|
outline: none !important;
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
> .editor-scroller
|
|
38
38
|
> .editor
|
|
39
39
|
> .ContentEditable__root::before {
|
|
40
|
-
border-
|
|
40
|
+
border-inline-start: var(--stroke-width-medium) solid var(--color-border-danger);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
> .editor-scroller
|
|
48
48
|
> .editor
|
|
49
49
|
> .ContentEditable__root::before {
|
|
50
|
-
border-
|
|
50
|
+
border-inline-start: var(--stroke-width-medium) solid var(--color-border-danger);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
}
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
> .editor-scroller
|
|
73
73
|
> .editor
|
|
74
74
|
> .ContentEditable__root::before {
|
|
75
|
-
border-
|
|
75
|
+
border-inline-start: var(--stroke-width-medium) solid var(--color-border-danger);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Transformer } from '@lexical/markdown';
|
|
2
|
+
import type { ElementNode } from 'lexical';
|
|
3
|
+
/**
|
|
4
|
+
* Payload's markdown import. Wraps `@lexical/markdown`'s `$convertFromMarkdownString`
|
|
5
|
+
* with Payload's `normalizeMarkdown` preprocessing (nested code fences + table-row
|
|
6
|
+
* whitespace handling).
|
|
7
|
+
*
|
|
8
|
+
* TODO: Remove this wrapper and the `normalizeMarkdown` import once
|
|
9
|
+
* https://github.com/facebook/lexical/pull/8734 is merged and we upgrade to a
|
|
10
|
+
* release that includes it. At that point callers can use `@lexical/markdown`'s
|
|
11
|
+
* `$convertFromMarkdownString` directly.
|
|
12
|
+
*
|
|
13
|
+
* @param shouldPreserveNewLines By setting this to true, new lines will be preserved between conversions.
|
|
14
|
+
* @param shouldMergeAdjacentLines By setting this to true, adjacent non empty lines will be merged according to commonmark spec: https://spec.commonmark.org/0.24/#example-177. Not applicable if shouldPreserveNewLines = true.
|
|
15
|
+
*/
|
|
16
|
+
export declare function $convertFromMarkdownString(markdown: string, transformers?: Array<Transformer>, node?: ElementNode, shouldPreserveNewLines?: boolean, shouldMergeAdjacentLines?: boolean): void;
|
|
17
|
+
//# sourceMappingURL=convertFromMarkdownString.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertFromMarkdownString.d.ts","sourceRoot":"","sources":["../../../../src/lexical/utils/markdown/convertFromMarkdownString.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAU1C;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,YAAY,GAAE,KAAK,CAAC,WAAW,CAAgB,EAC/C,IAAI,CAAC,EAAE,WAAW,EAClB,sBAAsB,UAAQ,EAC9B,wBAAwB,UAAQ,GAC/B,IAAI,CASN"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { $convertFromMarkdownString as $convertFromMarkdownStringUpstream,
|
|
2
|
+
// eslint-disable-next-line payload/no-conflicting-lexical-markdown-imports -- this wrapper intentionally uses upstream's default transformer set
|
|
3
|
+
TRANSFORMERS } from '@lexical/markdown';
|
|
4
|
+
import { normalizeMarkdown } from './normalizeMarkdown.js';
|
|
5
|
+
/**
|
|
6
|
+
* Payload's markdown import. Wraps `@lexical/markdown`'s `$convertFromMarkdownString`
|
|
7
|
+
* with Payload's `normalizeMarkdown` preprocessing (nested code fences + table-row
|
|
8
|
+
* whitespace handling).
|
|
9
|
+
*
|
|
10
|
+
* TODO: Remove this wrapper and the `normalizeMarkdown` import once
|
|
11
|
+
* https://github.com/facebook/lexical/pull/8734 is merged and we upgrade to a
|
|
12
|
+
* release that includes it. At that point callers can use `@lexical/markdown`'s
|
|
13
|
+
* `$convertFromMarkdownString` directly.
|
|
14
|
+
*
|
|
15
|
+
* @param shouldPreserveNewLines By setting this to true, new lines will be preserved between conversions.
|
|
16
|
+
* @param shouldMergeAdjacentLines By setting this to true, adjacent non empty lines will be merged according to commonmark spec: https://spec.commonmark.org/0.24/#example-177. Not applicable if shouldPreserveNewLines = true.
|
|
17
|
+
*/
|
|
18
|
+
export function $convertFromMarkdownString(markdown, transformers = TRANSFORMERS, node, shouldPreserveNewLines = false, shouldMergeAdjacentLines = false) {
|
|
19
|
+
if (shouldPreserveNewLines) {
|
|
20
|
+
return $convertFromMarkdownStringUpstream(markdown, transformers, node, true);
|
|
21
|
+
}
|
|
22
|
+
// Passing shouldMergeAdjacentLines = false to upstream stops it from
|
|
23
|
+
// re-normalizing markdown that normalizeMarkdown has already normalized.
|
|
24
|
+
const sanitizedMarkdown = normalizeMarkdown(markdown, shouldMergeAdjacentLines);
|
|
25
|
+
return $convertFromMarkdownStringUpstream(sanitizedMarkdown, transformers, node, false, false);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=convertFromMarkdownString.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertFromMarkdownString.js","names":["$convertFromMarkdownString","$convertFromMarkdownStringUpstream","TRANSFORMERS","normalizeMarkdown","markdown","transformers","node","shouldPreserveNewLines","shouldMergeAdjacentLines","sanitizedMarkdown"],"sources":["../../../../src/lexical/utils/markdown/convertFromMarkdownString.ts"],"sourcesContent":["import type { Transformer } from '@lexical/markdown'\nimport type { ElementNode } from 'lexical'\n\nimport {\n $convertFromMarkdownString as $convertFromMarkdownStringUpstream,\n // eslint-disable-next-line payload/no-conflicting-lexical-markdown-imports -- this wrapper intentionally uses upstream's default transformer set\n TRANSFORMERS,\n} from '@lexical/markdown'\n\nimport { normalizeMarkdown } from './normalizeMarkdown.js'\n\n/**\n * Payload's markdown import. Wraps `@lexical/markdown`'s `$convertFromMarkdownString`\n * with Payload's `normalizeMarkdown` preprocessing (nested code fences + table-row\n * whitespace handling).\n *\n * TODO: Remove this wrapper and the `normalizeMarkdown` import once\n * https://github.com/facebook/lexical/pull/8734 is merged and we upgrade to a\n * release that includes it. At that point callers can use `@lexical/markdown`'s\n * `$convertFromMarkdownString` directly.\n *\n * @param shouldPreserveNewLines By setting this to true, new lines will be preserved between conversions.\n * @param shouldMergeAdjacentLines By setting this to true, adjacent non empty lines will be merged according to commonmark spec: https://spec.commonmark.org/0.24/#example-177. Not applicable if shouldPreserveNewLines = true.\n */\nexport function $convertFromMarkdownString(\n markdown: string,\n transformers: Array<Transformer> = TRANSFORMERS,\n node?: ElementNode,\n shouldPreserveNewLines = false,\n shouldMergeAdjacentLines = false,\n): void {\n if (shouldPreserveNewLines) {\n return $convertFromMarkdownStringUpstream(markdown, transformers, node, true)\n }\n\n // Passing shouldMergeAdjacentLines = false to upstream stops it from\n // re-normalizing markdown that normalizeMarkdown has already normalized.\n const sanitizedMarkdown = normalizeMarkdown(markdown, shouldMergeAdjacentLines)\n return $convertFromMarkdownStringUpstream(sanitizedMarkdown, transformers, node, false, false)\n}\n"],"mappings":"AAGA,SACEA,0BAAA,IAA8BC,kCAAkC;AAEhE;AAAAC,YAAY,QACP;AAEP,SAASC,iBAAiB,QAAQ;AAElC;;;;;;;;;;;;;AAaA,OAAO,SAASH,2BACdI,QAAgB,EAChBC,YAAA,GAAmCH,YAAY,EAC/CI,IAAkB,EAClBC,sBAAA,GAAyB,KAAK,EAC9BC,wBAAA,GAA2B,KAAK;EAEhC,IAAID,sBAAA,EAAwB;IAC1B,OAAON,kCAAA,CAAmCG,QAAA,EAAUC,YAAA,EAAcC,IAAA,EAAM;EAC1E;EAEA;EACA;EACA,MAAMG,iBAAA,GAAoBN,iBAAA,CAAkBC,QAAA,EAAUI,wBAAA;EACtD,OAAOP,kCAAA,CAAmCQ,iBAAA,EAAmBJ,YAAA,EAAcC,IAAA,EAAM,OAAO;AAC1F","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createHeadlessEditor } from '@lexical/headless';
|
|
2
|
+
import { LinkNode } from '@lexical/link';
|
|
3
|
+
import { ListItemNode, ListNode } from '@lexical/list';
|
|
4
|
+
import { $convertToMarkdownString } from '@lexical/markdown';
|
|
5
|
+
import { HeadingNode, QuoteNode } from '@lexical/rich-text';
|
|
6
|
+
import { $getRoot, $isElementNode, $isLineBreakNode } from 'lexical';
|
|
7
|
+
import { describe, expect, it } from 'vitest';
|
|
8
|
+
import { $convertFromMarkdownString } from './convertFromMarkdownString.js';
|
|
9
|
+
function createEditor() {
|
|
10
|
+
return createHeadlessEditor({
|
|
11
|
+
nodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, LinkNode]
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
// Payload's editor imports markdown with shouldMergeAdjacentLines = true, so the
|
|
15
|
+
// specs exercise that path: hard line breaks must survive even when adjacent lines
|
|
16
|
+
// are merged, while soft wraps collapse to a single space.
|
|
17
|
+
function importMarkdown(markdown) {
|
|
18
|
+
const editor = createEditor();
|
|
19
|
+
editor.update(() => $convertFromMarkdownString(markdown, undefined, undefined, false, true), {
|
|
20
|
+
discrete: true
|
|
21
|
+
});
|
|
22
|
+
let result = {
|
|
23
|
+
hasLineBreak: false,
|
|
24
|
+
textContent: ''
|
|
25
|
+
};
|
|
26
|
+
editor.getEditorState().read(() => {
|
|
27
|
+
const firstChild = $getRoot().getFirstChild();
|
|
28
|
+
if (!$isElementNode(firstChild)) {
|
|
29
|
+
throw new Error('Expected an element block');
|
|
30
|
+
}
|
|
31
|
+
result = {
|
|
32
|
+
hasLineBreak: firstChild.getChildren().some(child => $isLineBreakNode(child)),
|
|
33
|
+
textContent: firstChild.getTextContent()
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function roundTrip(markdown) {
|
|
39
|
+
const editor = createEditor();
|
|
40
|
+
editor.update(() => $convertFromMarkdownString(markdown, undefined, undefined, false, true), {
|
|
41
|
+
discrete: true
|
|
42
|
+
});
|
|
43
|
+
let output = '';
|
|
44
|
+
editor.getEditorState().read(() => {
|
|
45
|
+
output = $convertToMarkdownString();
|
|
46
|
+
});
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
describe('markdown hard line break import', () => {
|
|
50
|
+
it('should import a trailing-space hard break as a line break node with the marker stripped', () => {
|
|
51
|
+
const {
|
|
52
|
+
hasLineBreak,
|
|
53
|
+
textContent
|
|
54
|
+
} = importMarkdown(['foo ', 'bar'].join('\n'));
|
|
55
|
+
expect(hasLineBreak).toBe(true);
|
|
56
|
+
expect(textContent).toBe('foo\nbar');
|
|
57
|
+
});
|
|
58
|
+
it('should import a backslash hard break as a line break node with the marker stripped', () => {
|
|
59
|
+
const {
|
|
60
|
+
hasLineBreak,
|
|
61
|
+
textContent
|
|
62
|
+
} = importMarkdown('foo\\\nbar');
|
|
63
|
+
expect(hasLineBreak).toBe(true);
|
|
64
|
+
expect(textContent).toBe('foo\nbar');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('markdown hard line break round trip', () => {
|
|
68
|
+
it('should round trip a trailing-space hard break', () => {
|
|
69
|
+
const md = ['foo ', 'bar'].join('\n');
|
|
70
|
+
expect(roundTrip(md)).toBe(md);
|
|
71
|
+
});
|
|
72
|
+
it('should round trip a backslash hard break', () => {
|
|
73
|
+
const md = 'foo\\\nbar';
|
|
74
|
+
expect(roundTrip(md)).toBe(md);
|
|
75
|
+
});
|
|
76
|
+
it('should not introduce a hard break for a soft wrap', () => {
|
|
77
|
+
expect(roundTrip(['foo', 'bar'].join('\n'))).toBe('foo bar');
|
|
78
|
+
});
|
|
79
|
+
it('should round trip a hard break after formatted text', () => {
|
|
80
|
+
const md = '**foo** \nbar';
|
|
81
|
+
expect(roundTrip(md)).toBe(md);
|
|
82
|
+
});
|
|
83
|
+
it('should round trip a hard break after a link', () => {
|
|
84
|
+
const md = '[foo](https://payloadcms.com) \nbar';
|
|
85
|
+
expect(roundTrip(md)).toBe(md);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=convertFromMarkdownString.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertFromMarkdownString.spec.js","names":["createHeadlessEditor","LinkNode","ListItemNode","ListNode","$convertToMarkdownString","HeadingNode","QuoteNode","$getRoot","$isElementNode","$isLineBreakNode","describe","expect","it","$convertFromMarkdownString","createEditor","nodes","importMarkdown","markdown","editor","update","undefined","discrete","result","hasLineBreak","textContent","getEditorState","read","firstChild","getFirstChild","Error","getChildren","some","child","getTextContent","roundTrip","output","join","toBe","md"],"sources":["../../../../src/lexical/utils/markdown/convertFromMarkdownString.spec.ts"],"sourcesContent":["import { createHeadlessEditor } from '@lexical/headless'\nimport { LinkNode } from '@lexical/link'\nimport { ListItemNode, ListNode } from '@lexical/list'\nimport { $convertToMarkdownString } from '@lexical/markdown'\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text'\nimport { $getRoot, $isElementNode, $isLineBreakNode } from 'lexical'\nimport { describe, expect, it } from 'vitest'\n\nimport { $convertFromMarkdownString } from './convertFromMarkdownString.js'\n\nfunction createEditor() {\n return createHeadlessEditor({\n nodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, LinkNode],\n })\n}\n\n// Payload's editor imports markdown with shouldMergeAdjacentLines = true, so the\n// specs exercise that path: hard line breaks must survive even when adjacent lines\n// are merged, while soft wraps collapse to a single space.\nfunction importMarkdown(markdown: string): { hasLineBreak: boolean; textContent: string } {\n const editor = createEditor()\n editor.update(() => $convertFromMarkdownString(markdown, undefined, undefined, false, true), {\n discrete: true,\n })\n let result = { hasLineBreak: false, textContent: '' }\n editor.getEditorState().read(() => {\n const firstChild = $getRoot().getFirstChild()\n if (!$isElementNode(firstChild)) {\n throw new Error('Expected an element block')\n }\n result = {\n hasLineBreak: firstChild.getChildren().some((child) => $isLineBreakNode(child)),\n textContent: firstChild.getTextContent(),\n }\n })\n return result\n}\n\nfunction roundTrip(markdown: string): string {\n const editor = createEditor()\n editor.update(() => $convertFromMarkdownString(markdown, undefined, undefined, false, true), {\n discrete: true,\n })\n let output = ''\n editor.getEditorState().read(() => {\n output = $convertToMarkdownString()\n })\n return output\n}\n\ndescribe('markdown hard line break import', () => {\n it('should import a trailing-space hard break as a line break node with the marker stripped', () => {\n const { hasLineBreak, textContent } = importMarkdown(['foo ', 'bar'].join('\\n'))\n\n expect(hasLineBreak).toBe(true)\n expect(textContent).toBe('foo\\nbar')\n })\n\n it('should import a backslash hard break as a line break node with the marker stripped', () => {\n const { hasLineBreak, textContent } = importMarkdown('foo\\\\\\nbar')\n\n expect(hasLineBreak).toBe(true)\n expect(textContent).toBe('foo\\nbar')\n })\n})\n\ndescribe('markdown hard line break round trip', () => {\n it('should round trip a trailing-space hard break', () => {\n const md = ['foo ', 'bar'].join('\\n')\n expect(roundTrip(md)).toBe(md)\n })\n\n it('should round trip a backslash hard break', () => {\n const md = 'foo\\\\\\nbar'\n expect(roundTrip(md)).toBe(md)\n })\n\n it('should not introduce a hard break for a soft wrap', () => {\n expect(roundTrip(['foo', 'bar'].join('\\n'))).toBe('foo bar')\n })\n\n it('should round trip a hard break after formatted text', () => {\n const md = '**foo** \\nbar'\n expect(roundTrip(md)).toBe(md)\n })\n\n it('should round trip a hard break after a link', () => {\n const md = '[foo](https://payloadcms.com) \\nbar'\n expect(roundTrip(md)).toBe(md)\n })\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
+
import type { ElementTransformer } from '@lexical/markdown';
|
|
1
2
|
import type { ElementNode } from 'lexical';
|
|
2
|
-
import type { ElementTransformer } from '../../../packages/@lexical/markdown/MarkdownTransformers.js';
|
|
3
3
|
export declare const createBlockNode: (createNode: (match: Array<string>) => ElementNode) => ElementTransformer["replace"];
|
|
4
4
|
//# sourceMappingURL=createBlockNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBlockNode.d.ts","sourceRoot":"","sources":["../../../../src/lexical/utils/markdown/createBlockNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"createBlockNode.d.ts","sourceRoot":"","sources":["../../../../src/lexical/utils/markdown/createBlockNode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,eAAe,GAC1B,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,WAAW,KAChD,kBAAkB,CAAC,SAAS,CAS9B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBlockNode.js","names":["createBlockNode","createNode","parentNode","children","match","node","append","replace","select"],"sources":["../../../../src/lexical/utils/markdown/createBlockNode.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"file":"createBlockNode.js","names":["createBlockNode","createNode","parentNode","children","match","node","append","replace","select"],"sources":["../../../../src/lexical/utils/markdown/createBlockNode.ts"],"sourcesContent":["import type { ElementTransformer } from '@lexical/markdown'\nimport type { ElementNode } from 'lexical'\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"],"mappings":"AAGA,OAAO,MAAMA,eAAA,GACXC,UAAA;EAEA,OAAO,CAACC,UAAA,EAAYC,QAAA,EAAUC,KAAA;IAC5B,MAAMC,IAAA,GAAOJ,UAAA,CAAWG,KAAA;IACxB,IAAIC,IAAA,EAAM;MACRA,IAAA,CAAKC,MAAM,IAAIH,QAAA;MACfD,UAAA,CAAWK,OAAO,CAACF,IAAA;MACnBA,IAAA,CAAKG,MAAM,CAAC,GAAG;IACjB;EACF;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload-specific markdown normalization, run by `$convertFromMarkdownString`
|
|
3
|
+
* before delegating the import to `@lexical/markdown`. Handles nested code
|
|
4
|
+
* fences and preserves table-row whitespace.
|
|
5
|
+
*
|
|
6
|
+
* TODO: Remove this file once https://github.com/facebook/lexical/pull/8734 is
|
|
7
|
+
* merged and we upgrade to a release that includes it. That PR fixes the nested
|
|
8
|
+
* code fence handling upstream, so `$convertFromMarkdownString` can call
|
|
9
|
+
* `@lexical/markdown` directly instead of pre-normalizing here.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Represents a CommonMark hard line break marker: either a trailing backslash
|
|
13
|
+
* or two-or-more trailing spaces.
|
|
14
|
+
*
|
|
15
|
+
* See https://spec.commonmark.org/0.31.2/#hard-line-breaks
|
|
16
|
+
*/
|
|
17
|
+
export type MarkdownHardLineBreak = string;
|
|
18
|
+
/**
|
|
19
|
+
* Detects a CommonMark hard line break marker at the end of a raw line.
|
|
20
|
+
*
|
|
21
|
+
* @returns a tuple of `[textWithoutMarker, marker]` when a marker is found, otherwise null.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseMarkdownHardLineBreak(line: string): [string, MarkdownHardLineBreak] | null;
|
|
24
|
+
export declare function normalizeMarkdown(input: string, shouldMergeAdjacentLines: boolean): string;
|
|
25
|
+
//# sourceMappingURL=normalizeMarkdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeMarkdown.d.ts","sourceRoot":"","sources":["../../../../src/lexical/utils/markdown/normalizeMarkdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAE1C;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,IAAI,CAO/F;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,OAAO,GAAG,MAAM,CAgF1F"}
|