Theme keys treat a code editor as typing
Monaco is neither a textarea nor contenteditable — its modern input surface is a plain div the EditContext API writes into — so the tagName guard missed it and ctrl+shift+arrow cycled the theme while somebody was selecting words in a file. `.monaco-editor` is the class its root always carries. This belongs here rather than in the editor: capture runs window inward, so a global shortcut registered on window cannot be stopped from a node deeper in the tree. A handler that guards on "am I typing" is the only place that can answer it.
This commit is contained in:
@@ -149,7 +149,20 @@ export function useThemeKeys(options: ThemeKeysOptions = {}) {
|
|||||||
would be indefensible.
|
would be indefensible.
|
||||||
*/
|
*/
|
||||||
const target = event.target as HTMLElement | null;
|
const target = event.target as HTMLElement | null;
|
||||||
const typing = Boolean(target && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName)));
|
/*
|
||||||
|
A CODE EDITOR is typing too, and it does not look like it.
|
||||||
|
|
||||||
|
Monaco's modern input surface is neither a textarea nor contenteditable — it is a plain div the
|
||||||
|
EditContext API writes into — so a tagName test misses it entirely and `ctrl+shift+←/→` cycled
|
||||||
|
the theme while somebody was selecting words in a file. `.monaco-editor` is the class its root
|
||||||
|
always carries; `closest` because the event lands on whatever is inside it.
|
||||||
|
*/
|
||||||
|
const typing = Boolean(
|
||||||
|
target &&
|
||||||
|
(target.isContentEditable ||
|
||||||
|
/^(input|textarea|select)$/i.test(target.tagName) ||
|
||||||
|
target.closest?.('.monaco-editor, [data-typing]')),
|
||||||
|
);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Star or unstar the CURRENT theme, from anywhere, list open or not.
|
Star or unstar the CURRENT theme, from anywhere, list open or not.
|
||||||
|
|||||||
Reference in New Issue
Block a user