fix(editor): keep slash menu alive on text input when no_result (#14141)

**Problem**
Slash menu can be prematurely aborted when the query is still in
`no_result`
due to async query updates after deletion.

**Solution**
Keep the slash menu alive on text input while in `no_result`,
preventing aborts based on a stale query state.

**Repro**
1. Type `/eeee`
2. Delete to `/`
3. Type `h`
4. Slash menu should recover and show results


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Enhanced slash-menu keyboard interaction: users can now continue
typing to refine queries when no results are displayed, instead of the
menu closing unexpectedly. Keyboard navigation and other controls remain
responsive.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: DarkSky <25152247+darkskygit@users.noreply.github.com>
This commit is contained in:
likljn
2026-01-07 11:13:13 +09:00
committed by GitHub
parent b8e597fa1d
commit c1d43b9b18

View File

@@ -46,6 +46,22 @@ import {
parseGroup, parseGroup,
slashItemClassName, slashItemClassName,
} from './utils.js'; } from './utils.js';
const isTextInputKey = (e: KeyboardEvent) => {
// Keys combined with modifiers are not considered text input
if (e.ctrlKey || e.metaKey || e.altKey) return false;
// During IME composition, do not treat keydown as text input.
// Query updates are handled by input/composition hooks.
if (e.isComposing) return false;
// Only allow single-character keys as text input
if (e.key.length !== 1) return false;
// Keep existing behavior: space closes the slash menu
if (e.key === ' ') return false;
return true;
};
type InnerSlashMenuContext = SlashMenuContext & { type InnerSlashMenuContext = SlashMenuContext & {
onClickItem: (item: SlashMenuActionItem) => void; onClickItem: (item: SlashMenuActionItem) => void;
searching: boolean; searching: boolean;
@@ -228,10 +244,12 @@ export class SlashMenu extends WithDisposable(LitElement) {
} }
if (key !== 'Backspace' && this._queryState === 'no_result') { if (key !== 'Backspace' && this._queryState === 'no_result') {
// if the following key is not the backspace key, if (isTextInputKey(event)) {
// the slash menu will be closed // allow typing to change query; don't abort here
this.abortController.abort(); } else {
return; this.abortController.abort();
return;
}
} }
if (key === 'Escape') { if (key === 'Escape') {