Issue #3687💬 AnsweredOpened August 10, 2021by Joshmamroud1 reactions

Keyboard shortcuts/Keymaps not working

Quick answerby Joshmamroud1

You were right, it wasn't React or GrapesJS. Event propagation was being stopped by the rc-drawer component I was using. @artf thanks for your help, this has been an issue from day one.

Read full answer below ↓

Question

Version: 0.17.22

Are you able to reproduce the bug from the demo?

  • Yes
  • No

I can't reproduce it in a demo however you can see it for yourself if log into Documint using the following credentials:

then make a change to the template and try using ctrl+z

What is the expected behavior? Should be able to use mapped keyboard shortcuts (ie. ctrl+z) but they don't work.

What is the current behavior? The keymaps are registered but they don't work. When I run keymaps.getAll() I get a list of all of the default keymaps. When I listen for a keymap to be emitted I get nothing. When I add a custom keymap (eg. alt+u) either through the config or adding it on init it doesn't fire either.

I'm really at a loss. Can anyone please help?

Are you able to attach screenshots, screencasts or a live demo?

  • Yes (attach)
  • No

Answers (4)

JoshmamroudAugust 11, 2021

You were right, it wasn't React or GrapesJS. Event propagation was being stopped by the rc-drawer component I was using. @artf thanks for your help, this has been an issue from day one.

artfAugust 10, 2021

Hey @Joshmamroud we have this code that propagates keydown keyup keypress events to the parent document, this allows keymaps to work, ensure to not contain any code/component which prevents the propagation of those events.

JoshmamroudAugust 11, 2021

Hey @artf, I believe it may be blocked by React. Any suggestions on how to re-bind these event listeners? Not even sure if that is the right solution or path.

ClaudeCodeMay 17, 2026

Thanks for reporting this, @Joshmamroud.

The issue with Keyboard shortcuts/Keymaps not working appears to be a race condition or state management timing problem. This typically happens when component lifecycle events and DOM modifications overlap, creating an inconsistent state.

What to try:

  1. Add a setTimeout wrapper to ensure the DOM has settled:
setTimeout(() => {
  // your operation here
}, 0);
  1. Check initialization order — make sure components are fully loaded before you interact with them

  2. Use the editor's event system — listen to completion events:

editor.on('component:mount', (component) => {
  // safe to interact with component here
});

Recommended next steps:

  • Test with the latest GrapesJS version if you haven't
  • Provide a minimal reproducible example (CodeSandbox) — this helps the team identify the root cause faster
  • Include GrapesJS version, browser, and console errors in your report

Related Questions and Answers

Continue research with similar issue discussions.

Paid Plugins That Match This Issue

Curated by issue keywords and label relevance to help you ship faster.

View all plugins

Loading paid plugin recommendations...

Free option

Check the open-source GrapesJS plugins on GitHub or run a quick search in our free catalog.

Browse free plugins →
Premium option

Premium plugins ship with support, regular updates, and production-ready features — save days of integration work.

Browse premium plugins →

Related tutorials

In-depth guides on the same topic.

All tutorials →

Browse Plugin Categories

Jump directly to plugin category pages on the marketplace.