From f29c06cfd3d698a105ae005be24dfd96cdd118be Mon Sep 17 00:00:00 2001 From: Achal Jhawar <35405812+achaljhawar@users.noreply.github.com> Date: Fri, 20 Feb 2026 05:23:43 +1100 Subject: [PATCH] [lexical-playground] Bug Fix: Code block formatting in unintended adjacent lines (#8149) --- .../__tests__/e2e/CodeBlock.spec.mjs | 52 ++++++++++++++ .../src/plugins/ToolbarPlugin/utils.ts | 70 +++++++++++++++++++ 2 files changed, 122 insertions(+) diff --git a/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs b/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs index 150f5cbc43e..e5e8240f08c 100644 --- a/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs +++ b/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs @@ -11,6 +11,7 @@ import { moveToEditorBeginning, moveToEnd, moveToStart, + pressShiftEnter, selectAll, selectCharacters, } from '../keyboardShortcuts/index.mjs'; @@ -296,6 +297,57 @@ test.describe('CodeBlock', () => { ); }); + test('Can select a line within line breaks and convert to code block', async ({ + page, + isPlainText, + }) => { + test.skip(isPlainText); + await focusEditor(page); + await page.keyboard.type('aaa'); + await pressShiftEnter(page); + await page.keyboard.type('bbb'); + await pressShiftEnter(page); + await page.keyboard.type('ccc'); + await moveLeft(page, 4); + await selectCharacters(page, 'left', 3); + + await assertHTML( + page, + html` +
+ aaa
+
+ bbb
+
+ ccc
+
+ aaa +
+
+ bbb
+
+ + ccc +
+ `, + ); + }); + test('Can switch highlighting language in a toolbar', async ({ page, isRichText, diff --git a/packages/lexical-playground/src/plugins/ToolbarPlugin/utils.ts b/packages/lexical-playground/src/plugins/ToolbarPlugin/utils.ts index 7fd7b173733..05878e260b5 100644 --- a/packages/lexical-playground/src/plugins/ToolbarPlugin/utils.ts +++ b/packages/lexical-playground/src/plugins/ToolbarPlugin/utils.ts @@ -25,10 +25,19 @@ import {$getNearestBlockElementAncestorOrThrow} from '@lexical/utils'; import { $addUpdateTag, $createParagraphNode, + $createRangeSelection, $getSelection, + $isElementNode, + $isLineBreakNode, + $isParagraphNode, $isRangeSelection, $isTextNode, + $setSelection, + $splitNode, + ElementNode, LexicalEditor, + LexicalNode, + RangeSelection, SKIP_DOM_SELECTION_TAG, SKIP_SELECTION_FOCUS_TAG, } from 'lexical'; @@ -236,6 +245,62 @@ export const formatQuote = (editor: LexicalEditor, blockType: string) => { } }; +function $splitParagraphsByLineBreaks(selection: RangeSelection): void { + const blocks: Set