diff --git a/packages/lexical-playground/__tests__/e2e/CodeActionMenu.spec.mjs b/packages/lexical-playground/__tests__/e2e/CodeActionMenu.spec.mjs index 926e842da5e..cc67bb9eb22 100644 --- a/packages/lexical-playground/__tests__/e2e/CodeActionMenu.spec.mjs +++ b/packages/lexical-playground/__tests__/e2e/CodeActionMenu.spec.mjs @@ -195,6 +195,7 @@ test.describe('CodeActionMenu', () => { await assertHTML( page, ` +
{
'Hello World'
+ {
+ {
'Hello World'
+ {
;
+ alert(1);
+ {
;
+ {
meh
+ {
from users
+ {
users
+ {
;
+ {
;
+ {
}
+ {
}
+ {
}
+ {
}
+ {
;
+ {
;
+ {
;
+ {
// end
+ {
c d
+ {
data-lexical-text="true">
let d = 4;
+ {
+
{
code
+
diff --git a/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs b/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs
index 1320f0d655d..ee93eb099e4 100644
--- a/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs
+++ b/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs
@@ -106,7 +106,7 @@ test.describe.parallel('Markdown', () => {
},
{
expectation:
- '
',
+ '
',
importExpectation: '',
isBlockTest: true,
markdownImport: '',
diff --git a/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs b/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
index a0513a361f7..06bf48b492a 100644
--- a/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
+++ b/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
@@ -156,6 +156,7 @@ test.describe.parallel('Selection', () => {
Line1
+
{
data-language="javascript">
Line2
+
`,
);
});
diff --git a/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs b/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs
index 200fd9a0652..79deeb8de73 100644
--- a/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs
+++ b/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs
@@ -101,6 +101,7 @@ test.describe('Tab', () => {
await assertHTML(
page,
html`
+
{
function
+
`,
);
});
diff --git a/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs b/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs
index 3622c1af932..7a02631ceb4 100644
--- a/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs
+++ b/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs
@@ -44,6 +44,7 @@ test.describe('Regression test #1384', () => {
await assertHTML(
page,
html`
+
{
;
+
`,
);
});
diff --git a/packages/lexical-playground/src/Editor.tsx b/packages/lexical-playground/src/Editor.tsx
index 1284efb2da1..148b93ae809 100644
--- a/packages/lexical-playground/src/Editor.tsx
+++ b/packages/lexical-playground/src/Editor.tsx
@@ -46,6 +46,7 @@ import AutoLinkPlugin from './plugins/AutoLinkPlugin';
import CodeActionMenuPlugin from './plugins/CodeActionMenuPlugin';
import CodeHighlightPrismPlugin from './plugins/CodeHighlightPrismPlugin';
import CodeHighlightShikiPlugin from './plugins/CodeHighlightShikiPlugin';
+import CodePlugin from './plugins/CodePlugin';
import CollapsiblePlugin from './plugins/CollapsiblePlugin';
import CommentPlugin from './plugins/CommentPlugin';
import ComponentPickerPlugin from './plugins/ComponentPickerPlugin';
@@ -197,6 +198,7 @@ export default function Editor(): JSX.Element {
)}
{isRichText ? (
<>
+
{isCollab ? (
useCollabV2 ? (
<>
diff --git a/packages/lexical-playground/src/plugins/CodePlugin/index.tsx b/packages/lexical-playground/src/plugins/CodePlugin/index.tsx
new file mode 100644
index 00000000000..5280756c918
--- /dev/null
+++ b/packages/lexical-playground/src/plugins/CodePlugin/index.tsx
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+import {CodeNode} from '@lexical/code';
+import {useLexicalComposerContext} from '@lexical/react/LexicalComposerContext';
+import {$createParagraphNode, $getRoot} from 'lexical';
+import {useEffect} from 'react';
+
+export default function CodePlugin(): null {
+ const [editor] = useLexicalComposerContext();
+
+ useEffect(() => {
+ if (!editor.hasNodes([CodeNode])) {
+ return;
+ }
+
+ return editor.registerNodeTransform(CodeNode, (codeNode) => {
+ // Skip if not a direct child of root
+ if (codeNode.getParent() !== $getRoot()) {
+ return codeNode;
+ }
+
+ // Skip if this is markdown mode (single CodeNode with language 'markdown')
+ if (codeNode.getLanguage() === 'markdown') {
+ const root = $getRoot();
+ const children = root.getChildren();
+ if (children.length === 1) {
+ return codeNode;
+ }
+ }
+
+ // Ensure there is a paragraph node after the code node
+ if (!codeNode.getNextSibling()) {
+ codeNode.insertAfter($createParagraphNode());
+ }
+
+ // Ensure there is a paragraph node before the code node
+ if (!codeNode.getPreviousSibling()) {
+ codeNode.insertBefore($createParagraphNode());
+ }
+
+ return codeNode;
+ });
+ }, [editor]);
+
+ return null;
+}