diff --git a/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs b/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
index 893055dbd67..5bf1bd33f44 100644
--- a/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
+++ b/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs
@@ -11,6 +11,7 @@ import {
moveToLineBeginning,
moveToPrevWord,
pressShiftEnter,
+ selectAll,
} from '../keyboardShortcuts/index.mjs';
import {
assertHTML,
@@ -264,4 +265,20 @@ test.describe('Selection', () => {
`,
);
});
+
+ test('Can select all with node selection', async ({page, isPlainText}) => {
+ test.skip(isPlainText);
+ await focusEditor(page);
+ await page.keyboard.type('Text before');
+ await insertSampleImage(page);
+ await page.keyboard.type('Text after');
+ await selectAll(page);
+ await page.keyboard.press('Delete');
+ await assertHTML(
+ page,
+ html`
+
+ `,
+ );
+ });
});
diff --git a/packages/lexical/src/LexicalEvents.ts b/packages/lexical/src/LexicalEvents.ts
index 534b89504a3..c75379e15f2 100644
--- a/packages/lexical/src/LexicalEvents.ts
+++ b/packages/lexical/src/LexicalEvents.ts
@@ -116,6 +116,7 @@ import {
isOpenLineBreak,
isParagraph,
isRedo,
+ isSelectAll,
isSelectionWithinEditor,
isSpace,
isTab,
@@ -180,6 +181,7 @@ let collapsedSelectionFormat: [number, string, number, NodeKey, number] = [
// work as intended between different browsers and across word, line and character
// boundary/formats. It also is important for text replacement, node schemas and
// composition mechanics.
+
function $shouldPreventDefaultAndInsertText(
selection: RangeSelection,
domTargetRange: null | StaticRange,
@@ -977,6 +979,12 @@ function onKeyDown(event: KeyboardEvent, editor: LexicalEditor): void {
} else if (isCut(keyCode, shiftKey, metaKey, ctrlKey)) {
event.preventDefault();
dispatchCommand(editor, CUT_COMMAND, event);
+ } else if (isSelectAll(keyCode, metaKey, ctrlKey)) {
+ event.preventDefault();
+ editor.update(() => {
+ const root = $getRoot();
+ root.select(0, root.getChildrenSize());
+ });
}
}
}
diff --git a/packages/lexical/src/LexicalUtils.ts b/packages/lexical/src/LexicalUtils.ts
index ac87685482a..1dd38d15e7d 100644
--- a/packages/lexical/src/LexicalUtils.ts
+++ b/packages/lexical/src/LexicalUtils.ts
@@ -1031,6 +1031,14 @@ export function isDelete(keyCode: number): boolean {
return keyCode === 46;
}
+export function isSelectAll(
+ keyCode: number,
+ metaKey: boolean,
+ ctrlKey: boolean,
+): boolean {
+ return keyCode === 65 && controlOrMeta(metaKey, ctrlKey);
+}
+
export function getCachedClassNameArray(
classNamesTheme: EditorThemeClasses,
classNameThemeType: string,