From 9a59cd29e403469c0ba58cd170afe5b470739e69 Mon Sep 17 00:00:00 2001 From: mirivlad Date: Tue, 30 Jun 2026 22:42:42 +0800 Subject: [PATCH] Keep search input focused while typing --- plugins/search/frontend/src/index.js | 30 +++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/plugins/search/frontend/src/index.js b/plugins/search/frontend/src/index.js index bb36557..8303fe0 100644 --- a/plugins/search/frontend/src/index.js +++ b/plugins/search/frontend/src/index.js @@ -287,13 +287,18 @@ var index = null; var cleanupFns = []; var indexRefresh = Promise.resolve(); + var input = null; + var button = null; + var statusEl = null; + var resultsEl = null; - function render() { + function ensureLayout() { + if (input) return; containerEl.innerHTML = ''; containerEl.className = 'search-root'; containerEl.setAttribute('data-plugin-id', 'verstak.search'); - var input = el('input', { + input = el('input', { className: 'search-input', type: 'search', placeholder: 'Search files, folders, text', @@ -304,10 +309,8 @@ scheduleSearch(); } }); - var button = el('button', { + button = el('button', { className: 'search-btn', - textContent: state.searching ? 'Searching...' : 'Search', - disabled: state.searching ? 'disabled' : null, 'data-search-action': 'run', onClick: search }); @@ -317,9 +320,22 @@ el('span', { className: 'search-scope', title: rootPath || 'Vault' }, [rootPath || 'Vault']) ])); - containerEl.appendChild(el('div', { className: 'search-status' + (state.error ? ' error' : '') }, [state.error || state.status])); - var resultsEl = el('div', { className: 'search-results' }); + statusEl = el('div', { className: 'search-status' }); + containerEl.appendChild(statusEl); + resultsEl = el('div', { className: 'search-results' }); containerEl.appendChild(resultsEl); + } + + function render() { + ensureLayout(); + if (document.activeElement !== input && input.value !== state.query) { + input.value = state.query; + } + button.textContent = state.searching ? 'Searching...' : 'Search'; + button.disabled = !!state.searching; + statusEl.className = 'search-status' + (state.error ? ' error' : ''); + statusEl.textContent = state.error || state.status; + resultsEl.innerHTML = ''; if (!state.results.length) { resultsEl.appendChild(el('div', { className: 'search-empty' }, [state.searching ? 'Searching...' : 'No results'])); return;